V10/cmd/pico/2bit.c

ulong floyd[FSIZE+1][FSIZE+1];
ulong contab[RES+1];
Bitmap *icon;

drawface(lo, hi, facep)
	Point facep;
{

	ulong *p, *f;
	char *sq;
	int v, h, s, e, t, i;
	if (!icon)
		icon=balloc(Rect(0, 0, FSIZE, FSIZE), 1);
	if (!icon)
		return;
	if (hi<lo){e=hi; hi=lo; lo=e;}
	if (lo<0) lo=0; else if (RES<lo) lo=RES;
	if (hi<0) hi=0; else if (RES<hi) hi=RES;
	t = hi-lo;
	p = contab;
	for (v = 0;v !=lo; v++)
		*p++ = 0;
	for (;v !=hi; v++)
		*p++ = (v-lo)*RES/t;
	for (;v <= RES;v++)
		*p++ = RES;
	sq=squash[0];
	for (v=0;v!=FSIZE;v++) for(h=0,f=floyd[v];h!=FSIZE;h++)
		*f++ = contab[*sq++&0xFF];
	for (v = 0;v != FSIZE; v++)
	{	f = floyd[v];
		for (h=0,p=addr(icon, Pt(0, v));h<FSIZE;h+=16,p++)
		{	*p=0;
			for(s=0;s!=16 && s+h!=FSIZE;s++,f++)
			{	e=f[0];
				e+=dithmat[s&7][v&7];
				i=e/72;
				if (i<0)
					i=0;
				else if (i>3)
					i=3;
				e-=(i*RES)/3;
				*p|=(3-i)<<(30-2*s);
#ifndef THRESH
				t=3*e/8;
				f[FSIZE+1]+=t;
				f[FSIZE+2]+=e-2*t;
				f[1]+=t;
#endif
			}
		}
	}
	bitblt(&display, facep, icon, icon->rect, S);
}