Charles.Forsyth20060303644188019 years agoHistory
198 lines · 3.1 KB · C
RawDownload
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "io.h"#include "dat.h"#include "fns.h" #include <draw.h>#include <memdraw.h>#include "screen.h" extern Video *vid;extern Memimage gscreen; static Vctlr*	init(Vctlr* vctlr, int x, int y, int d);static int	setcolour(ulong p, ulong r, ulong g, ulong b);static void	enable(void);static void	disable(void);static void	move(int cx, int cy);static void	load(Cursor *c);static int	isloaded(void); extern void*	memcpy(void*, void*, int);extern void	cursorupdate0(void); Vctlr FSV = {	"FSV",			/* name */	init,			/* init */	0,			/* page */	setcolour,		/* setcolor */ 	enable,			/* enable cursor fn */	disable,		/* disable cursor fn */	move,			/* move cursor fn */	load,			/* load cursor fn */	isloaded,		/* is cursor loaded? */	0,			/* deprecated */ 	1024,			/* screen width (x) */	768,			/* screen height (y) */	3,			/* depth */ 	0,			/* hidecount */	0,			/* loaded */}; static int lastx=-1;static int lasty=-1; static Vctlr*init(Vctlr* vctlr, int x, int y, int d){	USED(vctlr,x,y,d); 	return &FSV;} static intsetcolour(ulong p, ulong r, ulong g, ulong b){	if(gscreen.ldepth == 0)		return 0;	/* can't change mono screen colormap */	else{		vid->addr = p << 24;		vid->color = r << 24;		vid->color = g << 24;		vid->color = b << 24;		return 1;	}} static ulong backingstore[64];static Memdata backingstoredata = {	nil,	backingstore}; static ulong backingnocursor[64];static Memdata backingnocursordata = {	nil,	backingnocursor}; static ulong backwithcursor[64];static Memdata backwithcursordata = {	nil,	backwithcursor}; static Memimage backingnocursormem = {	{0,0,16,16},	{0,0,16,16},	3,	0,	&backingnocursordata,	0,	16/4,	0,	0,};static Memimage backingmem = {	{0,0,16,16},	{0,0,16,16},	3,	0,	&backingstoredata,	0,	16/4,	0,	0,}; static voiddisable(void){	if(FSV.hidecount++)		return;	if(lastx < 0 || lasty < 0)		return; 	memimagedraw(&gscreen, Rect(lastx,lasty,lastx+16,lasty+16),		     &backingnocursormem, Pt(0,0), memones, Pt(0,0));} static voidenable(void){	uchar *p;	uchar mask;	uchar *cset;	int i; 	if(--FSV.hidecount > 0)		return;	FSV.hidecount = 0; 	if(lastx < 0 || lasty < 0)		return; 	memimagedraw(&backingmem,Rect(0,0,16,16),&gscreen,Pt(lastx,lasty),memones,		     Pt(0,0)); 	memcpy(backingnocursor,backingstore,256);	p = (uchar*)backingmem.data->data; 	cset = FSV.cursor.set; 	for(i=0;i<32;i++) {		mask = ~cset[i]; 		if(!(mask&(1<<7))) *p = 0xff;		++p;		if(!(mask&(1<<6))) *p = 0xff;		++p;		if(!(mask&(1<<5))) *p = 0xff;		++p;		if(!(mask&(1<<4))) *p = 0xff;		++p;		if(!(mask&(1<<3))) *p = 0xff;		++p;		if(!(mask&(1<<2))) *p = 0xff;		++p;		if(!(mask&(1<<1))) *p = 0xff;		++p;		if(!(mask&(1<<0))) *p = 0xff;		++p;	} 	memimagedraw(&gscreen,Rect(lastx,lasty,lastx+16,lasty+16),&backingmem,Pt(0,0),		     memones,Pt(0,0));} static voidmove(int cx, int cy){	if(!FSV.loaded)		return; 	disable();	cursorupdate0();	lastx = cx;	lasty = cy;	enable();}  static voidload(Cursor *curs){	FSV.cursor = *curs;	FSV.loaded=1;} static intisloaded(void){	return FSV.loaded;}