DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦963168b89⟧ TextFile

    Length: 2775 (0xad7)
    Types: TextFile
    Notes: UNIX file
    Names: »drect.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »hr/src/desk/drect.c« 

TextFile

#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);
}