home *** CD-ROM | disk | FTP | other *** search
- /*
- pcramcle.c
-
- % PC device interface RAM clear/scroll routines
-
- 5/16/88 by Ted.
-
- OWL 1.1
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 8/30/88 Ted Extracted ram_CopyBox function.
- 8/30/88 Ted Renamed from bytedraw.c
- 10/04/88 Ted Extracted copypm_clip function to pcramcpp.c
- 10/07/88 Ted Obsoleted ram_CopyBox.
- 10/19/88 Ted Extracted ram_copypm to pcramcpp.c
- 01/10/89 ted Removed redundant disp clip.
- 2/04/89 Ted Moved Read/Draw Pixmap to pcramdra.c
- 7/14/89 ted Installed pcdata-> ilmask, ilsize, vbincr.
- 8/12/89 ted Made ram_clearbox test for empty ptd box.
- */
-
- #include "pcpriv.h"
-
- OSTATIC void DIGPRIV ram_clearbox(_arg3(opbox *, opixval, ramclear_fptr));
- OSTATIC void DIGPRIV ram_scrollvt(_arg3(opbox *, opcoord, rammove_fptr));
- OSTATIC void DIGPRIV ram_scrollhz(_arg3(opbox *, opcoord, rammove_fptr));
- /* -------------------------------------------------------------------------- */
-
- void ram_Clear(ptd, color)
- ptd_struct *ptd;
- opixval color;
- {
- win_type win;
- opbox scrbox;
-
- win = ptd->win;
-
- opbox_copy(&scrbox, ptd->relboxp);
- opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
-
- if (!pc_retrace()) {
- ram_clearbox(&scrbox, color, ram_segwordset);
- }
- else {
- ram_clearbox(&scrbox, color, ram_wsegwordset);
- }
- }
- /* -------------------------------------------------------------------------- */
-
- void ram_ScrollBoxVt(ptd, nrows)
- ptd_struct *ptd;
- opcoord nrows;
- {
- win_type win;
- opbox scrbox;
-
- win = ptd->win;
-
- opbox_copy(&scrbox, ptd->relboxp);
- opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
-
- if (!pc_retrace()) {
- ram_scrollvt(&scrbox, nrows, ram_segtoseg);
- }
- else {
- ram_scrollvt(&scrbox, nrows, ram_wsegtoseg);
- }
- }
- /* -------------------------------------------------------------------------- */
-
- void ram_ScrollBoxHz(ptd, ncols)
- ptd_struct *ptd;
- opcoord ncols;
- {
- win_type win;
- opbox scrbox;
-
- win = ptd->win;
-
- opbox_copy(&scrbox, ptd->relboxp);
- opbox_trans(&scrbox, win_GetXmin(win), win_GetYmin(win));
-
- if (!pc_retrace()) {
- ram_scrollhz(&scrbox, ncols, ram_segtoseg);
- }
- else {
- ram_scrollhz(&scrbox, ncols, ram_wsegtoseg);
- }
- }
- /* -------------------------------------------------------------------------- */
-
- static void DIGPRIV ram_clearbox(scrboxp, color, clear)
- opbox *scrboxp;
- opixval color;
- ramclear_fptr clear;
- {
- unsigned short vidpos, wordcol;
- odim bwidth;
-
- bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
- if (opbox_GetHeight(scrboxp) <= 0 || bwidth == 0) {
- return;
- }
- vidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
- (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
- scrboxp->xmin * pc_pixbits() / 8;
-
- wordcol = pc_wordcolor(color);
-
- for (;;) {
- (*clear)(pc_vidseg(), vidpos, bwidth, wordcol);
-
- scrboxp->ymin += 1;
- if (opbox_GetHeight(scrboxp) <= 0) {
- break;
- }
- vidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr:
- pcdata->ilsize;
- }
- }
- /* -------------------------------------------------------------------------- */
-
- static void DIGPRIV ram_scrollvt(scrboxp, nrows, move)
- opbox *scrboxp;
- opcoord nrows;
- rammove_fptr move;
- {
- unsigned short svidpos, dvidpos;
- opcoord sline, dline;
- odim bwidth;
- short int vbincr, vbblock;
- int delta; /* pos or neg direction line increment */
- int ili; /* vidblock to increment on */
-
- if (nrows > 0) {
- dline = scrboxp->ymin;
- sline = dline + nrows;
-
- delta = 1;
- ili = 0; /* when a line inc-wraps to the first block, inc the buf */
- vbblock = pcdata->ilsize;
- vbincr = pcdata->vbincr;
- }
- else if (nrows < 0) {
- nrows = -nrows;
- dline = scrboxp->ymax - 1;
- sline = dline - nrows;
-
- delta = -1;
- ili = pcdata->ilmask; /* when a line dec-wraps to the last block, dec the buf */
- vbblock = -pcdata->ilsize;
- vbincr = -pcdata->vbincr;
- }
- else return; /* quit if no scroll */
-
- if (nrows >= opbox_GetHeight(scrboxp)) return; /* quit if scroll all */
-
- dvidpos = (dline & pcdata->ilmask) * pcdata->ilsize +
- (dline >> pc_ileave()) * pc_bwidth() +
- scrboxp->xmin * pc_pixbits() / 8;
-
- svidpos = (sline & pcdata->ilmask) * pcdata->ilsize +
- (sline >> pc_ileave()) * pc_bwidth() +
- scrboxp->xmin * pc_pixbits() / 8;
-
- bwidth = opbox_GetWidth(scrboxp) * pc_pixbits() / 8;
-
- scrboxp->ymax -= nrows;
- for (;;) {
- (*move)(pc_vidseg(), svidpos, dvidpos, bwidth);
-
- scrboxp->ymin += 1;
- if (opbox_GetHeight(scrboxp) <= 0) {
- break;
- }
- dvidpos += (((dline += delta) & pcdata->ilmask) == ili) ? vbincr:vbblock;
- svidpos += (((sline += delta) & pcdata->ilmask) == ili) ? vbincr:vbblock;
- }
- }
- /* -------------------------------------------------------------------------- */
-
- static void DIGPRIV ram_scrollhz(scrboxp, ncols, move)
- opbox *scrboxp;
- opcoord ncols;
- rammove_fptr move;
- {
- unsigned short svidpos, dvidpos;
- odim bwidth;
-
- if (ncols > 0) {
- dvidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
- (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
- scrboxp->xmin * pc_pixbits() / 8;
-
- svidpos = dvidpos + ncols * pc_pixbits() / 8;
- }
- else if (ncols < 0) {
- ncols = -ncols;
- svidpos = (scrboxp->ymin & pcdata->ilmask) * pcdata->ilsize +
- (scrboxp->ymin >> pc_ileave()) * pc_bwidth() +
- scrboxp->xmin * pc_pixbits() / 8;
-
- dvidpos = svidpos + ncols * pc_pixbits() / 8;
- }
- else return; /* quit if no scroll */
-
- if (ncols >= opbox_GetWidth(scrboxp)) return; /* quit if scroll all */
-
- bwidth = (opbox_GetWidth(scrboxp) - ncols) * pc_pixbits() / 8;
-
- for (;;) {
- (*move)(pc_vidseg(), svidpos, dvidpos, bwidth);
-
- scrboxp->ymin += 1;
- if (opbox_GetHeight(scrboxp) <= 0) {
- break;
- }
- svidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr : pcdata->ilsize;
- dvidpos += ((scrboxp->ymin & pcdata->ilmask) == 0) ? pcdata->vbincr : pcdata->ilsize;
- }
- }
- /* -------------------------------------------------------------------------- */
-
-