Blame


1 a31db67d 2004-04-21 devnull #include <u.h>
2 a31db67d 2004-04-21 devnull #include <libc.h>
3 a31db67d 2004-04-21 devnull #include <libg.h>
4 a31db67d 2004-04-21 devnull #include <bio.h>
5 a31db67d 2004-04-21 devnull #include "hdr.h"
6 a31db67d 2004-04-21 devnull
7 a31db67d 2004-04-21 devnull enum {
8 a31db67d 2004-04-21 devnull Charsperfont = 157,
9 a31db67d 2004-04-21 devnull Void1b = (0xC6-0xA2)*Charsperfont+0x3f,
10 fa325e9b 2020-01-10 cross Void1e = (0xC9-0xA2)*Charsperfont - 1
11 a31db67d 2004-04-21 devnull };
12 a31db67d 2004-04-21 devnull
13 a31db67d 2004-04-21 devnull Bitmap *
14 a31db67d 2004-04-21 devnull breadbits(char *file, int n, long *chars, int size, uchar *bits, int **doneptr)
15 a31db67d 2004-04-21 devnull {
16 a31db67d 2004-04-21 devnull Bitmap *bm;
17 a31db67d 2004-04-21 devnull Biobuf *bf;
18 a31db67d 2004-04-21 devnull int i, j, byt;
19 a31db67d 2004-04-21 devnull int nch;
20 a31db67d 2004-04-21 devnull long c;
21 a31db67d 2004-04-21 devnull uchar *b, *nbits;
22 a31db67d 2004-04-21 devnull int *done;
23 a31db67d 2004-04-21 devnull 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 };
24 a31db67d 2004-04-21 devnull uchar buf[32];
25 a31db67d 2004-04-21 devnull
26 a31db67d 2004-04-21 devnull bf = Bopen(file, OREAD);
27 a31db67d 2004-04-21 devnull if(bf == 0){
28 a31db67d 2004-04-21 devnull fprint(2, "%s: %s: %r\n", argv0, file);
29 a31db67d 2004-04-21 devnull exits("bitfile open error");
30 a31db67d 2004-04-21 devnull }
31 a31db67d 2004-04-21 devnull done = (int *)malloc(n*sizeof(done[0]));
32 a31db67d 2004-04-21 devnull if(done == 0){
33 a31db67d 2004-04-21 devnull fprint(2, "%s: malloc error (%d bytes)\n", argv0, n);
34 a31db67d 2004-04-21 devnull exits("malloc error");
35 a31db67d 2004-04-21 devnull }
36 a31db67d 2004-04-21 devnull *doneptr = done;
37 a31db67d 2004-04-21 devnull byt = size/8;
38 a31db67d 2004-04-21 devnull nch = 0;
39 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
40 a31db67d 2004-04-21 devnull done[i] = 1;
41 a31db67d 2004-04-21 devnull nch++;
42 a31db67d 2004-04-21 devnull c = chars[i];
43 a31db67d 2004-04-21 devnull if((c >= Void1b) && (c <= Void1e)){
44 a31db67d 2004-04-21 devnull done[i] = 0;
45 a31db67d 2004-04-21 devnull nch--;
46 a31db67d 2004-04-21 devnull continue;
47 a31db67d 2004-04-21 devnull }
48 a31db67d 2004-04-21 devnull /* magic via presotto for calculating the seek */
49 a31db67d 2004-04-21 devnull j = c;
50 a31db67d 2004-04-21 devnull if(c >= 2*Charsperfont)
51 a31db67d 2004-04-21 devnull j += 294; /* baffling hole between A3 and A4 */
52 a31db67d 2004-04-21 devnull if(c > Void1e)
53 a31db67d 2004-04-21 devnull j -= 3*Charsperfont - 0x3F;
54 a31db67d 2004-04-21 devnull j *= byt*size; /* bytes per char */
55 a31db67d 2004-04-21 devnull j += 256; /* 256 front matter */
56 a31db67d 2004-04-21 devnull Bseek(bf, j, 0);
57 a31db67d 2004-04-21 devnull Bread(bf, buf, sizeof(missing));
58 a31db67d 2004-04-21 devnull if(memcmp(buf, missing, sizeof(missing)) == 0){
59 a31db67d 2004-04-21 devnull done[i] = 0;
60 a31db67d 2004-04-21 devnull nch--;
61 a31db67d 2004-04-21 devnull continue;
62 a31db67d 2004-04-21 devnull }
63 a31db67d 2004-04-21 devnull Bseek(bf, j, 0);
64 a31db67d 2004-04-21 devnull b = bits + i*byt;
65 a31db67d 2004-04-21 devnull for(j = 0; j < size; j++){ /* rows */
66 a31db67d 2004-04-21 devnull Bread(bf, b, byt);
67 a31db67d 2004-04-21 devnull b += n*byt;
68 a31db67d 2004-04-21 devnull }
69 a31db67d 2004-04-21 devnull }
70 a31db67d 2004-04-21 devnull nbits = (uchar *)malloc(nch*byt*size);
71 a31db67d 2004-04-21 devnull if(nbits == 0){
72 a31db67d 2004-04-21 devnull fprint(2, "%s: malloc error (%d bytes)\n", argv0, nch*byt);
73 a31db67d 2004-04-21 devnull exits("malloc error");
74 a31db67d 2004-04-21 devnull }
75 a31db67d 2004-04-21 devnull c = 0;
76 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++)
77 a31db67d 2004-04-21 devnull if(done[i]){
78 a31db67d 2004-04-21 devnull for(j = 0; j < size; j++)
79 a31db67d 2004-04-21 devnull memmove(nbits+c*byt+j*nch*byt, bits+i*byt+j*n*byt, byt);
80 a31db67d 2004-04-21 devnull c++;
81 a31db67d 2004-04-21 devnull }
82 a31db67d 2004-04-21 devnull bm = balloc((Rectangle){(Point){0, 0}, (Point){nch*size, size}}, 0);
83 a31db67d 2004-04-21 devnull if(bm == 0){
84 a31db67d 2004-04-21 devnull fprint(2, "%s: balloc failure\n", argv0);
85 a31db67d 2004-04-21 devnull exits("balloc failure");
86 a31db67d 2004-04-21 devnull }
87 a31db67d 2004-04-21 devnull wrbitmap(bm, 0, size, nbits);
88 a31db67d 2004-04-21 devnull return(bm);
89 a31db67d 2004-04-21 devnull }