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

1999/1005/port/devdraw.c (diff list | history)

1999/0716/sys/src/9/port/devdraw.c:1,211999/1005/sys/src/9/port/devdraw.c:1,24 (short | long | prev | next)
1997/1101    
#include	"u.h" 
1999/0716    
#include	"lib.h" 
1999/1005    
#include	"../port/lib.h" 
1997/1101    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1999/0716    
#include	"error.h" 
1999/1005    
#include	"../port/error.h" 
#include	<pool.h> 
1997/1101    
 
#define	Image	IMAGE 
#include	<draw.h> 
#include	<memdraw.h> 
#include	<memlayer.h> 
1999/1005    
#include	<cursor.h> 
#include	"screen.h" 
1997/1101    
 
enum 
{ 
1998/0204    
	Qtopdir		= 0, 
1997/1101    
	Q2nd, 
	Qnew, 
	Q3rd, 
1999/1005    
	Q2nd, 
1997/1101    
	Qcolormap, 
	Qctl, 
	Qdata, 
1999/0716/sys/src/9/port/devdraw.c:150,1561999/1005/sys/src/9/port/devdraw.c:153,159
1997/1101    
}; 
 
static	Draw		sdraw; 
static	Memimage	screenimage; 
1999/1005    
static	Memimage	*screenimage; 
1997/1101    
static	Memdata	screendata; 
static	Rectangle	flushrect; 
1998/0109    
static	int		waste; 
1999/0716/sys/src/9/port/devdraw.c:172,1781999/1005/sys/src/9/port/devdraw.c:175,181
1997/1101    
static	char Enotfont[] =	"image not a font"; 
static	char Eindex[] =		"character index out of range"; 
static	char Enoclient[] =	"no such draw client"; 
static	char Eldepth[] =	"image has bad ldepth"; 
1999/1005    
static	char Edepth[] =	"image has bad depth"; 
1997/1101    
static	char Enameused[] =	"image name in use"; 
static	char Enoname[] =	"no image with that name"; 
static	char Eoldname[] =	"named image no longer valid"; 
1999/0716/sys/src/9/port/devdraw.c:302,3081999/1005/sys/src/9/port/devdraw.c:305,311
1998/0109    
	int abb, ar, anbb; 
	Rectangle nbb; 
 
	if(sdraw.softscreen==0 || !rectclip(&r, screenimage.r)) 
1999/1005    
	if(sdraw.softscreen==0 || !rectclip(&r, screenimage->r)) 
