|
|
1.1 root 1: #include <jerq.h>
2:
3: #define SHORTSIZE 16
4:
5: #define inpoint(pp) (inword(&(pp)->x) < 0 ? -1 : inword(&(pp)->y))
6: #define inrect(rp) (inpoint(&(rp)->origin) < 0 ? -1 : inpoint(&(rp)->corner))
7:
8: static Word buffer[XMAX/WORDSIZE];
9:
10: static Bitmap bbuffer = { buffer, XMAX/WORDSIZE, 0, 0, XMAX, 1, };
11:
12: static int (*inch)();
13:
14: Bitmap *
15: inbitmap(incharg)
16: int (*incharg)();
17: {
18: register Bitmap *bp;
19: register y;
20: int rastwid, dummy;
21: Rectangle r;
22:
23: inch = incharg;
24:
25: if (inword(&dummy) < 0 || inrect(&r) < 0 || (bp = balloc(r)) == 0)
26: return 0;
27: rastwid = (r.corner.x - r.origin.x + SHORTSIZE - 1)/SHORTSIZE;
28: for (y = r.origin.y; y < r.corner.y; y++) {
29: if (getrast((short *)buffer, rastwid) < 0) {
30: bfree(bp);
31: return 0;
32: }
33: bitblt(&bbuffer, bbuffer.rect, bp, Pt(r.origin.x, y), F_STORE);
34: if (y > r.origin.y)
35: bitblt(bp, Rect(r.origin.x, y-1, r.corner.x, y),
36: bp, Pt(r.origin.x, y), F_XOR);
37: }
38: return bp;
39: }
40:
41: static
42: getrast(p, nwords) /* receive single compressed raster */
43: register short *p; int nwords;
44: {
45: int count, same;
46:
47: while (nwords > 0) {
48: if ((count = (*inch)()) <= 0)
49: return -1;
50: same = count&128; count &= 127;
51: nwords -= count;
52:
53: if (same) {
54: if (innchars(sizeof(short), (char *)p) < 0)
55: return -1;
56: for (count--; count>0; count--) {
57: *(p+1) = *p; p++;
58: }
59: p++;
60: } else {
61: if (innchars(sizeof(short)*count, (char *)p) < 0)
62: return -1;
63: p += count;
64: }
65: }
66: return (nwords == 0 ? 0 : -1);
67: }
68:
69: static
70: inword(wp)
71: short *wp;
72: {
73: register lo, hi;
74: if ((lo = (*inch)()) < 0 || (hi = (*inch)()) < 0)
75: return -1;
76: *wp = (hi << 8) | lo;
77: return 0;
78: }
79:
80: static
81: innchars(n, p)
82: register n; register char *p;
83: {
84: register c;
85: while (--n >= 0)
86: if ((c = (*inch)()) < 0)
87: return -1;
88: else
89: *p++ = c;
90: return 0;
91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.