|
|
1.1 root 1: #include <stdio.h>
2: #include "imPRESS.h"
3:
4: #define min(a,b) ((a<=b) ? a : b)
5:
6: #define LINES 32
7: #define RASTSIZ 108
8: char rasters[LINES][RASTSIZ] = { 0 };
9:
10: glyphpage(out, name, size, xoff, yoff)
11: FILE *out;
12: char *name;
13: int size, xoff, yoff;
14: {
15: int nrasters, rastwid, rastbyt, nghoriz, ngvert, krast, i, iprev, j;
16: int x1, y1, x2, y2;
17: FILE *in;
18: if ((in = fopen(name, "r")) == NULL) {
19: fprintf(stderr, "cannot open %s\n", name);
20: return -1;
21: }
22:
23: if (getw(in) != 0) {
24: fclose(in);
25: return 1;
26: }
27: x1 = getw(in);
28: y1 = getw(in);
29: x2 = getw(in);
30: y2 = getw(in);
31: nrasters = (y2 - y1 < 0) ? y1 - y2 : y2 - y1;
32: rastwid = (x2 - x1 < 0) ? x1 - x2 : x2 - x1;
33: if (nrasters <= 0 || nrasters > 1024 || rastwid <= 0 || rastwid > 800) {
34: fclose(in);
35: return -1;
36: }
37:
38: xoff >>= size;
39: yoff >>= size;
40: rastbyt = ((rastwid + xoff + 15) / 16) * 2;
41: rastwid = (rastwid + 15) / 16;
42: ngvert = (nrasters + yoff + 31) / 32;
43: nghoriz = (rastbyt + 3) / 4;
44:
45: putc(imP_SET_MAGN , out);
46: putc( size, out);
47: putc(imP_BITMAP , out);
48: putc( 0x0F, out);
49: putc( nghoriz, out);
50: putc( ngvert, out);
51:
52: /* clear out old junk in array */
53: for (i=0; i<32; i++)
54: for (j=0; j<rastbyt+2; j++)
55: rasters[i][j] = 0;
56: /* send the rasters */
57: for (nrasters+=yoff; nrasters>0; nrasters -= krast) {
58: krast=min(nrasters,32);
59: for (iprev=(yoff-1)&0x1f,i=yoff; i<krast; iprev=i++) {
60: for (j=0; j<rastbyt+2; j++)
61: rasters[i][j] = 0;
62: if (readrast(rasters[i],rastwid,in) < 0){
63: fclose(in);
64: return -1;
65: }
66: shiftrast(rasters[i], xoff, rastbyt);
67: for (j=0; j<rastbyt; j++)
68: rasters[i][j] ^= rasters[iprev][j];
69: }
70: /* clear out old junk in array */
71: for (i=krast; i<32; i++){
72: for (j=0; j<rastbyt+2; j++) {
73: rasters[i][j] = 0;
74: }
75: }
76: for (j=0; j<rastbyt; j+=4) {
77: for (i=0; i<32; i++)
78: fwrite(&rasters[i][j],4,1,out);
79: }
80: yoff=0;
81: }
82: fclose(in);
83: return 0;
84: }
85:
86: static
87: readrast(p1,nw,in)
88: char *p1;
89: int nw;
90: FILE *in;
91: {
92: int count, ctype;
93:
94: while (nw>0) {
95: if ((count=getc(in)) <= 0)
96: return -1;
97: ctype = count & 0x80;
98: count &= 0x7f;
99: nw -= count;
100: count *= 2;
101:
102: if (ctype) {
103: if (fread(p1,2,1,in) <= 0)
104: return -1;
105: for (count-=2; count>0; count--) {
106: *(p1+2) = *p1;
107: p1 += 1;
108: }
109: p1 += 2;
110: } else {
111: if (fread(p1,count,1,in) <= 0)
112: return -1;
113: p1 += count;
114: }
115: }
116: return (nw == 0 ? 0 : -1);
117: }
118:
119: static
120: getw(stream)
121: FILE *stream;
122: {
123: register l = getc(stream);
124: return (getc(stream)<<8) | l;
125: }
126: iglyphpage(out, name, size, xoff, yoff)
127: FILE *out;
128: char *name;
129: int size, xoff, yoff;
130: {
131: int nrasters, rastwid, rastbyt, nghoriz, ngvert, krast, i, iprev, j;
132: int h=0, v, nbits;
133: FILE *in;
134:
135: if ((in = fopen(name, "r")) == NULL) {
136: fprintf(stderr, "cannot open %s\n", name);
137: return -1;
138: }
139:
140: for (v=0; nbits = nexticon(rasters, in); v++)
141: if (nbits > h)
142: h = nbits;
143: rewind(in);
144:
145: nrasters = v;
146: rastwid = h;
147: if (nrasters <= 0 || nrasters > 1024 || rastwid <= 0 || rastwid > 800) {
148: fclose(in);
149: return -1;
150: }
151:
152: xoff >>= size;
153: yoff >>= size;
154:
155: rastbyt = ((rastwid + xoff + 15) / 16) * 2;
156: rastwid = (rastwid + 15) / 16;
157: ngvert = (nrasters + yoff + 31) / 32;
158: nghoriz = (rastbyt + 3) / 4;
159:
160: putc(imP_SET_MAGN, out);
161: putc( size, out);
162:
163: putc(imP_BITMAP , out);
164: putc( 0x0F, out);
165: putc( nghoriz, out);
166: putc( ngvert, out);
167:
168: /* clear out old junk in array */
169: for (i=0; i<32; i++)
170: for (j=0; j<rastbyt+2; j++)
171: rasters[i][j] = 0;
172: /* send the rasters */
173: for (nrasters+=yoff; nrasters>0; nrasters -= krast) {
174: krast=min(nrasters,32);
175: for (iprev=(yoff-1)&0x1f,i=yoff; i<krast; iprev=i++) {
176: for (j=0; j<rastbyt+2; j++)
177: rasters[i][j] = 0;
178: if (nexticon(rasters[i], in) == 0) {
179: fclose(in);
180: return -1;
181: }
182: shiftrast(rasters[i], xoff, rastbyt);
183: }
184: /* clear out old junk in array */
185: for (i=krast; i<32; i++){
186: for (j=0; j<rastbyt+2; j++) {
187: rasters[i][j] = 0;
188: }
189: }
190: for (j=0; j<rastbyt; j+=4) {
191: for (i=0; i<32; i++){
192: fwrite(&rasters[i][j],4,1,out);
193: }
194: }
195: yoff=0;
196: }
197: fclose(in);
198: return 0;
199: }
200: static int
201: nexticon(rast, in)
202: short *rast;
203: FILE *in;
204: {
205: register j = 0, nbits; char delim[8], *p, c;
206: do {
207: if (fscanf(in, " 0x%4hx%[, \t\n]", (p = (char *)&rast[j++]), delim) <= 0)
208: return 0;
209: c = *p; *p = *(p+1); *(p+1) = c; /* swap the bytes */
210: } while (strchr(delim, '\n') == 0);
211: nbits = 16*j;
212: return nbits;
213: }
214:
215: shiftrast(s, b, w)
216: unsigned char *s;
217: {
218: register unsigned char *from, *to;
219: register int i, bits, byte;
220: i = b >> 3;
221: if (i != 0) {
222: for (to = &s[w], from = &s[w-i]; from != s; )
223: *--to = *--from;
224: while (to != s)
225: *--to = 0;
226: }
227: bits = 0;
228: i = b & 0x7;
229: if (i != 0)
230: for (to = s; to != &s[w]; to++) {
231: byte = (bits | *to) >> i;
232: bits = (*to & ((1 << i) - 1)) << 8;
233: *to = byte;
234: }
235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.