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

1992/0621/port/devbit.c (diff list | history)

1992/0605/sys/src/9/port/devbit.c:37,591992/0621/sys/src/9/port/devbit.c:37,62 (short | long | prev | next)
1990/0329    
 */ 
 
/* 
1990/0902    
 * Some fields in GBitmaps are overloaded: 
1990/0327    
 *	ldepth = -1 means free. 
 *	base is next pointer when free. 
 * Arena is a word containing N, followed by a pointer to its bitmap, 
 * followed by N blocks.  The bitmap pointer is zero if block is free.  
1992/0621    
 * followed by N blocks.  The bitmap pointer is zero if block is free. 
 * bit.map is an array of pointers to GBitmaps.  The GBitmaps are 
 * freed individually and their corresponding entries in bit.map are zeroed. 
 * The index into bit.map is the Bitmap id as seen in libg.  Subfonts and 
 * fonts are handled similarly. 
1990/0327    
 */ 
1990/0324    
 
1990/05313    
struct 
{ 
1990/0324    
	Ref; 
1990/0902    
	GBitmap	*map;		/* arena */ 
	GBitmap	*free;		/* free list */ 
1992/0621    
	GBitmap	**map;		/* indexed array */ 
	int	nmap;		/* number allocated */ 
1990/0327    
	ulong	*words;		/* storage */ 
	ulong	nwords;		/* total in arena */ 
	ulong	*wfree;		/* pointer to next free word */ 
1992/0209    
	GFont *font;		/* arena; looked up linearly BUG */ 
	GSubfont *subfont;	/* arena; looked up linearly BUG */ 
1992/0621    
	GFont	**font;		/* indexed array */ 
	int	nfont;		/* number allocated */ 
	GSubfont**subfont;	/* indexed array */ 
	int	nsubfont;	/* number allocated */ 
1990/0327    
	int	lastid;		/* last allocated bitmap id */ 
1992/0209    
	int	lastsubfid;	/* last allocated subfont id */ 
1990/0623    
	int	lastfid;	/* last allocated font id */ 
1992/0605/sys/src/9/port/devbit.c:64,731992/0621/sys/src/9/port/devbit.c:67,79
1991/0706    
	int	mid;		/* colormap read bitmap id */ 
1990/0324    
}bit; 
 
1992/0621    
#define	DMAP	32		/* delta increase in size of arrays */ 
1990/0327    
#define	FREE	0x80000000 
void	bitcompact(void); 
1992/0209    
GBitmap*bitalloc(Rectangle, int); 
1992/0621    
int	bitalloc(Rectangle, int); 
1990/0902    
void	bitfree(GBitmap*); 
1992/0621    
void	fontfree(GFont*); 
void	subfontfree(GSubfont*); 
1992/0209    
void	bitstring(GBitmap*, Point, GFont*, uchar*, long, Fcode); 
void	bitloadchar(GFont*, int, GSubfont*, int); 
1990/0912    
extern	GBitmap	gscreen; 
1992/0605/sys/src/9/port/devbit.c:142,1481992/0621/sys/src/9/port/devbit.c:148,154
1990/0324    
}; 
 
#define	NBIT	(sizeof bitdir/sizeof(Dirtab)) 
1990/0629    
#define	NINFO	257 
1992/0621    
#define	NINFO	8192 
1990/0324    
 
void 
bitreset(void) 
1992/0605/sys/src/9/port/devbit.c:151,1811992/0621/sys/src/9/port/devbit.c:157,178
1990/0902    
	GBitmap *bp; 
1991/0706    
	ulong r; 
1990/0327    
 
1990/0902    
	bit.map = ialloc(conf.nbitmap * sizeof(GBitmap), 0); 
1990/0327    
	for(i=0,bp=bit.map; i<conf.nbitmap; i++,bp++){ 
		bp->ldepth = -1; 
		bp->base = (ulong*)(bp+1); 
	} 
	bp--; 
	bp->base = 0; 
