|
|
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.