Annotation of researchv10no/cmd/pico/tobit.c, revision 1.1.1.1

1.1       root        1: #include       <stdio.h>
                      2: #include       <jstructs.h>
                      3: #include       "pico.h"
                      4: 
                      5: #define        DITHSIZE        16
                      6: #define        DITHMASK        (DITHSIZE-1)
                      7: #define DITHMAX                DITHSIZE*DITHSIZE-1
                      8: 
                      9: int dith[DITHSIZE][DITHSIZE]={
                     10: #include "udither.data"
                     11: };
                     12: FILE *ofd;
                     13: 
                     14: extern short   CURSCRATCH, CUROLD;
                     15: extern struct  SRC src[MANY];
                     16: extern int DEF_NL, DEF_LL;
                     17: 
                     18: put0bitmap(name)
                     19:        char *name;
                     20: {
                     21:        register byte, mask, nout;
                     22:        register unsigned char *s;
                     23:        register int *dth;
                     24:        unsigned char *zbuf;
                     25:        int ll, len, ht, x, y, i;
                     26:        short data;
                     27:        Bitmap bp;
                     28: 
                     29:        if ((ofd = fopen(name, "w")) == NULL)
                     30:        {       fprintf(stderr, "pico: cannot open %s\n", name);
                     31:                return;
                     32:        }
                     33: 
                     34:        ll = DEF_LL;    /* full size */
                     35:        ht = DEF_NL;
                     36:        /* len = 32*((ll+31)/32); */
                     37:        len = 32*((2*ll+31)/32);        /* 2*ll for 2bit/pel */
                     38:        zbuf = (unsigned char *) Emalloc(ht*len/8);
                     39:        nout = 0;
                     40:        for (y = 0; y < ht; y++)
                     41:        {       byte = 0; mask = 0x80;
                     42:                dth = dith[y&DITHMASK];
                     43:                s = &(Old->pixred[2*y*DEF_LL]);
                     44:                for (x = 0; x < ll; x++)
                     45:                {       data = *s++;
                     46:                /*      if ((data & DITHMAX) < dth[x&DITHMASK])
                     47:                                byte |= mask;
                     48:                        mask >>= 1;
                     49:                        if (mask == 0)
                     50:                        {       zbuf[nout++] = byte;
                     51:                                byte = 0;
                     52:                                mask = 0x80;
                     53:                        }
                     54:                */
                     55:                        data += dth[x&DITHMASK];        /* value between 0 - 511 */
                     56:                        data /= 128;                    /* value between 0 - 3 */
                     57:                        for (i = 2; i > 0; i = i/2)
                     58:                        {       if (data&i)
                     59:                                        byte |= mask;
                     60:                                mask >>= 1;
                     61:                                if (mask == 0)
                     62:                                {       zbuf[nout++] = byte;
                     63:                                        byte = 0;
                     64:                                        mask = 0x80;
                     65:                                }
                     66:                        }
                     67:                }
                     68:        /*      for ( ; x < len; x++)
                     69:        */      for (x = 2*x ; x < len; x++)
                     70:                {       if (dth[x&DITHMASK])
                     71:                                byte |= mask;
                     72:                        mask >>= 1;
                     73:                        if (mask == 0)
                     74:                        {       zbuf[nout++] = byte;
                     75:                                byte = 0;
                     76:                                mask = 0x80;
                     77:                }       }
                     78:        
                     79:        }
                     80:        bp.base = (Word *)zbuf;
                     81:        bp._null = (char *) 0;
                     82:        bp.width = len/32;      /* why not 16? */
                     83:        bp.rect.origin.x = bp.rect.origin.y = 0;
                     84:        bp.rect.corner.x = len; bp.rect.corner.y = ht;
                     85:        outbitmap(&bp, bp.rect);
                     86:        fflush(ofd);
                     87:        fclose(ofd);
                     88:        fprintf(stderr, "+: %s\n", name);
                     89: }
                     90: 
                     91: putbitmap(name)
                     92:        char *name;
                     93: {
                     94:        register byte, mask, nout;
                     95:        register unsigned char *s;
                     96:        register int *dth;
                     97:        unsigned char *zbuf;
                     98:        int ll, len, ht, x, y;
                     99:        short data;
                    100:        Bitmap bp;
                    101: 
                    102:        if ((ofd = fopen(name, "w")) == NULL)
                    103:        {       fprintf(stderr, "pico: cannot open %s\n", name);
                    104:                return;
                    105:        }
                    106: 
                    107:        ll = DEF_LL/2;  /* medium size */
                    108:        ht = DEF_NL/2;
                    109:        len = 32*((ll+31)/32);
                    110:        zbuf = (unsigned char *) Emalloc(ht*len/8);
                    111:        nout = 0;
                    112:        for (y = 0; y < ht; y++)
                    113:        {       byte = 0; mask = 0x80;
                    114:                dth = dith[y&DITHMASK];
                    115:                s = &(Old->pixred[2*y*DEF_LL]);
                    116:                for (x = 0; x < ll; x++)
                    117:                {       data  = *s + *(s+DEF_LL); s++;
                    118:                        data += *s + *(s+DEF_LL); s++;
                    119:                        data >>= 2;
                    120:                        if ((data & DITHMAX) < dth[x&DITHMASK])
                    121:                                byte |= mask;
                    122:                        mask >>= 1;
                    123:                        if (mask == 0)
                    124:                        {       zbuf[nout++] = byte;
                    125:                                byte = 0;
                    126:                                mask = 0x80;
                    127:                        }
                    128:                }
                    129:                for ( ; x < len; x++)
                    130:                {       if (dth[x&DITHMASK])
                    131:                                byte |= mask;
                    132:                        mask >>= 1;
                    133:                        if (mask == 0)
                    134:                        {       zbuf[nout++] = byte;
                    135:                                byte = 0;
                    136:                                mask = 0x80;
                    137:        }       }       }
                    138:        bp.base = (Word *)zbuf;
                    139:        bp._null = (char *) 0;
                    140:        bp.width = len/32;      /* why not 16? */
                    141:        bp.rect.origin.x = bp.rect.origin.y = 0;
                    142:        bp.rect.corner.x = len; bp.rect.corner.y = ht;
                    143:        outbitmap(&bp, bp.rect);
                    144:        fflush(ofd);
                    145:        fclose(ofd);
                    146:        fprintf(stderr, "+: %s\n", name);
                    147: }
                    148: 
                    149: #define SHORTSIZE      16
                    150: 
                    151: #define outword(w)     (putc(w,ofd) < 0 ? -1 : putc((w)>>8,ofd))
                    152: #define outpoint(p)    (outword((p).x) < 0 ? -1 : outword((p).y))
                    153: #define outrect(r)     (outpoint((r).origin) < 0 ? -1 : outpoint((r).corner))
                    154: 
                    155: static int ctype, count, rastwid; static short *p1;
                    156: 
                    157: static short *buf; static bufwid;
                    158: 
                    159: outbitmap(bp, r)
                    160:        Bitmap *bp; Rectangle r;
                    161: {
                    162:        register short *pr;
                    163:        register y, i;
                    164: 
                    165:        rastwid = (r.corner.x-r.origin.x+SHORTSIZE-1)/SHORTSIZE;
                    166: 
                    167:        if (rastwid > bufwid) {
                    168:                if (buf)
                    169:                        free(buf), bufwid = 0;
                    170:                buf = (short *)Emalloc(rastwid*sizeof(short));
                    171:                if (buf == 0)
                    172:                        return -1;
                    173:                bufwid = rastwid;
                    174:        }
                    175:        if (outword(0) < 0 || outrect(r) < 0)
                    176:                return -1;
                    177:        pr = (short *)bp->base;
                    178:        for (i=0; i<rastwid; i++)
                    179:                buf[i] = 0;
                    180:        for (y=r.origin.y; y<r.corner.y; y++)
                    181:        {       for (i=0; i<rastwid; i++)
                    182:                        buf[i] ^= pr[i];
                    183:                if (outrast(buf) < 0)
                    184:                        return -1;
                    185:                for (i=0; i<rastwid; i++)
                    186:                        buf[i] = pr[i];
                    187:                pr = (short *)((Word *)pr + bp->width);
                    188:        }
                    189:        return 0;
                    190: }
                    191: 
                    192: outrast(p2)
                    193:        register short *p2;
                    194: {
                    195:        short *endraster;
                    196:        p1 = p2;
                    197:        endraster = p2+rastwid-1;
                    198: 
                    199:        do {
                    200:                if (p1 >= p2) {
                    201:                        p2=p1+1; count=2;
                    202:                        ctype=(*p1 == *p2);
                    203: 
                    204:                } else if ((*p2 == *(p2+1)) == ctype) {
                    205:                        if (++count >= 127) {
                    206:                                if (outbits() < 0)
                    207:                                        return -1;
                    208:                                p1=p2+2;
                    209:                        } else p2++;
                    210: 
                    211:                } else if (ctype) {
                    212:                        if (outbits() < 0)
                    213:                                return -1;
                    214:                        p1=p2+1;
                    215:                        ctype=0;
                    216: 
                    217:                } else {
                    218:                        count--;
                    219:                        if (outbits() < 0)
                    220:                                return -1;
                    221:                        p1=p2;
                    222:                        ctype=1;
                    223:                }
                    224:        } while (p2 < endraster);
                    225: 
                    226:        if (p1 > endraster)
                    227:                return 0;
                    228:        if (p2 > endraster)
                    229:                count--;
                    230:        if (outbits() < 0)
                    231:                return -1;
                    232:        return 0;
                    233: }
                    234: 
                    235: outbits()
                    236: {      register c;
                    237:        register char *pout;
                    238: 
                    239:        c = count;
                    240:        if (ctype)
                    241:                c += 128, count=1;
                    242:        if (putc(c, ofd) < 0)
                    243:                return -1;
                    244:        c = sizeof(short)*count;
                    245:        pout = (char *)p1;
                    246:        while (--c >= 0)
                    247:                if (putc(*pout++, ofd) < 0)
                    248:                        return -1;
                    249:        return 0;
                    250: }

unix.superglobalmegacorp.com

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