1990/0912    
	bit.map[0] = gscreen;	/* bitmap 0 is screen */ 
1992/0621    
	bit.map = smalloc(DMAP*sizeof(GBitmap*)); 
	bit.nmap = DMAP; 
1991/0706    
	getcolor(0, &r, &r, &r); 
	if(r == 0) 
		flipping = 1; 
1990/0327    
	bit.free = bit.map+1; 
	bit.lastid = -1; 
1992/0209    
	bit.lastsubfid = -1; 
1990/0623    
	bit.lastfid = -1; 
1990/0327    
	bit.words = ialloc(conf.nbitbyte, 0); 
1992/0621    
print("bitreset %lux\n", bit.words); 
1990/0327    
	bit.nwords = conf.nbitbyte/sizeof(ulong); 
	bit.wfree = bit.words; 
1992/0209    
	bit.subfont = ialloc(conf.nsubfont * sizeof(GSubfont), 0); 
	bit.subfont[0] = *defont; 
	bit.font = ialloc(conf.nfont * sizeof(GFont), 0); 
1992/0208    
	for(i=1; i<conf.nsubfont; i++) 
1992/0209    
		bit.subfont[i].info = ialloc((NINFO+1)*sizeof(Fontchar), 0); 
	for(i=0; i<conf.nfont; i++) 
		bit.font[i].ldepth = -1; 
1992/0621    
	bit.font = smalloc(DMAP*sizeof(GFont*)); 
	bit.nfont = DMAP; 
	bit.subfont = smalloc(DMAP*sizeof(GSubfont*)); 
	bit.nsubfont = DMAP; 
1990/05313    
	Cursortocursor(&arrow); 
1990/0324    
} 
 
1992/0605/sys/src/9/port/devbit.c:186,1921992/0621/sys/src/9/port/devbit.c:183,189
1990/0324    
	unlock(&bit); 
1991/0706    
	if(gscreen.ldepth > 3) 
		cursorback.ldepth = 0; 
	else { 
1992/0621    
	else{ 
1991/0706    
		cursorback.ldepth = gscreen.ldepth; 
		cursorback.width = ((16 << gscreen.ldepth) + 31) >> 5; 
	} 
1992/0605/sys/src/9/port/devbit.c:196,2021992/0621/sys/src/9/port/devbit.c:193,198
1990/0324    
Chan* 
bitattach(char *spec) 
{ 
1992/0604    
	bit.map[0] = gscreen;	/* bitmap 0 is screen */ 
1990/0324    
	return devattach('b', spec); 
} 
 
1992/0605/sys/src/9/port/devbit.c:221,2291992/0621/sys/src/9/port/devbit.c:217,227
1990/0324    
	devstat(c, db, bitdir, NBIT, devgen); 
} 
 
Chan * 
1992/0621    
Chan* 
1990/0324    
bitopen(Chan *c, int omode) 
{ 
1992/0621    
	GBitmap *b; 
 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/0324    
		if(omode != OREAD) 
1990/11211    
			error(Eperm); 
1992/0605/sys/src/9/port/devbit.c:233,2391992/0621/sys/src/9/port/devbit.c:231,240
1990/0324    
			unlock(&bit); 
1990/11211    
			error(Einuse); 
1990/0324    
		} 
1992/0604    
		bit.map[0].clipr = gscreen.clipr; 
1992/0621    
		b = smalloc(sizeof(GBitmap)); 
		*b = gscreen; 
		bit.map[0] = b;			/* bitmap 0 is screen */ 
		bit.subfont[0] = defont;	/* subfont 0 is default */ 
1990/0327    
		bit.lastid = -1; 
1990/0623    
		bit.lastfid = -1; 
1992/0209    
		bit.lastsubfid = -1; 
