home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCRAMCPP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-06  |  1.8 KB  |  76 lines

  1. /*
  2.     pcramcpp.c
  3.  
  4.     % Pixmap copy function, extracted from pcramcpy.c
  5.  
  6.     10/19/88  by Ted.
  7.  
  8.     OWL 1.1
  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.  
  17. #include "pcpriv.h"
  18.  
  19. /* -------------------------------------------------------------------------- */
  20.  
  21. void DIGPRIV ram_copypm(scrboxp, pmap, pmx, pmy, copy)
  22.     opbox *scrboxp;
  23.     pmap_type pmap;
  24.     opcoord pmx, pmy;
  25.     ramcopy_fptr copy;
  26. /*
  27.     Does actual copying between pixmap and display, assuming all clipping is
  28.     taken care of.
  29. */
  30. {    
  31.     unsigned short bwidth, pmbwidth, pmoffs, vidpos;
  32.     byte *pmpos;
  33.  
  34.     bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
  35.  
  36.     pmbwidth = pcpmap_bytewidth(pmap);
  37.     pmoffs = pmy * pmbwidth + (pmx * pcpmap_pixbits(pmap) / 8);
  38.  
  39.     vidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
  40.                 (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
  41.                 scrboxp->xmin * pc_pixbits() / 8;
  42.  
  43.     if (pc_nplanes() == 1) {
  44.         pmpos = pcpmap_pixbuf(pmap) + pmoffs;
  45.         for (;;) {
  46.             (*copy)(pc_vidseg(), vidpos, pmpos, bwidth);
  47.  
  48.             if (opbox_GetHeight(scrboxp) <= 1) {
  49.                 break;
  50.             }
  51.             scrboxp->ymin += 1;
  52.             pmpos += pmbwidth;
  53.  
  54.             vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
  55.                                                                 pcdata->ilsize;
  56.         }
  57.     }
  58.     else {
  59.         for (;;) {
  60.             (*((ramplanecopy_fptr) copy))
  61.                 (pc_vidseg(), vidpos, pcpmap_pixbuf(pmap), bwidth, pmoffs);
  62.  
  63.             if (opbox_GetHeight(scrboxp) <= 1) {
  64.                 break;
  65.             }
  66.             scrboxp->ymin += 1;
  67.             pmoffs += pmbwidth;
  68.  
  69.             vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
  70.                                                                 pcdata->ilsize;
  71.         }
  72.     }
  73. }
  74. /* -------------------------------------------------------------------------- */
  75.  
  76.