henesyinit from p9f47575dc5 years agoHistory
531 lines · 13.4 KB · C
RawDownload
#include <u.h>#include <libc.h>#include "system.h"#ifndef Plan9#include "stdio.h"#include "njerq.h"#include "object.h" char *beg_mem; Bitmap *balloc(Rectangle r, int i){	register Bitmap *b;	int j = i+1;	b = (Bitmap *) vm_alloc(sizeof(Bitmap));	if(b == (Bitmap *)NULL){		fprintf(stderr,"failed to allocate bitmap\n");		pserror("big problems", "balloc");	}	b->r = r;	b->width = ((r.max.x + 31) >> 5) - (r.min.x >> 5);	b->base = (Word *) vm_alloc(j*b->width*(r.max.y-r.min.y)*4);	if(b->base == (Word *)NULL){		fprintf(stderr,"failed to allocate bitmap base %d\n",			b->width*(r.max.y-r.min.y)*4);		pserror("big problems", "balloc");	}	rectf(b, b->r, Zero);	return(b);}static int fcount;static int nomore=0;Bitmap *cachealloc(Rectangle r){	register Bitmap *b;	fcount++;	if(nomore)		return(0);	b = (Bitmap *) malloc(sizeof(Bitmap));	if((char *)b >=beg_mem){		fprintf(stderr,"ran out of cache memory %d fonts\n",fcount);		nomore = 1;		return(0);	}	b->r = r;	b->width = ((r.max.x + 31) >> 5) - (r.min.x >> 5);	b->base = (Word *) malloc(b->width*(r.max.y-r.min.y)*4);	if((char *)b->base >= beg_mem){		fprintf(stderr,"ran out of cache memory %d\n",b->width*(r.max.y-r.min.y)*4);		nomore = 1;		return(0);	}	rectf(b, b->r, Zero);	return(b);} #define addr(b,p) b->base + (b->width*(p.y-b->r.min.y) + (((p.x>>5)<<5)/32) - (b->r.min.x>>5)) #ifdef AHMDAL#define DOIT(src,roff,xmask,shift) ((*src<<roff)|((*(src+1)>>shift)&xmask))#endif#ifdef SUN#define DOIT(src,roff,xmask,shift) ((*src<<roff)|((*(src+1)>>shift)&xmask))#endif#ifdef I386		/* deal with inability to shift by 32 */#define DOIT(src,roff,xmask,shift) (shift==32?((*src>>roff)&xmask):(roff==32?(*(src+1)<<shift):(((*src>>roff)&xmask)|(*(src+1)<<shift))))#endif#ifndef DOIT#define DOIT(src,roff,xmask,shift) (((*src>>roff)&xmask)|(*(src+1)<<shift))#endif #ifndef VAXRmask[33] = {	 037777777777,	      020000000000, 030000000000,	034000000000, 036000000000, 037000000000,	037400000000, 037600000000, 037700000000,	037740000000, 037760000000, 037770000000,	037774000000, 037776000000, 037777000000,	037777400000, 037777600000, 037777700000,	037777740000, 037777760000, 037777770000,	037777774000, 037777776000, 037777777000,	037777777400, 037777777600, 037777777700,	037777777740, 037777777760, 037777777770,	037777777774, 037777777776, 037777777777 };Lmask[33] = {	037777777777, 017777777777, 007777777777,	003777777777, 001777777777, 000777777777,	000377777777, 000177777777, 000077777777,	000037777777, 000017777777, 000007777777,	000003777777, 000001777777, 000000777777,	000000377777, 000000177777, 000000077777,	000000037777, 000000017777, 000000007777,	000000003777, 000000001777, 000000000777,	000000000377, 000000000177, 000000000077,	000000000037, 000000000017, 000000000007,	000000000003, 1, 0};#elselong Lmask[] = {	0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8,	0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80,	0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800,	0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000,	0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000,	0xfff00000, 0xffe00000, 0xffc00000, 0xff800000,	0xff000000, 0xfe000000, 0xfc000000, 0xf8000000,	0xf0000000, 0xe0000000, 0xc0000000, 0x80000000};long Rmask[] = {	0xffffffff, 0x00000001, 0x00000003, 0x00000007,	0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,	0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,	0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,	0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,	0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,	0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,	0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff};mask[32] = {037777777777,017777777777, 07777777777,	03777777777, 01777777777,0777777777,	0377777777, 0177777777,077777777,	037777777, 017777777,07777777,	03777777, 01777777,0777777,	0377777, 0177777,077777,	037777, 017777,07777,	03777, 01777,0777,	0377, 0177,077,	037, 017,07,	03, 01};#endifvoidbitblt(Bitmap *dm, Point p, Bitmap *sm, Rectangle r, Fcode f){	register i,j,roff,m;	/* r11, r10, r9, r8 */	register long *source,*dest;	/* r7, r6 */	register long lmask,rmask;	register long xmask;	int shift;	int nw,w,h,sw,dw,left=0;	long *lsource,*ldest;	register Bitmap *b = dm;	Point dp;	w = r.max.x - r.min.x;	h = r.max.y - r.min.y;	if(w <= 0 || h <= 0){		if(mdebug)fprintf(stderr,"bad bitblt (%d %d) to (%d %d)\n",			r.min.x,r.min.y,r.max.x,r.max.y);		return;	}	dp = Pt(p.x+w,p.y+h);	/* clip to destination bitmap */	if ((i = p.x - b->r.min.x) < 0) {		p.x -= i;		r.min.x -= i;	}	if ((i = p.y - b->r.min.y) < 0) {		p.y -= i;		r.min.y -= i;	}	if ((i = b->r.max.x - dp.x) < 0)		r.max.x += i;	if ((i = b->r.max.y - dp.y) < 0)		r.max.y += i;	/* recompute loop numbers */	w = r.max.x - r.min.x;	h = r.max.y - r.min.y;	nw = ((p.x+w-1)>>5) - (p.x>>5) - 1;	lmask = Lmask[p.x & 0x1f];	rmask = Rmask[(p.x+w) & 0x1f];	sw = sm->width;	dw = dm->width;	if (sm == dm) {		/* may have to change loop order */		if (r.min.y < p.y) {			r.min.y += h-1;			p.y += h-1;			sw = -sw;			dw = -dw;		}		if (r.min.x < p.x) {			left = 1;			r.min.x += w-1;			p.x += w-1;		}	}	roff = (r.min.x&0x1f) - (p.x&0x1f);	if (roff < 0) {		roff += 32;		r.min.x -= 32;	}	shift = 32-roff;#ifndef VAX	xmask = Lmask[shift];#else	xmask = mask[roff];#endif	if (sm != dm && f == (S|D)) {		if (nw < 0) {			lmask &= rmask;			source = addr(sm,r.min);			dest = addr(dm,p);			for (i = 0; i < h; i++) {				m = DOIT(source,roff,xmask,shift);				*dest |= lmask&m;				dest += dw;				source += sw;			}		}		else {			lsource = addr(sm,r.min);			ldest = addr(dm,p);			for (i = 0; i < h; i++, lsource += sw, ldest += dw) {				source = lsource;				dest = ldest;				m = DOIT(source,roff,xmask,shift);				source++;				*dest |= lmask&m;				dest++;				for (j = 0; j < nw; j++) {				m = DOIT(source,roff,xmask,shift);					source++;					*dest++ |= m;				}				m = DOIT(source,roff,xmask,shift);				*dest |= rmask&m;			}		}		return;	}	if (nw < 0) {		lmask &= rmask;		rmask = ~lmask;		source = addr(sm,r.min);		dest = addr(dm,p);		for (i = 0; i < h; i++) {			m = DOIT(source,roff,xmask,shift);			switch(f) {			case (S|D):				*dest |= lmask&m;				break;			case DandnotS:				*dest &= ~(lmask&m);				break;			case S:				*dest = lmask&m | rmask&*dest;			}			dest += dw;			source += sw;		}	}	else if (left == 0) {		lsource = addr(sm,r.min);		ldest = addr(dm,p);		for (i = 0; i < h; i++, lsource += sw, ldest += dw) {			source = lsource;			dest = ldest;			m = DOIT(source,roff,xmask,shift);			source++;			switch(f) {			case (S|D):				*dest |= lmask&m;				break;			case DandnotS:				*dest &= ~(lmask&m);				break;			case S:				*dest = lmask&m | (~lmask)&*dest;			}			dest++;			for (j = 0; j < nw; j++) {				m = DOIT(source,roff,xmask,shift);				source++;				switch(f) {				case (S|D):					*dest++ |= m;					break;				case DandnotS:					*dest++ &= ~m;					break;				case S:					*dest++ = m;				}			}			m = DOIT(source,roff,xmask,shift);			switch(f) {			case (S|D):				*dest |= rmask&m;				break;			case DandnotS:				*dest &= ~(rmask&m);				break;			case S:				*dest = rmask&m | (~rmask)&*dest;			}		}	}	else {		lsource = addr(sm,r.min);		ldest = addr(dm,p);		for (i = 0; i < h; i++, lsource += sw, ldest += dw) {			source = lsource;			dest = ldest;			m = DOIT(source,roff,xmask,shift);			source--;			switch(f) {			case (S|D):				*dest |= rmask&m;				break;			case DandnotS:				*dest &= ~(rmask&m);				break;			case S:				*dest = rmask&m | (~rmask)&*dest;			}			for (j = 0; j < nw; j++) {				m = DOIT(source,roff,xmask,shift);				source--;				switch(f) {				case (S|D):					*--dest |= m;					break;				case DandnotS:					*--dest &= ~m;					break;				case S:					*--dest = m;				}			}			m = DOIT(source,roff,xmask,shift);			dest--;			switch(f) {			case (S|D):				*dest |= lmask&m;				break;			case DandnotS:				*dest &= ~(lmask&m);				break;			case S:				*dest = lmask&m | (~lmask)&*dest;			}		}	}} Texture zeros;Texture ones = {	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,};Texture	grey[] ={ 	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF ,	0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF , 	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 ,	0xFFFFFFFF , 0x55555555 , 0xFFFFFFFF , 0x55555555 , 	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 ,	0xAAAAAAAA , 0x55555555 , 0xAAAAAAAA , 0x55555555 , 	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 ,	0xAAAAAAAA , 0x00000000 , 0xAAAAAAAA , 0x00000000 , 	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,	0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,}; void	/*general modified to only do STORE or CLEAR*/texture(Bitmap *b, Rectangle r, Texture t, Fcode f){	register i,j;	register long lmask,rmask;	register long *dest,*tp;	int w,h;	long *ldest;	lmask = Lmask[r.min.x & 0x1f];	rmask = Rmask[r.max.x & 0x1f];	i = r.max.x-r.min.x;	w = ((r.max.x-1)>>5) - (r.min.x>>5) - 1;	h = r.max.y - r.min.y;	if(i <= 0 || h <= 0 ){		if(mdebug)fprintf(stderr,"bad texture (%d %d) (%d %d)\n",			r.min.x,r.min.y,r.max.x,r.max.y);		return;	}	if(f == (S|D))f = S;	tp = &t[r.min.y & 0x1f];	if (w < 0) {		lmask &= rmask;		rmask = ~lmask;		dest = addr(b,r.min);		for (i = 0; i < h; i++) {			if(f == S)*dest = lmask&*tp++ | rmask&*dest;			else *dest &= ~(lmask&*tp++);			dest += b->width;			if (tp == &t[32])				tp = t;		}	}	else {		ldest = addr(b,r.min);		for (i = 0; i < h; i++, ldest += b->width) {			dest = ldest;			if(f == S)*dest = lmask&*tp | (~lmask)&*dest;			else *dest &= ~(lmask&*tp);			dest++;			for (j = 0; j < w; j++)				if(f == S)*dest++ = *tp;				else *dest++ &= ~*tp;			if(f == S)*dest = rmask&*tp | (~rmask)&*dest;			else *dest &= ~(rmask&*tp);			if (++tp == &t[32])				tp = t;		}	}} RectangleRect(int x, int y, int u, int v){	Rectangle r;	r.min.x = x;	r.min.y = y;	r.max.x = u;	r.max.y = v;	return(r);}PointPt(int x, int y){	Point p;	p.x = x;	p.y = y;	return(p);}#ifdef VAXlong bit[] = {	0x00000001, 0x00000002, 0x00000004, 0x00000008,	0x00000010, 0x00000020, 0x00000040, 0x00000080,	0x00000100, 0x00000200, 0x00000400, 0x00000800,	0x00001000, 0x00002000, 0x00004000, 0x00008000,	0x00010000, 0x00020000, 0x00040000, 0x00080000,	0x00100000, 0x00200000, 0x00400000, 0x00800000,	0x01000000, 0x02000000, 0x04000000, 0x08000000,	0x10000000, 0x20000000, 0x40000000, 0x80000000,};#endif#ifdef AHMDALlong bit[] = {	0x80000000, 0x40000000, 0x20000000, 0x10000000,	0x08000000, 0x04000000, 0x02000000, 0x01000000,	0x00800000, 0x00400000, 0x00200000, 0x00100000,	0x00080000, 0x00040000, 0x00020000, 0x00010000,	0x00008000, 0x00004000, 0x00002000, 0x00001000,	0x00000800, 0x00000400, 0x00000200, 0x00000100,	0x00000080, 0x00000040, 0x00000020, 0x00000010,	0x00000008, 0x00000004, 0x00000002, 0x00000001};#endif#ifdef SUNlong bit[] = {	0x01000000, 0x02000000, 0x04000000, 0x08000000,

Lines 1–500 of 531.