1992/0605/sys/src/9/port/devbit.c:275,2981992/0621/sys/src/9/port/devbit.c:276,318
1990/0324    
void 
bitclose(Chan *c) 
{ 
1990/0327    
	int i; 
1990/0902    
	GBitmap *bp; 
1992/0208    
	GSubfont *fp; 
1992/0209    
	GFont *ffp; 
1992/0621    
	GBitmap *b, **bp, **ebp; 
	GSubfont *s, **sp, **esp; 
	GFont *f, **fp, **efp; 
1990/0327    
 
1990/11211    
	if(c->qid.path!=CHDIR && (c->flag&COPEN)){ 
1990/0329    
		lock(&bit); 
1990/0327    
		if(--bit.ref == 0){ 
			for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) 
				if(bp->ldepth >= 0) 
					bitfree(bp); 
1992/0209    
			for(i=1,fp=&bit.subfont[1]; i<conf.nsubfont; i++,fp++) 
1990/0623    
				fp->bits = 0; 
1992/0209    
			for(i=0,ffp=&bit.font[0]; i<conf.nfont; i++,ffp++){ 
				ffp->b = 0; 
				ffp->ldepth = -1; 
1992/0621    
			/* 0th bitmap, screen, has no special storage */ 
			bp = bit.map; 
			free(*bp); 
			*bp = 0; 
			ebp = &bit.map[bit.nmap]; 
			bp++; 
			for(; bp<ebp; bp++){ 
				b = *bp; 
				if(b){ 
					bitfree(b); 
					*bp = 0; 
				} 
1992/0209    
			} 
bit.font[0].ldepth=0;/*BUG */ 
1992/0621    
			/* 0th subfont, defont, points to real storage */ 
			esp = &bit.subfont[bit.nsubfont]; 
			for(sp=&bit.subfont[1]; sp<esp; sp++){ 
				s = *sp; 
				if(s){ 
					subfontfree(s); 
					*sp = 0; 
				} 
			} 
			efp = &bit.font[bit.nfont]; 
			for(fp=bit.font; fp<efp; fp++){ 
				f = *fp; 
				if(f){ 
					fontfree(f); 
					*fp = 0; 
				} 
			} 
1990/0327    
		} 
1990/0324    
		unlock(&bit); 
	} 
1992/0605/sys/src/9/port/devbit.c:440,4461992/0621/sys/src/9/port/devbit.c:460,469
1991/0706    
			 * read colormap: 
			 *	data		12*(2**bitmapdepth) 
			 */ 
			l = (1<<bit.map[bit.mid].ldepth); 
1992/0621    
			src = bit.map[bit.mid]; 
			if(src == 0) 
				error(Ebadbitmap); 
			l = (1<<src->ldepth); 
1991/0706    
			nw = 1 << l; 
			if(n < 12*nw) 
				error(Ebadblt); 
1992/0605/sys/src/9/port/devbit.c:467,4741992/0621/sys/src/9/port/devbit.c:490,497
1991/0706    
			 * read bitmap: 
1990/0613    
			 *	data		bytewidth*(maxy-miny) 
			 */ 
			src = &bit.map[bit.rid]; 
			if(src->ldepth<0) 
1992/0621    
			src = bit.map[bit.rid]; 
			if(src == 0) 
1990/11211    
				error(Ebadbitmap); 
1990/0613    
			off = 0; 
			if(bit.rid == 0) 
1992/0605/sys/src/9/port/devbit.c:558,5721992/0621/sys/src/9/port/devbit.c:581,595
1990/0329    
	uchar *p, *q; 
1991/0706    
	long m, v, miny, maxy, minx, maxx, t, x, y; 
	ulong l, nw, ws, rv; 
	int off, isoff, i, ok; 
1992/0621    
	int off, isoff, i, j, ok; 
1990/06111    
	Point pt, pt1, pt2; 
1990/0324    
	Rectangle rect; 
1990/05313    
	Cursor curs; 
1991/0706    
	Fcode fc; 
1990/0623    
	Fontchar *fcp; 
1990/0902    
	GBitmap *bp, *src, *dst; 
1992/0208    
	GSubfont *f; 
1992/0209    
	GFont *ff; 
1992/0621    
	GBitmap *b, *src, *dst, *bp; 
	GSubfont *f, **fp; 
	GFont *ff, **ffp; 
1990/0324    
 
1990/11211    
	if(c->qid.path == CHDIR) 
		error(Eisdir); 
1992/0605/sys/src/9/port/devbit.c:582,5871992/0621/sys/src/9/port/devbit.c:605,611
1990/0721    
	} 
