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

1.1       root        1: #include <jstructs.h>
                      2: 
                      3: #define SHORTSIZE      16
                      4: 
                      5: #define inpoint(pp)    (inword(&(pp)->x) < 0 ? -1 : inword(&(pp)->y))
                      6: #define inrect(rp)     (inpoint(&(rp)->origin) < 0 ? -1 : inpoint(&(rp)->corner))
                      7: 
                      8: static int (*inch)();
                      9: 
                     10: Bitmap *
                     11: inbitmap(incharg)
                     12: int (*incharg)();
                     13: {
                     14:        Bitmap *bp;
                     15:        register y, i, rastwid, deltarow;
                     16:        register short *p;
                     17:        int dummy;
                     18:        Rectangle r;
                     19: 
                     20:        inch = incharg;
                     21: 
                     22:        if (inword(&dummy) < 0 || inrect(&r) < 0)
                     23:                return 0;
                     24:        i = r.origin.x % WORDSIZE;
                     25:        r.corner.x -= i; r.origin.x -= i;
                     26:        if ((bp = balloc(r)) == 0)
                     27:                return 0;
                     28:        rastwid = (r.corner.x - r.origin.x + SHORTSIZE - 1)/SHORTSIZE;
                     29:        deltarow = bp->width*(sizeof(Word)/sizeof(short));
                     30:        p = (short *)bp->base;
                     31:        for (y = r.origin.y; y < r.corner.y; y++) {
                     32:                if (getrast(p, rastwid) < 0) {
                     33:                        bfree(bp);
                     34:                        return 0;
                     35:                }
                     36:                if (y > r.origin.y)
                     37:                        for (i=0; i < rastwid; i++)
                     38:                                p[i] ^= p[i-deltarow];
                     39:                p += deltarow;
                     40:        }
                     41:        return bp;
                     42: }
                     43: 
                     44: static
                     45: getrast(p, nwords)     /* receive single compressed raster */
                     46: register short *p; int nwords;
                     47: {
                     48:        int count, same;
                     49: 
                     50:        while (nwords > 0) {
                     51:                if ((count = (*inch)()) <= 0)
                     52:                        return -1;
                     53:                same = count&128; count &= 127;
                     54:                nwords -= count;
                     55: 
                     56:                if (same) {
                     57:                        if (innchars(sizeof(short), (char *)p) < 0)
                     58:                                return -1;
                     59:                        for (count--; count>0; count--) {
                     60:                                *(p+1) = *p; p++;
                     61:                        }
                     62:                        p++;
                     63:                } else {
                     64:                        if (innchars(sizeof(short)*count, (char *)p) < 0)
                     65:                                return -1;
                     66:                        p += count;
                     67:                }
                     68:        }
                     69:        return (nwords == 0 ? 0 : -1);
                     70: }
                     71: 
                     72: static
                     73: inword(wp)
                     74: short *wp;
                     75: {
                     76:        register lo, hi;
                     77:        if ((lo = (*inch)()) < 0 || (hi = (*inch)()) < 0)
                     78:                return -1;
                     79:        *wp = (hi << 8) | lo;
                     80:        return 0;
                     81: }
                     82: 
                     83: static
                     84: innchars(n, p)
                     85: register n; register char *p;
                     86: {
                     87:        register c;
                     88:        while (--n >= 0)
                     89:                if ((c = (*inch)()) < 0)
                     90:                        return -1;
                     91:                else
                     92:                        *p++ = c;
                     93:        return 0;
                     94: }

unix.superglobalmegacorp.com

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