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