1990/0324    
	p = va; 
	m = n; 
1992/0621    
	SET(src, dst, f, ff); 
1990/0327    
	while(m > 0) 
		switch(*p){ 
1990/0329    
		default: 
1992/0605/sys/src/9/port/devbit.c:607,6141992/0621/sys/src/9/port/devbit.c:631,637
1990/0327    
			rect.max.y = GLONG(p+14); 
1991/0423    
			if(Dx(rect) < 0 || Dy(rect) < 0) 
				error(Ebadblt); 
1992/0209    
			bp = bitalloc(rect, v); 
1990/0327    
			bit.lastid = bp-bit.map; 
1992/0621    
			bit.lastid = bitalloc(rect, v); 
1990/0327    
			m -= 18; 
			p += 18; 
			break; 
1992/0605/sys/src/9/port/devbit.c:627,6341992/0621/sys/src/9/port/devbit.c:650,656
1990/11211    
				error(Ebadblt); 
1991/0706    
			fc = GSHORT(p+29) & 0xF; 
			v = GSHORT(p+11); 
			src = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || src->ldepth < 0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (src=bit.map[v])==0) 
1991/0706    
				error(Ebadbitmap); 
			off = 0; 
			if(v == 0){ 
1992/0605/sys/src/9/port/devbit.c:637,6441992/0621/sys/src/9/port/devbit.c:659,665
1991/0706    
				off = 1; 
			} 