1998/0109    
		return; 
 
	if(flushrect.min.x >= flushrect.max.x){ 
1999/0716/sys/src/9/port/devdraw.c:353,3591999/1005/sys/src/9/port/devdraw.c:356,362
1997/1127    
	if(l == nil) 
1997/1101    
		return; 
1997/1127    
	do{ 
		if(l->screen->image->data != screenimage.data) 
1999/1005    
		if(l->screen->image->data != screenimage->data) 
1997/1127    
			return; 
		r = rectaddpt(r, l->delta); 
		l = l->screen->image->layer; 
1999/0716/sys/src/9/port/devdraw.c:414,4281999/1005/sys/src/9/port/devdraw.c:417,434
1997/1101    
{ 
	DImage *d; 
 
1999/1005    
//	print("drawlookup %d", id); 
1997/1101    
	d = client->dimage[id&HASHMASK]; 
	while(d){ 
		if(d->id == id){ 
			if(checkname && !drawgoodname(d)) 
1997/1104    
				error(Eoldname); 
1999/1005    
//			print(" %p...", d); 
1997/1101    
			return d; 
		} 
		d = d->next; 
	} 
1999/1005    
//	print(" nil..."); 
1997/1101    
	return 0; 
} 
 
1999/0716/sys/src/9/port/devdraw.c:475,4801999/1005/sys/src/9/port/devdraw.c:481,487
1997/1101    
	d->dscreen = dscreen; 
	d->next = client->dimage[id&HASHMASK]; 
	client->dimage[id&HASHMASK] = d; 
1999/1005    
//	print("install %d %p...", id, d); 
1997/1101    
	return i; 
} 
 
1999/0716/sys/src/9/port/devdraw.c:485,4901999/1005/sys/src/9/port/devdraw.c:492,500
1997/1101    
	CScreen *c; 
 
	c = malloc(sizeof(CScreen)); 
1999/1005    
	if(dimage && dimage->image && dimage->image->chan == 0) 
		panic("bad image %p in drawinstallscreen", dimage->image); 
 
1997/1101    
	if(c == 0) 
		return 0; 
	if(d == 0){ 
1999/0716/sys/src/9/port/devdraw.c:590,6011999/1005/sys/src/9/port/devdraw.c:600,611
1997/1101    
			i++; 
	if(dimage->vers != 0)	/* acquired by name; owned by someone else*/ 
		goto Return; 
	if(dimage->image == &screenimage)	/* don't free the display */ 
1999/1005    
	if(dimage->image == screenimage)	/* don't free the display */ 
1997/1101    
		goto Return; 
	ds = dimage->dscreen; 
	if(ds){ 
		l = dimage->image; 
		if(l->data == screenimage.data) 
1999/1005    
		if(l->data == screenimage->data) 
1997/1101    
			addflush(l->layer->screenr); 
		if(l->layer->refreshfn == drawrefresh)	/* else true owner will clean up */ 
			free(l->layer->refreshptr); 
1999/0716/sys/src/9/port/devdraw.c:790,8141999/1005/sys/src/9/port/devdraw.c:800,840
1999/0128    
static int 
initscreenimage(void) 
1997/1101    
{ 
	int width; 
1999/1005    
	int width, depth; 
	ulong chan; 
	Rectangle r; 
1997/1101    
 
1999/0128    
	if(screendata.data != nil) 
1999/1005    
	if(screenimage != nil) 
1999/0128    
		return 1; 
1999/0202    
 
	screendata.base = nil; 
1999/0128    
	screendata.data = attachscreen(&screenimage.r, &screenimage.ldepth, &width, &sdraw.softscreen); 
1999/0202    
                 
1999/0128    
	if(screendata.data == nil) 
1999/1005    
	screendata.bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen); 
	if(screendata.bdata == nil) 
1999/0128    
		return 0; 
                 
1999/0202    
	screendata.ref = 1; 
	screenimage.data = &screendata; 
	screenimage.width = width; 
	screenimage.clipr  = screenimage.r; 
1999/0128    
 
1999/1005    
	screenimage = allocmemimaged(r, chan, &screendata); 
	if(screenimage == nil){ 
		/* RSC: BUG: detach screen */ 
		return 0; 
	} 
 
	screenimage->width = width; 
	screenimage->clipr  = screenimage->r; 
1999/0128    
	return 1; 
} 
 
1999/1005    
void 
deletescreenimage(void) 
{ 
	qlock(&sdraw); 
	/* RSC: BUG: detach screen */ 
	if(screenimage) 
		freememimage(screenimage); 
	screenimage = nil; 
	qunlock(&sdraw); 
} 
 
1999/0128    
Chan* 
drawattach(char *spec) 
{ 
1999/0716/sys/src/9/port/devdraw.c:824,8301999/1005/sys/src/9/port/devdraw.c:850,856
1997/1101    
int 
drawwalk(Chan *c, char *name) 
{ 
	if(screendata.data == nil) 
1999/1005    
	if(screendata.bdata == nil) 
1997/1101    
		error("no frame buffer"); 
	if(strcmp(name, "..") == 0){ 
		switch(QID(c->qid)){ 
1999/0716/sys/src/9/port/devdraw.c:885,8911999/1005/sys/src/9/port/devdraw.c:911,917
1997/1101    
			error(Einuse); 
		cl->busy = 1; 
		flushrect = Rect(10000, 10000, -10000, -10000); 
		drawinstall(cl, 0, &screenimage, 0); 
1999/1005    
		drawinstall(cl, 0, screenimage, 0); 
1997/1101    
		incref(&cl->r); 
		break; 
	case Qcolormap: 
1999/0716/sys/src/9/port/devdraw.c:963,9681999/1005/sys/src/9/port/devdraw.c:989,995
1997/1101    
	DImage *di; 
	Memimage *i; 
1998/0319    
	ulong offset = off; 
1999/1005    
	char buf[16]; 
1997/1101    
 
	USED(offset); 
	if(c->qid.path & CHDIR) 
1999/0716/sys/src/9/port/devdraw.c:979,9941999/1005/sys/src/9/port/devdraw.c:1006,1023
1997/1101    
			error(Eshortread); 
		if(cl->infoid < 0) 
			error(Enodrawimage); 
		if(cl->infoid == 0) 
			i = &screenimage; 
		else{ 
1999/1005    
		if(cl->infoid == 0){ 
			i = screenimage; 
			if(i == nil) 
				error(Enodrawimage); 
		}else{ 
1997/1101    
			di = drawlookup(cl, cl->infoid, 1); 
			if(di == nil) 
				error(Enodrawimage); 
			i = di->image; 
		} 
		n = sprint(a, "%11d %11d %11d %11d %11d %11d %11d %11d %11d %11d %11d %11d ", 
			cl->clientid, cl->infoid, i->ldepth, i->repl, 
1999/1005    
		n = sprint(a, "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", 
			cl->clientid, cl->infoid, chantostr(buf, i->chan), (i->flags&Frepl)==Frepl, 
1997/1101    
			i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y, 
			i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, i->clipr.max.y); 
		cl->infoid = -1; 
1999/0716/sys/src/9/port/devdraw.c:1110,11241999/1005/sys/src/9/port/devdraw.c:1139,1153
1997/1101    
			m -= i; 
			*q = 0; 
			if(parsefields(buf, fields, nelem(fields), " ") != 4) 
				error(Ebadarg); 
1999/1005    
				error("eb1"); //error(Ebadarg); 
1997/1101    
			i = strtoul(fields[0], 0, 0); 
			red = strtoul(fields[1], 0, 0); 
			green = strtoul(fields[2], 0, 0); 
			blue = strtoul(fields[3], &q, 0); 
			if(fields[3] == q) 
				error(Ebadarg); 
1999/1005    
				error("eb2"); //error(Ebadarg); 
1997/1101    
			if(red>255 || green>255 || blue>255 || i<0 || i>255) 
				error(Ebadarg); 
1999/1005    
				error("eb3"); //error(Ebadarg); 
1997/1101    
			red |= red<<8; 
			red |= red<<16; 
			green |= green<<8; 
1999/0716/sys/src/9/port/devdraw.c:1167,11771999/1005/sys/src/9/port/devdraw.c:1196,1258
1997/1101    
	return p; 
} 
 
1999/1005    
static void 
printmesg(char *fmt, uchar *a, int itwouldmakemehappyifyouprintthis) 
{ 
	char buf[256]; 
	char *p, *q; 
	int s; 
 
	if(1|| itwouldmakemehappyifyouprintthis==0){ 
		SET(s,q,p); 
		USED(fmt, a, buf, p, q, s); 
		return; 
	} 
	q = buf; 
	*q++ = *a++; 
	for(p=fmt; *p; p++){ 
		switch(*p){ 
		case 'l': 
			q += sprint(q, " %ld", (long)BGLONG(a)); 
			a += 4; 
			break; 
		case 'L': 
			q += sprint(q, " %.8lux", (ulong)BGLONG(a)); 
			a += 4; 
			break; 
		case 'R': 
			q += sprint(q, " [%d %d %d %d]", BGLONG(a), BGLONG(a+4), BGLONG(a+8), BGLONG(a+12)); 
			a += 16; 
			break; 
		case 'P': 
			q += sprint(q, " [%d %d]", BGLONG(a), BGLONG(a+4)); 
			a += 8; 
			break; 
		case 'b': 
			q += sprint(q, " %d", *a++); 
			break; 
		case 's': 
			q += sprint(q, " %d", BGSHORT(a)); 
			a += 2; 
			break; 
		case 'S': 
			q += sprint(q, " %.4ux", BGSHORT(a)); 
			a += 2; 
			break; 
		} 
	} 
	*q++ = '\n'; 
	*q = 0; 
	iprint("%.*s", (int)(q-buf), buf); 
} 
 
1997/1101    
void 
drawmesg(Client *client, void *av, int n) 
{ 
	int c, ldepth, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, ox, oy, esize, doflush; 
	uchar *u, *a; 
1999/1005    
	int c, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, ox, oy, esize, doflush; 
	uchar *u, *a, refresh; 
	char *fmt; 
	ulong value, chan; 
1997/1101    
	Rectangle r, clipr; 
	Point p, q, *pp, sp; 
	Memimage *i, *dst, *src, *mask; 
1999/0716/sys/src/9/port/devdraw.c:1187,12161999/1005/sys/src/9/port/devdraw.c:1268,1308
1997/1101    
 
	a = av; 
	m = 0; 
1999/1005    
	fmt = nil; 
	if(waserror()){ 
		if(fmt) printmesg(fmt, a, 1); 
	//	iprint("error: %s\n", up->error); 
		nexterror(); 
	} 
1997/1101    
	while((n-=m) > 0){ 
1999/1005    
		USED(fmt); 
1997/1101    
		a += m; 
		switch(*a){ 
		default: 
			error("bad draw command"); 
		/* allocate: 'a' id[4] screenid[4] refresh[1] ldepth[2] repl[1] R[4*4] clipR[4*4] value[1] */ 
		case 'a': 
			m = 1+4+4+1+2+1+4*4+4*4+1; 
1999/1005    
		/* new allocate: 'b' id[4] screenid[4] refresh[1] chan[4] repl[1] R[4*4] clipR[4*4] rrggbbαα[4] */ 
		case 'b': 
			printmesg(fmt="LLbLbRRL", a, 0); 
			m = 1+4+4+1+4+1+4*4+4*4+4; 
1997/1101    
			if(n < m) 
				error(Eshortdraw); 
			dstid = BGLONG(a+1); 
1999/1005    
			scrnid = BGSHORT(a+5); 
			refresh = a[9]; 
			chan = BGLONG(a+10); 
			repl = a[14]; 
			drawrectangle(&r, a+15); 
			drawrectangle(&clipr, a+31); 
			value = BGLONG(a+47); 
1997/1101    
			if(drawlookup(client, dstid, 0)) 
				error(Eimageexists); 
			ldepth = BGSHORT(a+10); 
			repl = a[12]; 
			drawrectangle(&r, a+13); 
			scrnid = BGSHORT(a+5); 
			if(scrnid){ 
				dscrn = drawlookupscreen(client, scrnid, &cs); 
				scrn = dscrn->screen; 
				if(repl || ldepth!=scrn->image->ldepth) 
1999/1005    
				if(repl || chan!=scrn->image->chan) 
1997/1101    
					error("image parameters incompatible with screen"); 
				reffn = nil; 
				switch(a[9]){ 
1999/1005    
				switch(refresh){ 
1997/1101    
				case Refbackup: 
					break; 
				case Refnone: 
1999/0716/sys/src/9/port/devdraw.c:1222,12321999/1005/sys/src/9/port/devdraw.c:1314,1324
1997/1101    
				default: 
					error("unknown refresh method"); 
				} 
				l = memlalloc(scrn, r, reffn, 0, a[45]); 
1999/1005    
				l = memlalloc(scrn, r, reffn, 0, value); 
1997/1101    
				if(l == 0) 
					error(Edrawmem); 
				addflush(l->layer->screenr); 
				drawrectangle(&l->clipr, a+29); 
1999/1005    
				l->clipr = clipr; 
1997/1101    
				rectclip(&l->clipr, r); 
				if(drawinstall(client, dstid, l, dscrn) == 0){ 
					memldelete(l); 
1999/0716/sys/src/9/port/devdraw.c:1248,12581999/1005/sys/src/9/port/devdraw.c:1340,1353
1997/1101    
				} 
				continue; 
			} 
			i = allocmemimage(r, ldepth); 
			if(i == 0) 
1999/1005    
			i = allocmemimage(r, chan); 
			if(i == 0){ 
				iprint("chan %lux\n", chan); 
1997/1101    
				error(Edrawmem); 
			i->repl = repl; 
			drawrectangle(&i->clipr, a+29); 
1999/1005    
			} 
			if(repl) 
				i->flags |= Frepl; 
			i->clipr = clipr; 
1997/1101    
			if(!repl) 
				rectclip(&i->clipr, r); 
			if(drawinstall(client, dstid, i, 0) == 0){ 
1999/0716/sys/src/9/port/devdraw.c:1259,12691999/1005/sys/src/9/port/devdraw.c:1354,1365
1997/1101    
				freememimage(i); 
				error(Edrawmem); 
			} 
			memfillcolor(i, a[45]); 
1999/1005    
			memfillcolor(i, value); 
1997/1101    
			continue; 
 
		/* allocate screen: 'A' id[4] imageid[4] fillid[4] public[1] */ 
		case 'A': 
1999/1005    
			printmesg(fmt="LLLb", a, 1); 
1997/1101    
			m = 1+4+4+4+1; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1282,12871999/1005/sys/src/9/port/devdraw.c:1378,1384
1997/1101    
 
		/* set repl and clip: 'c' dstid[4] repl[1] clipR[4*4] */ 
		case 'c': 
1999/1005    
			printmesg(fmt="LbR", a, 0); 
1997/1101    
			m = 1+4+1+4*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1291,13021999/1005/sys/src/9/port/devdraw.c:1388,1401
1997/1101    
			if(ddst->name) 
				error("can't change repl/clipr of shared image"); 
			dst = ddst->image; 
			dst->repl = a[5]; 
1999/1005    
			if(a[5]) 
				dst->flags |= Frepl; 
1997/1101    
			drawrectangle(&dst->clipr, a+6); 
			continue; 
 
		/* draw: 'd' dstid[4] srcid[4] maskid[4] R[4*4] P[2*4] P[2*4] */ 
		case 'd': 
1999/1005    
			printmesg(fmt="LLLRPP", a, 0); 
1997/1101    
			m = 1+4+4+4+4*4+2*4+2*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1311,13191999/1005/sys/src/9/port/devdraw.c:1410,1428
1997/1101    
			dstflush(dstid, dst, r); 
			continue; 
 
1999/1005    
		/* toggle debugging: 'D' val[1] */ 
		case 'D': 
			printmesg(fmt="b", a, 0); 
			m = 1+1; 
			if(n < m) 
				error(Eshortdraw); 
			drawdebug = a[1]; 
			continue; 
 
1997/1101    
		/* ellipse: 'e' dstid[4] srcid[4] center[2*4] a[4] b[4] thick[4] sp[2*4] alpha[4] phi[4]*/ 
		case 'e': 
		case 'E': 
1999/1005    
			printmesg(fmt="LLPlllPll", a, 0); 
1997/1101    
			m = 1+4+4+2*4+4+4+4+2*4+2*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1346,13511999/1005/sys/src/9/port/devdraw.c:1455,1461
1997/1101    
 
		/* free: 'f' id[4] */ 
		case 'f': 
1999/1005    
			printmesg(fmt="L", a, 1); 
1997/1101    
			m = 1+4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1357,13621999/1005/sys/src/9/port/devdraw.c:1467,1473
1997/1101    
 
		/* free screen: 'F' id[4] */ 
		case 'F': 
1999/1005    
			printmesg(fmt="L", a, 1); 
1997/1101    
			m = 1+4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1366,13711999/1005/sys/src/9/port/devdraw.c:1477,1483
1997/1101    
 
		/* initialize font: 'i' fontid[4] nchars[4] ascent[1] */ 
		case 'i': 
1999/1005    
			printmesg(fmt="Llb", a, 1); 
1997/1101    
			m = 1+4+4+1; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1389,13941999/1005/sys/src/9/port/devdraw.c:1501,1507
1997/1101    
 
		/* load character: 'l' fontid[4] srcid[4] index[2] R[4*4] P[2*4] left[1] width[1] */ 
		case 'l': 
1999/1005    
			printmesg(fmt="LLSRPbb", a, 0); 
1997/1101    
			m = 1+4+4+2+4*4+2*4+1+1; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1403,14091999/1005/sys/src/9/port/devdraw.c:1516,1522
1997/1101    
				error(Eindex); 
			drawrectangle(&r, a+11); 
			drawpoint(&p, a+27); 
			memdraw(font->image, r, src, p, memones, p); 
1999/1005    
			memdraw(font->image, r, src, p, memopaque, p); 
1997/1101    
			fc = &font->fchar[ci]; 
			fc->minx = r.min.x; 
			fc->maxx = r.max.x; 
1999/0716/sys/src/9/port/devdraw.c:1415,14201999/1005/sys/src/9/port/devdraw.c:1528,1534
1997/1101    
 
		/* draw line: 'L' dstid[4] p0[2*4] p1[2*4] end0[4] end1[4] radius[4] srcid[4] sp[2*4] */ 
		case 'L': 
1999/1005    
			printmesg(fmt="LPPlllLP", a, 0); 
1997/1101    
			m = 1+4+2*4+2*4+4+4+4+4+2*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1438,14451999/1005/sys/src/9/port/devdraw.c:1552,1568
1997/1101    
			} 
			continue; 
 
1999/1005    
		/* create image mask: 'm' newid[4] id[4] */ 
		case 'm': 
			printmesg("LL", a, 0); 
			m = 4+4; 
			if(n < m) 
				error(Eshortdraw); 
			break; 
 
1997/1101    
		/* attach to a named image: 'n' dstid[4] j[1] name[j] */ 
		case 'n': 
1999/1005    
			printmesg(fmt="Lz", a, 0); 
1997/1101    
			m = 1+4+1; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1469,14741999/1005/sys/src/9/port/devdraw.c:1592,1598
1997/1101    
 
		/* name an image: 'N' dstid[4] in[1] j[1] name[j] */ 
		case 'N': 
1999/1005    
			printmesg(fmt="Lbz", a, 0); 
1997/1101    
			m = 1+4+1+1; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1498,15031999/1005/sys/src/9/port/devdraw.c:1622,1628
1997/1101    
 
		/* position window: 'o' id[4] r.min [2*4] screenr.min [2*4] */ 
		case 'o': 
1999/1005    
			printmesg(fmt="LPP", a, 0); 
1997/1101    
			m = 1+4+2*4+2*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1523,15281999/1005/sys/src/9/port/devdraw.c:1648,1654
1997/1101    
		/* polygon: 'p' dstid[4] n[2] end0[4] end1[4] radius[4] srcid[4] sp[2*4] p0[2*4] dp[2*2*n] */ 
		case 'p': 
		case 'P': 
1999/1005    
			printmesg(fmt="LslllLPP", a, 0); 
1997/1101    
			m = 1+4+2+4+4+4+4+2*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1547,15531999/1005/sys/src/9/port/devdraw.c:1673,1679
1997/1101    
			if(pp == nil) 
				error(Enomem); 
			doflush = 0; 
			if(dstid==0 || (dst->layer && dst->layer->screen->image->data == screenimage.data)) 
1999/1005    
			if(dstid==0 || (dst->layer && dst->layer->screen->image->data == screenimage->data)) 
1997/1101    
				doflush = 1;	/* simplify test in loop */ 
			ox = oy = 0; 
			u = a+m; 
1999/0716/sys/src/9/port/devdraw.c:1588,15931999/1005/sys/src/9/port/devdraw.c:1714,1720
1997/1101    
 
		/* read: 'r' id[4] R[4*4] */ 
		case 'r': 
1999/1005    
			printmesg(fmt="LR", a, 0); 
1997/1101    
			m = 1+4+4*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1597,16031999/1005/sys/src/9/port/devdraw.c:1724,1730
1997/1101    
			drawrectangle(&r, a+5); 
			if(!rectinrect(r, i->r)) 
				error(Ereadoutside); 
			c = bytesperline(r, i->ldepth); 
1999/1005    
			c = bytesperline(r, i->depth); 
1997/1101    
			c *= Dy(r); 
1997/1206    
			free(client->readdata); 
1997/1101    
			client->readdata = mallocz(c, 0); 
1999/0716/sys/src/9/port/devdraw.c:1615,16201999/1005/sys/src/9/port/devdraw.c:1742,1748
1997/1101    
		/* stringbg: 'x' dstid[4] srcid[4] fontid[4] P[2*4] clipr[4*4] sp[2*4] ni[2] bgid[4] bgpt[2*4] ni*(index[2]) */ 
		case 's': 
		case 'x': 
1999/1005    
			printmesg(fmt="LLLPRPs", a, 0); 
1997/1101    
			m = 1+4+4+4+2*4+4*4+2*4+2; 
			if(*a == 'x') 
				m += 4+2*4; 
1999/0716/sys/src/9/port/devdraw.c:1657,16631999/1005/sys/src/9/port/devdraw.c:1785,1791
1997/1101    
					r.max.x += font->fchar[ci].width; 
					u += 2; 
				} 
				memdraw(dst, r, l, q, memones, ZP); 
1999/1005    
				memdraw(dst, r, l, q, memopaque, ZP); 
1997/1101    
				u -= 2*ni; 
			} 
			q = p; 
1999/0716/sys/src/9/port/devdraw.c:1677,16821999/1005/sys/src/9/port/devdraw.c:1805,1811
1997/1101    
 
		/* use public screen: 'S' id[4] ldepth[4] */ 
		case 'S': 
1999/1005    
			printmesg(fmt="Ll", a, 0); 
1997/1101    
			m = 1+4+4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1686,16931999/1005/sys/src/9/port/devdraw.c:1815,1822
1997/1101    
			dscrn = drawlookupdscreen(dstid); 
			if(dscrn==0 || (dscrn->public==0 && dscrn->owner!=client)) 
				error(Enodrawscreen); 
			if(dscrn->screen->image->ldepth != BGLONG(a+5)) 
				error("inconsistent ldepth"); 
1999/1005    
			if(dscrn->screen->image->depth != (1<<BGLONG(a+5))) 
				error("inconsistent depth"); 
1997/1101    
			if(drawinstallscreen(client, dscrn, 0, 0, 0, 0) == 0) 
				error(Edrawmem); 
			continue; 
1999/0716/sys/src/9/port/devdraw.c:1694,16991999/1005/sys/src/9/port/devdraw.c:1823,1829
1997/1101    
 
		/* top or bottom windows: 't' top[1] nw[2] n*id[4] */ 
		case 't': 
1999/1005    
			printmesg(fmt="bsL", a, 0); 
1997/1101    
			m = 1+1+2; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1723,17291999/1005/sys/src/9/port/devdraw.c:1853,1859
1997/1101    
				memltofrontn(lp, nw); 
			else 
				memltorearn(lp, nw); 
			if(lp[0]->layer->screen->image->data == screenimage.data) 
1999/1005    
			if(lp[0]->layer->screen->image->data == screenimage->data) 
1997/1101    
				for(j=0; j<nw; j++) 
					addflush(lp[j]->layer->screenr); 
			ll = drawlookup(client, BGLONG(a+1+1+2), 1); 
1999/0716/sys/src/9/port/devdraw.c:1735,17481999/1005/sys/src/9/port/devdraw.c:1865,1883
1997/1101    
 
		/* visible: 'v' */ 
		case 'v': 
1999/1005    
			printmesg(fmt="", a, 0); 
1997/1101    
			m = 1; 
			drawflush(); 
			continue; 
 
		/* write: 'w' id[4] R[4*4] data[x*1] */ 
		/* write from compressed data: 'W' id[4] R[4*4] data[x*1] */ 
		case 'w': 
		case 'W': 
1999/1005    
		/* old write: 'w' id[4] R[4*4] data[x*1] */ 
		/* old write from compressed data: 'W' id[4] R[4*4] data[x*1] */ 
		/* new write: 'y' id[4] R[4*4] data[x*1] */ 
		/* new write from compressed data: 'Y' id[4] R[4*4] data[x*1] */ 
		case 'y': 
		case 'Y': 
			printmesg(fmt="LR", a, 0); 
		//	iprint("load %c\n", *a); 
1997/1101    
			m = 1+4+4*4; 
			if(n < m) 
				error(Eshortdraw); 
1999/0716/sys/src/9/port/devdraw.c:1751,17571999/1005/sys/src/9/port/devdraw.c:1886,1892
1997/1101    
			drawrectangle(&r, a+5); 
			if(!rectinrect(r, dst->r)) 
				error(Ewriteoutside); 
			y = memload(dst, r, a+m, n-m, *a=='W'); 
1999/1005    
			y = memload(dst, r, a+m, n-m, *a=='Y'); 
1997/1101    
			if(y < 0) 
				error("bad writeimage call"); 
			dstflush(dstid, dst, r); 
1999/0716/sys/src/9/port/devdraw.c:1759,17641999/1005/sys/src/9/port/devdraw.c:1894,1900
1997/1101    
			continue; 
		} 
	} 
1999/1005    
	poperror(); 
1997/1101    
} 
 
Dev drawdevtab = { 
1999/0716/sys/src/9/port/devdraw.c:1829,18351999/1005/sys/src/9/port/devdraw.c:1965,1972
1999/0128    
		return; 
	} 
1997/1101    
	p = sdraw.savemap; 
	nc = 1<<(1<<screenimage.ldepth); 
1999/1005    
	nc = screenimage->depth > 8 ? 256 : 1<<screenimage->depth; 
 
1997/1101    
	if(blank == 0)	/* turn screen on */ 
		for(i=0; i<nc; i++, p+=3) 
			setcolor(i, p[0], p[1], p[2]); 


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