#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);
}
