|
|
1.1 root 1: #include <jerq.h>
2: #include <stdio.h>
3:
4: #ifdef SUNTOOLS
5: #undef F_STORE
6: #define F_STORE (PIX_DONTCLIP|PIX_SRC)
7: #endif SUNTOOLS
8:
9: #define SHORTSIZE 16
10: #define SHORT short
11:
12: #define sendword(w) (sendch(w&255),sendch((w>>8)&255))
13:
14: SHORT buffer[2048/SHORTSIZE], raster[2048/SHORTSIZE]; /* Room to spare */
15:
16: static int ctype, count; static SHORT *p1, *endraster;
17: FILE *filep, *popen();
18:
19: sendbitmap(bp,r,filnam)
20: Bitmap *bp; Rectangle r; char *filnam;
21: {
22: register i; int nrasters, rastwid; Rectangle rrast;
23: int pflag = 0;
24: Bitmap *bbuffer;
25:
26: if (filnam[0] != '|')
27: filep=fopen(filnam, "w");
28: else
29: filep=popen(filnam+2, "w"), pflag = 1;
30: if (!filep) {
31: pflag = 0;
32: return 1;
33: }
34:
35: nrasters = r.corner.y-r.origin.y;
36: i = r.corner.x-r.origin.x;
37: rastwid =(i+SHORTSIZE-1)/SHORTSIZE;
38: bbuffer = balloc(Rect(0,0,rastwid*SHORTSIZE+32,1));
39: endraster= raster+rastwid-1;
40: sendword(0);
41: sendword(r.origin.x - Jfscreen.rect.origin.x);
42: sendword(r.origin.y - Jfscreen.rect.origin.y);
43: sendword(r.corner.x - Jfscreen.rect.origin.x);
44: sendword(r.corner.y - Jfscreen.rect.origin.y);
45:
46: rectf(bbuffer,bbuffer->rect,F_CLR);
47: for (i=0; i<rastwid; i++) raster[i] = 0;
48: rrast=r;
49: rectf(bp,r,F_XOR);
50:
51: for (; rrast.origin.y<r.corner.y; rrast.origin.y++) {
52: rrast.corner.y = rrast.origin.y+1;
53: rectf(bp,rrast,F_XOR);
54: bitblt(bp,rrast,bbuffer,Pt(0,0),F_STORE);
55: getrast(bbuffer,buffer);
56: for (i=0; i<rastwid; i++) raster[i] ^= buffer[i];
57: sendrast();
58: for (i=0; i<rastwid; i++) raster[i] = buffer[i];
59: }
60:
61: bfree(bbuffer);
62: if (!pflag)
63: fclose(filep);
64: else
65: pclose(filep);
66: return 0;
67: }
68:
69: static sendrast()
70: {
71: SHORT *p2;
72:
73: p1=p2=raster;
74: do {
75: if (p1 >= p2) {
76: p2=p1+1; count=2;
77: ctype=(*p1 == *p2);
78:
79: } else if ((*p2 == *(p2+1)) == ctype) {
80: if (++count >= 127) {
81: sendbits();
82: p1=p2+2;
83: } else p2++;
84:
85: } else if (ctype) {
86: sendbits();
87: p1=p2+1;
88: ctype=0;
89:
90: } else {
91: count--; sendbits();
92: p1=p2;
93: ctype=1;
94: }
95: } while (p2<endraster);
96:
97: if (p1 > endraster) return;
98: if (p2 > endraster) count--;
99: sendbits();
100: }
101:
102: static sendbits()
103: {
104: int c;
105: c=count; if (ctype) { c += 128; count=1; }
106: sendch(c);
107: sendnch(sizeof(SHORT)*count,(char *)p1);
108: }
109:
110: sendch(c)
111: int c;
112: {
113: putc(c, filep);
114: }
115:
116: sendnch(n,str)
117: register int n; register char *str;
118: {
119: while (n-- > 0)
120: putc(*str++, filep);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.