home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCRAMCLE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-10-31  |  6.2 KB  |  223 lines

  1. /*
  2.     pcramcle.c
  3.  
  4.     % PC device interface RAM clear/scroll routines
  5.  
  6.     5/16/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.      8/30/88 Ted    Extracted ram_CopyBox function.
  15.      8/30/88 Ted    Renamed from bytedraw.c
  16.     10/04/88 Ted    Extracted copypm_clip function to pcramcpp.c
  17.     10/07/88 Ted    Obsoleted ram_CopyBox.
  18.     10/19/88 Ted    Extracted ram_copypm to pcramcpp.c
  19.     01/10/89 ted    Removed redundant disp clip.
  20.      2/04/89 Ted    Moved Read/Draw Pixmap to pcramdra.c
  21.      7/14/89 ted    Installed pcdata-> ilmask, ilsize, vbincr.
  22.      8/12/89 ted    Made ram_clearbox test for empty ptd box.
  23.  
  24.     11/05/89 ted    Added pc_roundbyte calls for scrbox x byte alignment.
  25.      3/28/90 jmd    ansi-fied
  26.     10/31/90 ted    Added casts when comparing int's to odim's (for MS 6.0).
  27. */
  28.  
  29. #include "pcpriv.h"
  30.  
  31. OSTATIC void DIGPRIV ram_clearbox(opbox *scrboxp, opixval color, ramclear_fptr clear);
  32. OSTATIC void DIGPRIV ram_scrollvt(opbox *scrboxp, opcoord nrows, rammove_fptr move);
  33. OSTATIC void DIGPRIV ram_scrollhz(opbox *scrboxp, opcoord ncols, rammove_fptr move);
  34.  
  35. /* -------------------------------------------------------------------------- */
  36.  
  37. void ram_Clear(ptd_struct *ptd, opixval color)
  38. {
  39.     win_type win;
  40.     opbox scrbox;
  41.  
  42.     win = ptd->win;
  43.  
  44.     opbox_copy(&scrbox, ptd->relboxp);
  45.     opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
  46.  
  47.     if (pc_roundbyte(&scrbox)) {
  48.         if (!pc_retrace()) {
  49.             ram_clearbox(&scrbox, color, ram_segwordset);
  50.         }
  51.         else {
  52.             ram_clearbox(&scrbox, color, ram_wsegwordset);
  53.         }
  54.     }
  55. }
  56. /* -------------------------------------------------------------------------- */
  57.  
  58. void ram_ScrollBoxVt(ptd_struct *ptd, opcoord nrows)
  59. {
  60.     win_type win;
  61.     opbox scrbox;
  62.  
  63.     win = ptd->win;
  64.  
  65.     opbox_copy(&scrbox, ptd->relboxp);
  66.     opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
  67.  
  68.     if (pc_roundbyte(&scrbox)) {
  69.         if (!pc_retrace()) {
  70.             ram_scrollvt(&scrbox, nrows, ram_segtoseg);
  71.         }
  72.         else {
  73.             ram_scrollvt(&scrbox, nrows, ram_wsegtoseg);
  74.         }
  75.     }
  76. }
  77. /* -------------------------------------------------------------------------- */
  78.  
  79. void ram_ScrollBoxHz(ptd_struct *ptd, opcoord ncols)
  80. {
  81.     win_type win;
  82.     opbox scrbox;
  83.  
  84.     win = ptd->win;
  85.  
  86.     opbox_copy(&scrbox, ptd->relboxp);
  87.     opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
  88.  
  89.     if (pc_roundbyte(&scrbox)) {
  90.         if (!pc_retrace()) {
  91.             ram_scrollhz(&scrbox, ncols, ram_segtoseg);
  92.         }
  93.         else {
  94.             ram_scrollhz(&scrbox, ncols, ram_wsegtoseg);
  95.         }
  96.     }
  97. }
  98. /* -------------------------------------------------------------------------- */
  99.  
  100. static void DIGPRIV ram_clearbox(opbox *scrboxp, opixval color, ramclear_fptr clear)
  101. {
  102.     unsigned short vidpos, wordcol;
  103.     odim bwidth;
  104.  
  105.     bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
  106.     if (opbox_GetHeight(scrboxp) <= 0 || bwidth == 0) {
  107.         return;
  108.     }
  109.     vidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
  110.                 (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
  111.                 scrboxp->xmin * pc_pixbits() / 8;
  112.  
  113.     wordcol = pc_wordcolor(color);
  114.  
  115.     for (;;) {
  116.         (*clear)(pc_vidseg(), vidpos, bwidth, wordcol);
  117.         
  118.         scrboxp->ymin += 1;
  119.         if (opbox_GetHeight(scrboxp) <= 0) {
  120.             break;
  121.         }
  122.         vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
  123.                                                             pcdata->ilsize;
  124.     }
  125. }
  126. /* -------------------------------------------------------------------------- */
  127.  
  128. static void DIGPRIV ram_scrollvt(opbox *scrboxp, opcoord nrows, rammove_fptr move)
  129. {
  130.     unsigned short svidpos, dvidpos;
  131.     opcoord sline, dline;
  132.     odim bwidth;
  133.     short int vbincr, vbblock;
  134.     int delta;    /* pos or neg direction line increment */
  135.     int ili;    /* vidblock to increment on */
  136.  
  137.     if (nrows > 0) {
  138.         dline = scrboxp->ymin;
  139.         sline = dline + nrows;
  140.  
  141.         delta = 1;
  142.         ili = 0;    /* when a line inc-wraps to the first block, inc the buf */
  143.         vbblock = pcdata->ilsize;
  144.         vbincr = pcdata->vbincr;
  145.     }
  146.     else if (nrows < 0) {
  147.         nrows = -nrows;
  148.         dline = scrboxp->ymax - 1;
  149.         sline = dline - nrows;
  150.  
  151.         delta = -1;
  152.         ili = pcdata->ilmask;    /* when a line dec-wraps to the last block, dec the buf */
  153.         vbblock = -pcdata->ilsize;
  154.         vbincr = -pcdata->vbincr;
  155.     }
  156.     else return;                                    /* quit if no scroll */
  157.  
  158.     if ((odim) nrows >= opbox_GetHeight(scrboxp)) return;    /* quit if scroll all */
  159.  
  160.     dvidpos = (dline & pcdata->ilmask) * pcdata->ilsize +
  161.         (dline >> pc_ileave()) * pc_bwidth() +
  162.         scrboxp->xmin * pc_pixbits() / 8;
  163.  
  164.     svidpos = (sline & pcdata->ilmask) * pcdata->ilsize +
  165.         (sline >> pc_ileave()) * pc_bwidth() +
  166.         scrboxp->xmin * pc_pixbits() / 8;
  167.  
  168.     bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
  169.  
  170.     scrboxp->ymax -= nrows;
  171.     for (;;) {
  172.         (*move)(pc_vidseg(), svidpos, dvidpos, bwidth);
  173.         
  174.         scrboxp->ymin += 1;
  175.         if (opbox_GetHeight(scrboxp) <= 0) {
  176.             break;
  177.         }
  178.         dvidpos += (((dline += delta) & pcdata->ilmask) == ili) ? vbincr:vbblock;
  179.         svidpos += (((sline += delta) & pcdata->ilmask) == ili) ? vbincr:vbblock;
  180.     }
  181. }
  182. /* -------------------------------------------------------------------------- */
  183.  
  184. static void DIGPRIV ram_scrollhz(opbox *scrboxp, opcoord ncols, rammove_fptr move)
  185. {
  186.     unsigned short svidpos, dvidpos;
  187.     odim bwidth;
  188.  
  189.     if (ncols > 0) {
  190.         dvidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
  191.                     (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
  192.                     scrboxp->xmin * pc_pixbits() / 8;
  193.  
  194.         svidpos = dvidpos + ncols * pc_pixbits() / 8;
  195.     }
  196.     else if (ncols < 0) {
  197.         ncols = -ncols;
  198.         svidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
  199.                     (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
  200.                     scrboxp->xmin * pc_pixbits() / 8;
  201.  
  202.         dvidpos = svidpos + ncols * pc_pixbits() / 8;
  203.     }
  204.     else return;                                /* quit if no scroll */
  205.  
  206.     if ((odim) ncols >= opbox_GetWidth(scrboxp)) return;    /* quit if scroll all */
  207.  
  208.     bwidth = (opbox_GetWidth(scrboxp) - ncols) * pc_pixbits() / 8;
  209.  
  210.     for (;;) {
  211.         (*move)(pc_vidseg(), svidpos, dvidpos, bwidth);
  212.         
  213.         scrboxp->ymin += 1;
  214.         if (opbox_GetHeight(scrboxp) <= 0) {
  215.             break;
  216.         }
  217.         svidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr : pcdata->ilsize;
  218.         dvidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr : pcdata->ilsize;
  219.     }
  220. }
  221. /* -------------------------------------------------------------------------- */
  222.  
  223.