Annotation of researchv10no/libcc/outbitmap.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.