1990/0327    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth < 0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1991/0706    
			if(v == 0){ 
				if(flipping) 
1992/0605/sys/src/9/port/devbit.c:703,7121992/0621/sys/src/9/port/devbit.c:724,733
1990/0327    
			if(m < 3) 
1990/11211    
				error(Ebadblt); 
1990/0327    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0327    
			bitfree(dst); 
1992/0621    
			bit.map[v] = 0; 
1990/0327    
			m -= 3; 
			p += 3; 
1990/0604    
			break; 
1992/0605/sys/src/9/port/devbit.c:720,7291992/0621/sys/src/9/port/devbit.c:741,750
1990/0623    
			if(m < 3) 
1990/11211    
				error(Ebadblt); 
1990/0623    
			v = GSHORT(p+1); 
1992/0209    
			f = &bit.subfont[v]; 
1992/0208    
			if(v<0 || v>=conf.nsubfont || f->bits==0) 
1992/0621    
			if(v<0 || v>=bit.nsubfont || (f=bit.subfont[v])==0) 
1990/11211    
				error(Ebadfont); 
1990/0623    
			f->bits = 0; 
1992/0621    
			subfontfree(f); 
			bit.subfont[v] = 0; 
1990/0623    
			m -= 3; 
			p += 3; 
			break; 
1992/0605/sys/src/9/port/devbit.c:737,7491992/0621/sys/src/9/port/devbit.c:758,767
1992/0209    
			if(m < 3) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			ff = &bit.font[v]; 
			if(v<0 || v>=conf.nfont || ff->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nfont || (ff=bit.font[v])==0) 
1992/0209    
				error(Ebadfont); 
			if(ff->b) 
				bitfree(ff->b); 
			ff->b = 0; 
			ff->ldepth = -1; 
1992/0621    
			fontfree(ff); 
			bit.font[v] = 0; 
1992/0209    
			m -= 3; 
			p += 3; 
			break; 
1992/0605/sys/src/9/port/devbit.c:776,7981992/0621/sys/src/9/port/devbit.c:794,821
1990/0623    
			v = GSHORT(p+1); 
			if(v<0 || v>NINFO || m<7+6*(v+1))	/* BUG */ 
1990/11211    
				error(Ebadblt); 
1992/0208    
			for(i=1; i<conf.nsubfont; i++) 
1992/0209    
				if(bit.subfont[i].bits == 0) 
1992/0621    
			for(i=1; i<bit.nsubfont; i++) 
				if(bit.subfont[i] == 0) 
1992/0209    
					goto subfontfound; 
1990/11211    
			error(Enofont); 
1992/0621    
			fp = bit.subfont; 
			bit.subfont = smalloc((bit.nsubfont+DMAP)*sizeof(GSubfont*)); 
			memmove(bit.subfont, fp, bit.nsubfont*sizeof(GSubfont*)); 
			free(fp); 
			bit.nsubfont += DMAP; 
1992/0209    
		subfontfound: 
			f = &bit.subfont[i]; 
1992/0621    
			f = smalloc(sizeof(GSubfont)); 
			bit.subfont[i] = f; 
			f->info = smalloc((v+1)*sizeof(Fontchar)); 
1990/0623    
			f->n = v; 
			f->height = p[3]; 
			f->ascent = p[4]; 
			v = GSHORT(p+5); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0623    
			m -= 7; 
			p += 7; 
			fcp = f->info; 
			for(i=0; i<=f->n; i++,fcp++){ 
1992/0621    
			for(j=0; j<=f->n; j++,fcp++){ 
1990/0623    
				fcp->x = GSHORT(p); 
				fcp->top = p[2]; 
				fcp->bottom = p[3]; 
1992/0605/sys/src/9/port/devbit.c:802,8081992/0621/sys/src/9/port/devbit.c:825,831
1990/0623    
				p += 6; 
				m -= 6; 
			} 
1992/0209    
			bit.lastsubfid = f - bit.subfont; 
1992/0621    
			bit.lastsubfid = i; 
1990/0623    
			f->bits = dst; 
			break; 
 
1992/0605/sys/src/9/port/devbit.c:820,8271992/0621/sys/src/9/port/devbit.c:843,849
1990/06111    
			if(m < 22) 
1990/11211    
				error(Ebadblt); 
1990/06111    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/06111    
			off = 0; 
1991/0706    
			fc = GSHORT(p+20) & 0xF; 
1992/0605/sys/src/9/port/devbit.c:854,8611992/0621/sys/src/9/port/devbit.c:876,882
1991/0706    
			if(m < 3) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1991/0706    
				error(Ebadbitmap); 
			bit.mid = v; 
			m -= 3; 
1992/0605/sys/src/9/port/devbit.c:876,8871992/0621/sys/src/9/port/devbit.c:897,914
1992/0209    
			v = GSHORT(p+3); 
			if(v < 0) 
				error(Ebadblt); 
			for(i=0; i<conf.nfont; i++) 
				if(bit.font[i].ldepth < 0) 
1992/0621    
			for(i=0; i<bit.nfont; i++) 
				if(bit.font[i] == 0) 
1992/0209    
					goto fontfound; 
			error(Enofont); 
1992/0621    
			ffp = bit.font; 
			bit.font = smalloc((bit.nfont+DMAP)*sizeof(GFont*)); 
			memmove(bit.font, ffp, bit.nfont*sizeof(GFont*)); 
			free(ffp); 
			bit.nfont += DMAP; 
1992/0209    
		fontfound: 
			ff = &bit.font[i]; 
1992/0621    
			ff = smalloc(sizeof(GFont)); 
			bit.font[i] = ff; 
			ff = bit.font[i]; 
1992/0209    
			ff->height = p[1]; 
			ff->ascent = p[2]; 
			ff->ldepth = v; 
1992/0605/sys/src/9/port/devbit.c:889,8951992/0621/sys/src/9/port/devbit.c:916,922
1992/0209    
			ff->b = 0; 
			m -= 5; 
			p += 5; 
			bit.lastfid = ff - bit.font; 
1992/0621    
			bit.lastfid = i; 
1992/0209    
			break; 
 
1990/0722    
		case 'p': 
1992/0605/sys/src/9/port/devbit.c:905,9121992/0621/sys/src/9/port/devbit.c:932,938
1990/0722    
			if(m < 14) 
1990/11211    
				error(Ebadblt); 
1990/0722    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0722    
			off = 0; 
1991/0706    
			fc = GSHORT(p+12) & 0xF; 
1992/0605/sys/src/9/port/devbit.c:937,9441992/0621/sys/src/9/port/devbit.c:963,969
1992/0604    
			if(m < 19) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1992/0604    
				error(Ebadbitmap); 
			rect.min.x = GLONG(p+3); 
			rect.min.y = GLONG(p+7); 
1992/0605/sys/src/9/port/devbit.c:963,9701992/0621/sys/src/9/port/devbit.c:988,994
1990/0613    
			if(m < 11) 
1990/11211    
				error(Ebadblt); 
1990/0613    
			v = GSHORT(p+1); 
			src = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || src->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (src=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0613    
			miny = GLONG(p+3); 
			maxy = GLONG(p+7); 
1992/0605/sys/src/9/port/devbit.c:990,9971992/0621/sys/src/9/port/devbit.c:1014,1020
1990/0329    
			if(m < 16) 
1990/11211    
				error(Ebadblt); 
1990/0329    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0504    
			off = 0; 
1991/0706    
			fc = GSHORT(p+13) & 0xF; 
1992/0605/sys/src/9/port/devbit.c:1003,10101992/0621/sys/src/9/port/devbit.c:1026,1032
1990/0329    
			pt.x = GLONG(p+3); 
			pt.y = GLONG(p+7); 
			v = GSHORT(p+11); 
1992/0209    
			f = &bit.subfont[v]; 
1992/0208    
			if(v<0 || v>=conf.nsubfont || f->bits==0 || f->bits->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nsubfont || (f=bit.subfont[v])==0) 
1990/11211    
				error(Ebadblt); 
1990/0329    
			p += 15; 
			m -= 15; 
1992/0605/sys/src/9/port/devbit.c:1033,10401992/0621/sys/src/9/port/devbit.c:1055,1061
1990/0329    
			if(m < 23) 
1990/11211    
				error(Ebadblt); 
1990/0329    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0504    
			off = 0; 
1991/0706    
			fc = GSHORT(p+21) & 0xF; 
1992/0605/sys/src/9/port/devbit.c:1048,10551992/0621/sys/src/9/port/devbit.c:1069,1075
1990/0329    
			rect.max.x = GLONG(p+11); 
			rect.max.y = GLONG(p+15); 
			v = GSHORT(p+19); 
			src = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || src->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (src=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1991/0701    
			if(off && !isoff){ 
				cursoroff(1); 
1992/0605/sys/src/9/port/devbit.c:1074,10811992/0621/sys/src/9/port/devbit.c:1094,1100
1992/0209    
			if(m < 17) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1992/0209    
				error(Ebadbitmap); 
			off = 0; 
			fc = GSHORT(p+13) & 0xF; 
1992/0605/sys/src/9/port/devbit.c:1087,10941992/0621/sys/src/9/port/devbit.c:1106,1112
1992/0209    
			pt.x = GLONG(p+3); 
			pt.y = GLONG(p+7); 
			v = GSHORT(p+11); 
			ff = &bit.font[v]; 
			if(v<0 || v>=conf.nfont || ff->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nfont || (ff=bit.font[v])==0) 
1992/0209    
				error(Ebadblt); 
			l = GSHORT(p+15)*2; 
			p += 17; 
1992/0605/sys/src/9/port/devbit.c:1114,11211992/0621/sys/src/9/port/devbit.c:1132,1138
1992/0209    
			if(m < 5) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			ff = &bit.font[v]; 
			if(v<0 || v>=conf.nfont || ff->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nfont || (ff=bit.font[v])==0) 
1992/0209    
				error(Ebadblt); 
			/* 
			 * memset not necessary but helps avoid 
1992/0605/sys/src/9/port/devbit.c:1127,11331992/0621/sys/src/9/port/devbit.c:1144,1152
1992/0209    
				bitfree(ff->b); 
			ff->width = GSHORT(p+3); 
			ff->b = 0; 
			ff->b = bitalloc(Rect(0, 0, (NFCACHE+NFLOOK)*ff->width, ff->height), ff->ldepth); 
1992/0621    
			i = bitalloc(Rect(0, 0, (NFCACHE+NFLOOK)*ff->width, ff->height), ff->ldepth); 
			ff->b = bit.map[i]; 
			bit.map[i] = 0;	/* disconnect it from GBitmap space */ 
1992/0209    
			p += 5; 
			m -= 5; 
			break; 
1992/0605/sys/src/9/port/devbit.c:1144,11511992/0621/sys/src/9/port/devbit.c:1163,1169
1990/0329    
			if(m < 11) 
1990/11211    
				error(Ebadblt); 
1990/0329    
			v = GSHORT(p+1); 
			dst = &bit.map[v]; 
1990/0623    
			if(v<0 || v>=conf.nbitmap || dst->ldepth<0) 
1992/0621    
			if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) 
1990/11211    
				error(Ebadbitmap); 
1990/0504    
			off = 0; 
			if(v == 0) 
1992/0605/sys/src/9/port/devbit.c:1216,12301992/0621/sys/src/9/port/devbit.c:1234,1246
1992/0209    
			if(m < 9) 
				error(Ebadblt); 
			v = GSHORT(p+1); 
			ff = &bit.font[v]; 
			if(v<0 || v>=conf.nfont || ff->ldepth<0 || ff->b==0) 
1992/0621    
			if(v<0 || v>=conf.nfont || (ff=bit.font[v])==0) 
1992/0209    
				error(Ebadblt); 
			l = GSHORT(p+3); 
			if(l >= NFCACHE+NFLOOK) 
				error(Ebadblt); 
			v = GSHORT(p+5); 
			f = &bit.subfont[v]; 
			if(v<0 || v>=conf.nsubfont || f->bits->ldepth<0) 
1992/0621    
			if(v<0 || v>=conf.nsubfont || (f=bit.subfont[v])==0) 
1992/0209    
				error(Ebadblt); 
			nw = GSHORT(p+7); 
			if(nw >= f->n) 
1992/0605/sys/src/9/port/devbit.c:1249,12551992/0621/sys/src/9/port/devbit.c:1265,1271
1991/0706    
				error(Ebadbitmap); 
			m -= 3; 
			p += 3; 
			nw = 1 << (1 << bit.map[v].ldepth); 
1992/0621    
			nw = 1 << (1 << gscreen.ldepth); 
1991/0706    
			if(m < 12*nw) 
				error(Ebadblt); 
			ok = 1; 
1992/0605/sys/src/9/port/devbit.c:1273,12931992/0621/sys/src/9/port/devbit.c:1289,1308
1990/0324    
	return n; 
} 
 
1992/0209    
GBitmap* 
1992/0621    
int 
1992/0209    
bitalloc(Rectangle rect, int ld) 
{ 
	GBitmap *bp; 
1992/0621    
	GBitmap *b, **bp, **ep; 
1992/0209    
	ulong l, ws, nw; 
	long t; 
1992/0621    
	int i; 
1992/0209    
 
	if(bit.free == 0) 
		error(Enobitmap); 
1992/0621    
print("bitalloc %lux\n", bit.wfree); 
1992/0209    
	ws = 1<<(5-ld);	/* pixels per word */ 
1992/0519    
	if(rect.min.x >= 0) { 
1992/0621    
	if(rect.min.x >= 0){ 
1992/0519    
		l = (rect.max.x+ws-1)/ws; 
		l -= rect.min.x/ws; 
	} 
1992/0209    
	else{	/* make positive before divide */ 
1992/0621    
	}else{	/* make positive before divide */ 
1992/0209    
		t = (-rect.min.x)+ws-1; 
		t = (t/ws)*ws; 
		l = (t+rect.max.x+ws-1)/ws; 
1992/0605/sys/src/9/port/devbit.c:1298,13341992/0621/sys/src/9/port/devbit.c:1313,1375
1992/0209    
		if(bit.wfree+2+nw > bit.words+bit.nwords) 
			error(Enobitstore); 
	} 
	bp = bit.free; 
	bit.free = (GBitmap*)(bp->base); 
1992/0621    
	b = smalloc(sizeof(GBitmap)); 
1992/0209    
	*bit.wfree++ = nw; 
	*bit.wfree++ = (ulong)bp; 
	bp->base = bit.wfree; 
	memset(bp->base, 0, nw*sizeof(ulong)); 
1992/0621    
	*bit.wfree++ = (ulong)b; 
	b->base = bit.wfree; 
	memset(b->base, 0, nw*sizeof(ulong)); 
1992/0209    
	bit.wfree += nw; 
	bp->zero = l*rect.min.y; 
1992/0621    
	b->zero = l*rect.min.y; 
1992/0209    
	if(rect.min.x >= 0) 
		bp->zero += rect.min.x/ws; 
1992/0621    
		b->zero += rect.min.x/ws; 
1992/0209    
	else 
		bp->zero -= (-rect.min.x+ws-1)/ws; 
	bp->zero = -bp->zero; 
	bp->width = l; 
	bp->ldepth = ld; 
	bp->r = rect; 
1992/0604    
	bp->clipr = rect; 
1992/0209    
	bp->cache = 0; 
	return bp; 
1992/0621    
		b->zero -= (-rect.min.x+ws-1)/ws; 
	b->zero = -b->zero; 
	b->width = l; 
	b->ldepth = ld; 
	b->r = rect; 
	b->clipr = rect; 
	b->cache = 0; 
	/* worth doing better than linear lookup? */ 
	ep = bit.map+bit.nmap; 
	for(bp=bit.map; bp<ep; bp++) 
		if(*bp == 0) 
			break; 
	if(bp == ep){ 
		bp = bit.map; 
		bit.map = smalloc((bit.nmap+DMAP)*sizeof(GBitmap*)); 
		memmove(bit.map, bp, bit.nmap*sizeof(GBitmap*)); 
		free(bp); 
		bp = bit.map+bit.nmap; 
		bit.nmap += DMAP; 
	} 
	*bp = b; 
	return bp-bit.map; 
1992/0209    
} 
 
1990/0324    
void 
1990/0902    
bitfree(GBitmap *bp) 
1992/0621    
bitfree(GBitmap *b) 
1990/0327    
{ 
1990/05313    
	bp->base[-1] = 0; 
1990/0327    
	bp->ldepth = -1; 
	bp->base = (ulong*)bit.free; 
	bit.free = bp; 
1992/0621    
	b->base[-1] = 0; 
	free(b); 
1990/0327    
} 
 
1992/0209    
void 
1992/0621    
fontfree(GFont *f) 
{ 
	if(f->b) 
		bitfree(f->b); 
	free(f); 
} 
 
void 
subfontfree(GSubfont *s) 
{ 
	free(s->info); 
	free(s); 
} 
 
void 
1992/0209    
bitstring(GBitmap *bp, Point pt, GFont *f, uchar *p, long l, Fcode fc) 
{ 
	int full; 
1992/0605/sys/src/9/port/devbit.c:1395,14101992/0621/sys/src/9/port/devbit.c:1436,1441
1992/0209    
} 
 
1990/08101    
QLock	bitlock; 
                 
1992/0209    
GBitmap* 
1990/08101    
id2bit(int k) 
{ 
1990/0902    
	GBitmap *bp; 
1990/08101    
	bp = &bit.map[k]; 
	if(k<0 || k>=conf.nbitmap || bp->ldepth < 0) 
1990/11211    
		error(Ebadbitmap); 
1990/08101    
	return bp; 
} 
 
1990/0327    
void 
bitcompact(void) 


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