plan 9 kernel history: overview | file list | diff list

1990/0504/port/devbit.c (diff list | history)

1990/03291/sys/src/9/port/devbit.c:40,471990/0504/sys/src/9/port/devbit.c:40,112 (short | long | prev | next)
1990/0327    
void	bitcompact(void); 
void	bitfree(Bitmap*); 
extern	Bitmap	screen; 
1990/0329    
Mouse	mouse; 
1990/0327    
 
1990/0504    
struct{ 
	/* 
	 * First three fields are known in l.s 
	 */ 
	int	dx;		/* interrupt-time delta */ 
	int	dy; 
	int	track;		/* update cursor on screen */ 
	Mouse; 
	int	changed;	/* mouse structure changed since last read */ 
	Rendez	r; 
}mouse; 
 
struct{ 
	Cursor; 
	Lock; 
	int	visible;	/* on screen */ 
	Rectangle r;		/* location */ 
}cursor = 
{ 
	{{0, 0}, 
	{0xFFE0, 0xFFE0, 0xFFC0, 0xFF00, 
	 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 
	 0xE7F0, 0xE3F8, 0xC1FC, 0x00FE, 
	 0x007F, 0x003E, 0x001C, 0x0008, 
	}, 
	{0x0000, 0x7FC0, 0x7F00, 0x7C00, 
	 0x7E00, 0x7F00, 0x6F80, 0x67C0, 
	 0x43E0, 0x41F0, 0x00F8, 0x007C, 
	 0x003E, 0x001C, 0x0008, 0x0000, 
	}}, 
}; 
 
ulong setbits[16]; 
Bitmap	set = 
{ 
	setbits, 
	0, 
	1, 
	0, 
	{0, 0, 16, 16} 
}; 
 
ulong clrbits[16]; 
Bitmap	clr = 
{ 
	clrbits, 
	0, 
	1, 
	0, 
	{0, 0, 16, 16} 
}; 
 
ulong cursorbackbits[16]; 
Bitmap cursorback = 
{ 
	cursorbackbits, 
	0, 
	1, 
	0, 
	{0, 0, 16, 16} 
}; 
 
void	cursortobitmap(void); 
void	cursoron(int); 
void	cursoroff(int); 
 
1990/0324    
enum{ 
	Qdir, 
	Qbitblt, 
1990/03291/sys/src/9/port/devbit.c:74,791990/0504/sys/src/9/port/devbit.c:139,145
1990/0327    
	bit.words = ialloc(conf.nbitbyte, 0); 
	bit.nwords = conf.nbitbyte/sizeof(ulong); 
	bit.wfree = bit.words; 
1990/0504    
	cursortobitmap(); 
1990/0324    
} 
 
void 
1990/03291/sys/src/9/port/devbit.c:82,871990/0504/sys/src/9/port/devbit.c:148,154
1990/0324    
	lock(&bit); 
	bit.bltuse = 0; 
	unlock(&bit); 
1990/0504    
	cursoron(1); 
1990/0324    
} 
 
Chan* 
1990/03291/sys/src/9/port/devbit.c:241,2461990/0504/sys/src/9/port/devbit.c:308,314
1990/0329    
	uchar *p, *q; 
	long m, v, miny, maxy, t, x, y; 
1990/0327    
	ulong l, nw, ws; 
1990/0504    
	int off; 
1990/0324    
	Point pt; 
	Rectangle rect; 
1990/0327    
	Bitmap *bp, *src, *dst; 
1990/03291/sys/src/9/port/devbit.c:330,3351990/0504/sys/src/9/port/devbit.c:398,406
1990/0327    
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth < 0) 
1990/0329    
				error(0, Ebadbitmap); 
1990/0504    
			off = 0; 
			if(v == 0) 
				off = 1; 
1990/0327    
			pt.x = GLONG(p+3); 
			pt.y = GLONG(p+7); 
			v = GSHORT(p+11); 
1990/03291/sys/src/9/port/devbit.c:336,3471990/0504/sys/src/9/port/devbit.c:407,424
1990/0327    
			src = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || src->ldepth < 0) 
1990/0329    
				error(0, Ebadbitmap); 
1990/0504    
			if(v == 0) 
				off = 1; 
1990/0327    
			rect.min.x = GLONG(p+13); 
			rect.min.y = GLONG(p+17); 
			rect.max.x = GLONG(p+21); 
			rect.max.y = GLONG(p+25); 
			v = GSHORT(p+29); 
1990/0504    
			if(off) 
				cursoroff(1); 
1990/0327    
			bitblt(dst, pt, src, rect, v); 
1990/0504    
			if(off) 
				cursoron(1); 
1990/0327    
			m -= 31; 
			p += 31; 
			break; 
1990/03291/sys/src/9/port/devbit.c:379,3841990/0504/sys/src/9/port/devbit.c:456,464
1990/0329    
			dst = &bit.map[v]; 
			if(v>=conf.nbitmap || dst->ldepth<0) 
				error(0, Ebadbitmap); 
1990/0504    
			off = 0; 
			if(v == 0) 
				off = 1; 
1990/0329    
			pt.x = GLONG(p+3); 
			pt.y = GLONG(p+7); 
			v = GSHORT(p+11); 
1990/03291/sys/src/9/port/devbit.c:390,3961990/0504/sys/src/9/port/devbit.c:470,480
1990/0329    
			q = memchr(p, 0, m); 
			if(q == 0) 
				error(0, Ebadblt); 
1990/0504    
			if(off) 
				cursoroff(1); 
