Annotation of researchv10no/libcc/outbitmap.c, revision 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.