home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCRAMCPP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-07  |  1.9 KB  |  75 lines

  1. /*
  2.     pcramcpp.c
  3.  
  4.     % Pixmap copy function, extracted from pcramcpy.c
  5.  
  6.     10/19/88  by Ted.
  7.  
  8.     OWL-PC 1.2
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      7/14/89 ted    Installed pcdata-> ilmask, ilsize, vbincr.
  15.  
  16.      3/28/90 jmd    ansi-fied
  17.      6/06/90 ted    Added planemask arg to ram_copy stuff for EVGA plane drawing.
  18. */
  19.  
  20. #include "pcpriv.h"
  21.  
  22. /* -------------------------------------------------------------------------- */
  23.  
  24. void DIGPRIV ram_copypm(opbox *scrboxp, pmap_type pmap, opcoord pmx, opcoord pmy, ramcopy_fptr copy, unsigned planemask)
  25. /*
  26.     Does actual copying between pixmap and display, assuming all clipping is
  27.     taken care of.
  28. */
  29. {    
  30.     unsigned short bwidth, pmbwidth, pmoffs, vidpos;
  31.     byte *pmpos;
  32.  
  33.     bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
  34.  
  35.     pmbwidth = pcpmap_bytewidth(pmap);
  36.     pmoffs = pmy * pmbwidth + (pmx * pcpmap_pixbits(pmap) / 8);
  37.  
  38.     vidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
  39.                 (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
  40.                 scrboxp->xmin * pc_pixbits() / 8;
  41.  
  42.     if (pc_nplanes() == 1) {
  43.         pmpos = pcpmap_pixbuf(pmap) + pmoffs;
  44.         for (;;) {
  45.             (*copy)(pc_vidseg(), vidpos, pmpos, bwidth);
  46.  
  47.             if (opbox_GetHeight(scrboxp) <= 1) {
  48.                 break;
  49.             }
  50.             scrboxp->ymin += 1;
  51.             pmpos += pmbwidth;
  52.  
  53.             vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
  54.                                                                 pcdata->ilsize;
  55.         }
  56.     }
  57.     else {
  58.         for (;;) {
  59.             (*((ramplanecopy_fptr) copy))(pc_vidseg(), vidpos,
  60.                         pcpmap_pixbuf(pmap), bwidth, pmoffs, planemask);
  61.  
  62.             if (opbox_GetHeight(scrboxp) <= 1) {
  63.                 break;
  64.             }
  65.             scrboxp->ymin += 1;
  66.             pmoffs += pmbwidth;
  67.  
  68.             vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
  69.                                                                 pcdata->ilsize;
  70.         }
  71.     }
  72. }
  73. /* -------------------------------------------------------------------------- */
  74.  
  75.