| #include	<u.h> | 
 | #include	<libc.h> | 
 | #include	<libg.h> | 
 | #include	<bio.h> | 
 | #include	"hdr.h" | 
 |  | 
 | enum { | 
 | 	Charsperfont	= 157, | 
 | 	Void1b		= (0xC6-0xA2)*Charsperfont+0x3f, | 
 | 	Void1e		= (0xC9-0xA2)*Charsperfont - 1  | 
 | }; | 
 |  | 
 | Bitmap * | 
 | breadbits(char *file, int n, long *chars, int size, uchar *bits, int **doneptr) | 
 | { | 
 | 	Bitmap *bm; | 
 | 	Biobuf *bf; | 
 | 	int i, j, byt; | 
 | 	int nch; | 
 | 	long c; | 
 | 	uchar *b, *nbits; | 
 | 	int *done; | 
 | 	static uchar missing[32] = {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | 
 | 	uchar buf[32]; | 
 |  | 
 | 	bf = Bopen(file, OREAD); | 
 | 	if(bf == 0){ | 
 | 		fprint(2, "%s: %s: %r\n", argv0, file); | 
 | 		exits("bitfile open error"); | 
 | 	} | 
 | 	done = (int *)malloc(n*sizeof(done[0])); | 
 | 	if(done == 0){ | 
 | 		fprint(2, "%s: malloc error (%d bytes)\n", argv0, n); | 
 | 		exits("malloc error"); | 
 | 	} | 
 | 	*doneptr = done; | 
 | 	byt = size/8; | 
 | 	nch = 0; | 
 | 	for(i = 0; i < n; i++){ | 
 | 		done[i] = 1; | 
 | 		nch++; | 
 | 		c = chars[i]; | 
 | 		if((c >= Void1b) && (c <= Void1e)){ | 
 | 			done[i] = 0; | 
 | 			nch--; | 
 | 			continue; | 
 | 		} | 
 | 		/* magic via presotto for calculating the seek */ | 
 | 		j = c; | 
 | 		if(c >= 2*Charsperfont) | 
 | 			j += 294;	/* baffling hole between A3 and A4 */ | 
 | 		if(c > Void1e) | 
 | 			j -= 3*Charsperfont - 0x3F; | 
 | 		j *= byt*size;		/* bytes per char */ | 
 | 		j += 256;		/* 256 front matter */ | 
 | 		Bseek(bf, j, 0); | 
 | 		Bread(bf, buf, sizeof(missing)); | 
 | 		if(memcmp(buf, missing, sizeof(missing)) == 0){ | 
 | 			done[i] = 0; | 
 | 			nch--; | 
 | 			continue; | 
 | 		} | 
 | 		Bseek(bf, j, 0); | 
 | 		b = bits + i*byt; | 
 | 		for(j = 0; j < size; j++){	/* rows */ | 
 | 			Bread(bf, b, byt); | 
 | 			b += n*byt; | 
 | 		} | 
 | 	} | 
 | 	nbits = (uchar *)malloc(nch*byt*size); | 
 | 	if(nbits == 0){ | 
 | 		fprint(2, "%s: malloc error (%d bytes)\n", argv0, nch*byt); | 
 | 		exits("malloc error"); | 
 | 	} | 
 | 	c = 0; | 
 | 	for(i = 0; i < n; i++) | 
 | 		if(done[i]){ | 
 | 			for(j = 0; j < size; j++) | 
 | 				memmove(nbits+c*byt+j*nch*byt, bits+i*byt+j*n*byt, byt); | 
 | 			c++; | 
 | 		} | 
 | 	bm = balloc((Rectangle){(Point){0, 0}, (Point){nch*size, size}}, 0); | 
 | 	if(bm == 0){ | 
 | 		fprint(2, "%s: balloc failure\n", argv0); | 
 | 		exits("balloc failure"); | 
 | 	} | 
 | 	wrbitmap(bm, 0, size, nbits); | 
 | 	return(bm); | 
 | } |