|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2775 (0xad7)
Types: TextFile
Notes: UNIX file
Names: »drect.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »hr/src/desk/drect.c«
#include "desk.h"
BITMAP dskBitmap =
{
SEG0,
DIS_WIDTH,
XMIN, YMIN, XMAX, YMAX
};
RECT dskClip =
{
XMIN, YMIN, XMAX, YMAX
};
static uint Mask[BPW+1] =
{
0xffff, 0x7fff, 0x3fff, 0x1fff, 0x0fff, 0x07ff, 0x03ff, 0x01ff,
0x00ff, 0x007f, 0x003f, 0x001f, 0x000f, 0x0007, 0x0003, 0x0001, 0x0000
};
static
rectNDST(vp, lmask, rmask, nwd, dy)
register uint lmask,
rmask,
*vp;
register int nwd;
int dy;
{
register int n;
extern uint *addptr();
while ( dy-- )
{
*vp = (~*vp & lmask) + (*vp & ~lmask);
for ( n=nwd ; n>0 ; n-- )
{
vp = addptr(vp, sizeof(int));
*vp = ~*vp;
}
if ( nwd >= 0 )
{
vp = addptr(vp, sizeof(int));
*vp = (~*vp & rmask) + (*vp & ~rmask);
}
vp = addptr(vp, (DIS_WIDTH/BPW - nwd - 1) << 1);
}
}
static
rectCLR(vp, lmask, rmask, nwd, dy)
register uint lmask,
rmask,
*vp;
register int nwd;
int dy;
{
register int n;
extern uint *addptr();
while ( dy-- )
{
*vp |= lmask;
for ( n=nwd ; n>0 ; n-- )
*++vp = 0xffff;
if ( nwd >= 0 )
*++vp |= rmask;
vp = addptr(vp, (DIS_WIDTH/BPW - nwd - 1) << 1);
}
}
/*
** Blit the rectangular area given by the rectangle *r,
** in physical coordinates.
*/
D_Rect(r, op)
RECT *r;
int op;
{
RECT rect;
uint lmask,
rmask;
register uint *vp;
register int nwd,
ny;
rect = R_Intersection(*r, dskBitmap.rect);
if ( R_null(rect) )
return;
ny = rect.corner.y - rect.origin.y;
lmask = Mask[(BPW-1) & rect.origin.x];
rmask = ~Mask[((BPW - 1) & (rect.corner.x - 1)) + 1];
nwd = ((rect.corner.x - 1) >> SBPW) - (rect.origin.x >> SBPW) - 1;
if ( rect.origin.y >= YSPLIT )
vp = SEG1 + (rect.origin.y-YSPLIT)*(DIS_WIDTH/BPW);
else
vp = SEG0 + rect.origin.y*(DIS_WIDTH/BPW);
vp += rect.origin.x >> SBPW;
if ( nwd == -1 )
lmask &= rmask;
ioctl(myfd, CIOMSEOFF);
(*( op == L_NDST ? rectNDST : rectCLR ))(vp, lmask, rmask, nwd, ny);
ioctl(myfd, CIOMSEON);
}
/*
** Frame the rectangle with a thickness of "n"
*/
D_Frame(r, n)
register RECT *r;
register unsigned n;
{
RECT rect;
if ( R_null(*r) )
return;
if ( n > 8 )
n = 8;
if ( n >= r->corner.x - r->origin.x || n >= r->corner.y - r->origin.y )
{
InvertRect(r);
return;
}
rect.origin.x = r->origin.x;
rect.origin.y = r->origin.y;
rect.corner.x = r->corner.x;
rect.corner.y = r->origin.y + n;
InvertRect(&rect);
rect.origin.x = r->origin.x;
rect.origin.y = r->corner.y - n;
rect.corner.x = r->corner.x;
rect.corner.y = r->corner.y;
InvertRect(&rect);
rect.origin.x = r->origin.x;
rect.origin.y = r->origin.y + n;
rect.corner.x = r->origin.x + n;
rect.corner.y = r->corner.y -n;
InvertRect(&rect);
rect.origin.x = r->corner.x - n;
rect.origin.y = r->origin.y + n;
rect.corner.x = r->corner.x;
rect.corner.y = r->corner.y - n;
InvertRect(&rect);
}