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

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