|
|
1.1 root 1: #include <jstructs.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 int ctype, count, rastwid, (*ouch)(); static short *p1;
10:
11: static short *buf; static bufwid;
12:
13: outbitmap(bp, r, oucharg)
14: Bitmap *bp; Rectangle r; int (*oucharg)();
15: {
16: char *malloc();
17: register short *pr, *q;
18: register y, i;
19:
20: ouch = oucharg;
21: rastwid = (r.corner.x-r.origin.x+SHORTSIZE-1)/SHORTSIZE;
22:
23: if (rastwid > bufwid) {
24: if (buf)
25: free(buf), bufwid = 0;
26: buf = (short *)malloc(rastwid*sizeof(short));
27: if (buf == 0)
28: return -1;
29: bufwid = rastwid;
30: }
31:
32: if (outword(0) < 0 || outrect(r) < 0)
33: return -1;
34:
35: pr = (short *)bp->base;
36: for (i=0; i<rastwid; i++)
37: buf[i] = 0;
38: for (y=r.origin.y; y<r.corner.y; y++) {
39: for (i=0; i<rastwid; i++)
40: buf[i] ^= pr[i];
41: if (outrast(buf) < 0)
42: return -1;
43: for (i=0; i<rastwid; i++)
44: buf[i] = pr[i];
45: pr = (short *)((Word *)pr + bp->width);
46: }
47: return 0;
48: }
49:
50: static outrast(p2)
51: register short *p2;
52: {
53: short *endraster;
54: p1 = p2;
55: endraster = p2+rastwid-1;
56: do {
57: if (p1 >= p2) {
58: p2=p1+1; count=2;
59: ctype=(*p1 == *p2);
60:
61: } else if ((*p2 == *(p2+1)) == ctype) {
62: if (++count >= 127) {
63: if (outbits() < 0)
64: return -1;
65: p1=p2+2;
66: } else p2++;
67:
68: } else if (ctype) {
69: if (outbits() < 0)
70: return -1;
71: p1=p2+1;
72: ctype=0;
73:
74: } else {
75: count--;
76: if (outbits() < 0)
77: return -1;
78: p1=p2;
79: ctype=1;
80: }
81: } while (p2 < endraster);
82:
83: if (p1 > endraster)
84: return 0;
85: if (p2 > endraster)
86: count--;
87: if (outbits() < 0)
88: return -1;
89: return 0;
90: }
91:
92: static outbits()
93: {
94: register c; register char *pout;
95: c = count;
96: if (ctype)
97: c += 128, count=1;
98: if ((*ouch)(c) < 0)
99: return -1;
100: c = sizeof(short)*count;
101: pout = (char *)p1;
102: while (--c >= 0)
103: if ((*ouch)(*pout++) < 0)
104: return -1;
105: return 0;
106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.