1990/0329    
			string(dst, pt, &defont0/*BUG*/, (char*)p, v); 
1990/0504    
			if(off) 
				cursoron(1); 
1990/0329    
			q++; 
			m -= q-p; 
			p = q; 
1990/03291/sys/src/9/port/devbit.c:411,4161990/0504/sys/src/9/port/devbit.c:495,503
1990/0329    
			dst = &bit.map[v]; 
			if(v>=conf.nbitmap || dst->ldepth<0) 
				error(0, Ebadbitmap); 
1990/0504    
			off = 0; 
			if(v == 0) 
				off = 1; 
1990/0329    
			rect.min.x = GLONG(p+3); 
			rect.min.y = GLONG(p+7); 
			rect.max.x = GLONG(p+11); 
1990/03291/sys/src/9/port/devbit.c:428,4341990/0504/sys/src/9/port/devbit.c:515,525
1990/0329    
 
				for(i=0; i<16; i++) 
					t.bits[i] = src->base[i]>>16; 
1990/0504    
				if(off) 
					cursoroff(1); 
1990/0329    
				texture(dst, rect, &t, v); 
1990/0504    
				if(off) 
					cursoron(1); 
1990/0329    
			} 
			m -= 23; 
			p += 23; 
1990/03291/sys/src/9/port/devbit.c:449,4541990/0504/sys/src/9/port/devbit.c:540,548
1990/0329    
			dst = &bit.map[v]; 
			if(v>=conf.nbitmap || dst->ldepth<0) 
				error(0, Ebadbitmap); 
1990/0504    
			off = 0; 
			if(v == 0) 
				off = 1; 
1990/0329    
			miny = GLONG(p+3); 
			maxy = GLONG(p+7); 
1990/03291    
			if(miny>maxy || miny<dst->r.min.y || maxy>dst->r.max.y) 
1990/03291/sys/src/9/port/devbit.c:466,4711990/0504/sys/src/9/port/devbit.c:560,567
1990/0329    
			m -= 11; 
			if(m < l*(maxy-miny)) 
				error(0, Ebadblt); 
1990/0504    
			if(off) 
				cursoroff(1); 
1990/0329    
			for(y=miny; y<maxy; y++){ 
				q = (uchar*)addr(dst, Pt(dst->r.min.x, y)); 
				q += (dst->r.min.x&((sizeof(ulong))*ws-1))/8; 
1990/03291/sys/src/9/port/devbit.c:473,4781990/0504/sys/src/9/port/devbit.c:569,576
1990/0329    
					*q++ = U2K(*p++); 
				m -= l; 
			} 
1990/0504    
			if(off) 
				cursoron(1); 
1990/0329    
			break; 
1990/0327    
		} 
 
1990/03291/sys/src/9/port/devbit.c:524,5331990/0504/sys/src/9/port/devbit.c:622,701
1990/0329    
} 
 
void 
mousebuttons(int b) 
1990/0504    
cursortobitmap(void) 
1990/0329    
{ 
	if(mouse.buttons != b){ 
		print("buttons %x\n", b); 
		mouse.buttons = b; 
1990/0504    
	int i; 
 
	lock(&cursor); 
	for(i=0; i<16; i++){ 
		setbits[i] = cursor.set[i]<<16; 
		clrbits[i] = cursor.clr[i]<<16; 
	} 
	unlock(&cursor); 
} 
 
void 
cursoron(int dolock) 
{ 
	if(dolock) 
		lock(&cursor); 
	if(cursor.visible++ == 0){ 
		cursor.r.min = mouse.xy; 
		cursor.r.max = add(mouse.xy, Pt(16, 16)); 
		cursor.r = raddp(cursor.r, cursor.offset); 
		bitblt(&cursorback, Pt(0, 0), &screen, cursor.r, S); 
		bitblt(&screen, add(mouse.xy, cursor.offset), 
			&clr, Rect(0, 0, 16, 16), D&~S); 
		bitblt(&screen, add(mouse.xy, cursor.offset), 
			&set, Rect(0, 0, 16, 16), S|D); 
	} 
	if(dolock) 
		unlock(&cursor); 
} 
 
void 
cursoroff(int dolock) 
{ 
	if(dolock) 
		lock(&cursor); 
	if(--cursor.visible == 0) 
		bitblt(&screen, cursor.r.min, &cursorback, Rect(0, 0, 16, 16), S); 
	if(dolock) 
		unlock(&cursor); 
} 
 
void 
mousebuttons(int b)	/* called splhi */ 
{ 
	mouse.buttons = b; 
	mouse.changed = 1; 
	wakeup(&mouse.r); 
} 
 
void 
mouseclock(void)	/* called splhi */ 
{ 
	int x, y; 
 
	if(mouse.track && canlock(&cursor)){ 
		x = mouse.xy.x + mouse.dx; 
		if(x < screen.r.min.x) 
			x = screen.r.min.x; 
		if(x >= screen.r.max.x) 
			x = screen.r.max.x; 
		y = mouse.xy.y + mouse.dy; 
		if(y < screen.r.min.y) 
			y = screen.r.min.y; 
		if(y >= screen.r.max.y) 
			y = screen.r.max.y; 
		cursoroff(0); 
		mouse.xy = Pt(x, y); 
		cursoron(0); 
		mouse.dx = 0; 
		mouse.dy = 0; 
		mouse.track = 0; 
		mouse.changed = 1; 
		unlock(&cursor); 
		wakeup(&mouse.r); 
1990/0329    
	} 
1990/0324    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)