|
|
1.1 root 1: #include <jerq.h>
2:
3: #define SHORTSIZE 16
4:
5: #define outword(w) ((*ouch)(w) < 0 ? -1 : (*ouch)((w)>>8))
6: #define outpoint(p) (outword((p).x) < 0 ? -1 : outword((p).y))
7: #define outrect(r) (outpoint((r).origin) < 0 ? -1 : outpoint((r).corner))
8:
9: static Word buffer[XMAX/WORDSIZE];
10:
11: static Bitmap bbuffer = { buffer, XMAX/WORDSIZE, 0, 0, XMAX, 1, };
12:
13: static int ctype, count, rastwid, (*ouch)(); static short *p1;
14:
15: outbitmap(bp, r, oucharg)
16: Bitmap *bp; Rectangle r; int (*oucharg)();
17: {
18: Rectangle rrast;
19:
20: ouch = oucharg;
21:
22: rastwid = (r.corner.x-r.origin.x+SHORTSIZE-1)/SHORTSIZE;
23: if (outword(0) < 0 || outrect(r) < 0)
24: return -1;
25:
26: rectf(&bbuffer, bbuffer.rect, F_CLR);
27: rrast=r;
28: rectf(bp, r, F_XOR);
29:
30: while (rrast.origin.y < r.corner.y) {
31: rrast.corner.y = rrast.origin.y+1;
32: rectf(bp, rrast, F_XOR);
33: bitblt(bp, rrast, &bbuffer, Pt(0,0), F_XOR);
34: if (outrast((short *)buffer) < 0) {
35: rrast.origin.y++;
36: rectf(bp, Rpt(rrast.origin, r.corner), F_XOR);
37: return -1;
38: }
39: bitblt(bp, rrast, &bbuffer, Pt(0,0), F_STORE);
40: rrast.origin.y++;
41: }
42: return 0;
43: }
44:
45: static outrast(p2)
46: register short *p2;
47: {
48: short *endraster;
49: p1 = p2;
50: endraster = p2+rastwid-1;
51: do {
52: if (p1 >= p2) {
53: p2=p1+1; count=2;
54: ctype=(*p1 == *p2);
55:
56: } else if ((*p2 == *(p2+1)) == ctype) {
57: if (++count >= 127) {
58: if (outbits() < 0)
59: return -1;
60: p1=p2+2;
61: } else p2++;
62:
63: } else if (ctype) {
64: if (outbits() < 0)
65: return -1;
66: p1=p2+1;
67: ctype=0;
68:
69: } else {
70: count--;
71: if (outbits() < 0)
72: return -1;
73: p1=p2;
74: ctype=1;
75: }
76: } while (p2 < endraster);
77:
78: if (p1 > endraster)
79: return 0;
80: if (p2 > endraster)
81: count--;
82: if (outbits() < 0)
83: return -1;
84: return 0;
85: }
86:
87: static outbits()
88: {
89: register c; register char *pout;
90: c = count;
91: if (ctype)
92: c += 128, count=1;
93: if ((*ouch)(c) < 0)
94: return -1;
95: c = sizeof(short)*count;
96: pout = (char *)p1;
97: while (--c >= 0)
98: if ((*ouch)(*pout++) < 0)
99: return -1;
100: return 0;
101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.