Annotation of researchv10no/cmd/pico/framebuffers/pmet0.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <signal.h>
        !             3: #include "pico.h"
        !             4: 
        !             5: #define lowbyte(A) (A)&0377
        !             6: #define higbyte(A) ((A) >> 8) & 07
        !             7: 
        !             8: extern short   CURSCRATCH, CUROLD;
        !             9: extern struct  SRC src[MANY];
        !            10: extern void    onquit();
        !            11: extern int     DEF_LL, DEF_NL;
        !            12: 
        !            13: metputitall(k)
        !            14: {      struct SRC *from = &src[k];
        !            15:        register unsigned char *pr, *pg, *pb, *w;
        !            16:        register int i, j;
        !            17:        int ex = from->sx + from->ex;
        !            18:        int offset, delta, sx = from->sx;
        !            19:        int sy = from->sy, ey = from->sy + from->ey;
        !            20:        unsigned char mcode[16];
        !            21:        unsigned char W[1024];
        !            22:        extern int om_fd;
        !            23: 
        !            24:        mcode[0] = 0x4F;
        !            25:        mcode[1] = 0377;        /* WRMASK */
        !            26:        mcode[2]  = 0x52;       /* set P1 */
        !            27:        mcode[7]  = 0x53;       /* set P2 */
        !            28:        mcode[12] = 0;
        !            29:        mcode[13] = 'o';
        !            30:        mcode[3]  = lowbyte(sx);
        !            31:        mcode[4]  = higbyte(sx);
        !            32:        mcode[8]  = lowbyte(ex);
        !            33:        mcode[9]  = higbyte(ex);
        !            34: 
        !            35:        offset = sy*DEF_LL + sx;
        !            36:        delta  = DEF_LL - ex + sx;
        !            37: 
        !            38:        pr = from->pixred+offset;
        !            39:        pg = from->pixgrn+offset;
        !            40:        pb = from->pixblu+offset;
        !            41: 
        !            42:        switch (from->nchan)
        !            43:        {       case 1:
        !            44:                        signal(SIGINT, SIG_IGN);
        !            45:                        for (i = sy; i < ey; i++, pr += (ex-sx)+delta)
        !            46:                        {       mcode[5] = mcode[10] = lowbyte(i);
        !            47:                                mcode[6] = mcode[11] = higbyte(i);
        !            48:                                write(om_fd, mcode, 14);
        !            49:                                write(om_fd, pr, ex-sx);
        !            50:                        }
        !            51:                        signal(SIGINT, onquit);
        !            52:                        break;
        !            53:                case 3: for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
        !            54:                        {       mcode[5] = mcode[10] = lowbyte(i);
        !            55:                                mcode[6] = mcode[11] = higbyte(i);
        !            56:                                for (j = sx, w = W; j < ex; j++)
        !            57:                                        *w++ =  ((*pr++ & 224))|
        !            58:                                                ((*pg++ & 224)>>3)|
        !            59:                                                ((*pb++ & 192)>>6);
        !            60:                                signal(SIGINT, SIG_IGN);
        !            61:                                write(om_fd, mcode, 14);
        !            62:                                write(om_fd, W, ex-sx);
        !            63:                                signal(SIGINT, onquit);
        !            64:                        }
        !            65:                        break;
        !            66:                default:
        !            67:                        fprintf(stderr, "undefined number of channels\n");
        !            68:                        break;
        !            69:        }
        !            70: }
        !            71: 
        !            72: metgetitall(from)
        !            73:        struct SRC *from;
        !            74: {
        !            75:        register unsigned char *pr, *pg, *pb, *w;
        !            76:        register int j, ex = from->sx + from->ex;
        !            77:        unsigned char W[1024];
        !            78:        int i, offset, delta, sx = from->sx;
        !            79:        int sy = from->sy, ey = from->sy + from->ey;
        !            80: 
        !            81:        if (from == Old)
        !            82:                fprintf(stderr, "reading screen...");
        !            83: 
        !            84:        offset = sy*DEF_LL + sx;
        !            85:        delta  = DEF_LL - ex + sx;
        !            86: 
        !            87:        pr = from->pixred+offset;
        !            88:        pg = from->pixgrn+offset;
        !            89:        pb = from->pixblu+offset;
        !            90: 
        !            91:        switch (from->nchan)
        !            92:        {       case 1:
        !            93:                        for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
        !            94:                        {       metri(pr, 0, i, DEF_LL);
        !            95:                                for (j = sx; j < ex; j++)
        !            96:                                {       *pg++ = *pb++ = *pr++;
        !            97:                                }
        !            98:                        }
        !            99:                        break;
        !           100:                case 3:
        !           101:                        for (i = sy; i < ey; i++, pr+=delta, pg+=delta, pb+=delta)
        !           102:                        {       metri(W, 0, i, DEF_LL);
        !           103:                                for (j = sx, w = W; j < ex; j++, w++)
        !           104:                                {       *pr++ = (*w&224);
        !           105:                                        *pg++ = (*w& 28)<<3;
        !           106:                                        *pb++ = (*w&  3)<<6;
        !           107:                        }       }
        !           108:                        break;
        !           109:                default:
        !           110:                        fprintf(stderr, "undefined number of channels\n");
        !           111:                        break;
        !           112:        }
        !           113:        if (from == Old)
        !           114:                fprintf(stderr, "\n");
        !           115:        RESIDENT;
        !           116: }
        !           117: 
        !           118: metlyank(x, y)
        !           119: {      register int i;
        !           120:        register unsigned char *pr, *pg, *pb, *w;
        !           121:        unsigned char W[1024];
        !           122:        extern char faster;
        !           123:        int from=Old->sx, to=Old->ex;
        !           124: 
        !           125:        if (y < Old->sy || y >= Old->ey) return;
        !           126: 
        !           127:        if (!faster)
        !           128:        {       metyank(x, y);
        !           129:                return;
        !           130:        } else
        !           131:        {       if (x != 0)
        !           132:                        return;
        !           133:        }
        !           134:        i = (y < 1 || y >= DEF_LL) ? 0 : DEF_LL*(y-1);
        !           135:        pr = scratchred+i;
        !           136: 
        !           137:        if (Old->nchan ==1)
        !           138:                w = pr;
        !           139:        else
        !           140:        {       pg = scratchgrn+i;
        !           141:                pb = scratchblu+i;
        !           142:                for (i = from, w = W; i < to; i++)
        !           143:                        *w++ =  ((*pr++ & 224))|
        !           144:                                ((*pg++ & 224)>>3)|
        !           145:                                ((*pb++ & 192)>>6);
        !           146:                w = W;
        !           147:        }
        !           148:        metwi(w, to-from, from, y);
        !           149: 
        !           150:        return 1;
        !           151: }
        !           152: 
        !           153: metyank(x, y)
        !           154: {      register int i = DEF_LL*y+x;
        !           155:        unsigned char *pr = scratchred+i;
        !           156:        unsigned char *pg = scratchgrn+i;
        !           157:        unsigned char *pb = scratchblu+i;
        !           158:        unsigned char w;
        !           159: 
        !           160:        if (Old->nchan == 1)
        !           161:                w = *pr;
        !           162:        else
        !           163:                w = ((*pr & 224))| ((*pg & 224)>>3)| ((*pb & 192)>>6);
        !           164: 
        !           165:        metwi(&w, 1, x, y);
        !           166: 
        !           167:        return 1;
        !           168: }
        !           169: 
        !           170: extern unsigned char Rmap[256], Gmap[256], Bmap[256];
        !           171: 
        !           172: metredcmap(i, z)
        !           173: {      int j = i%256;
        !           174:        int k = z%256;
        !           175: 
        !           176:        Rmap[j] = k;
        !           177:        if (j == 255) dometcmap();
        !           178:        return k;
        !           179: }
        !           180: 
        !           181: metgrncmap(i, z)
        !           182: {      int j = i%256;
        !           183:        int k = z%256;
        !           184: 
        !           185:        Gmap[j] = k;
        !           186:        if (j == 255) dometcmap();
        !           187:        return k;
        !           188: }
        !           189: 
        !           190: metblucmap(i, z)
        !           191: {      int j = i%256;
        !           192:        int k = z%256;
        !           193: 
        !           194:        Bmap[j] = k;
        !           195:        if (j == 255) dometcmap();
        !           196:        return k;
        !           197: }
        !           198: 
        !           199: dometcmap()
        !           200: {      struct scolor {
        !           201:                char tag, loc;
        !           202:                char red, grn, blu;
        !           203:                char zero;
        !           204:        } color[256];
        !           205:        char b[8];
        !           206:        register struct scolor *cp = color;
        !           207:        register int i;
        !           208:        extern int om_fd;
        !           209: 
        !           210:        if (Old->nchan == 1)
        !           211:        for (i = 0; i < 256; i++, cp++)
        !           212:        {       cp->tag = 'Q';
        !           213:                cp->loc = i;
        !           214:                cp->red = Rmap[i];
        !           215:                cp->grn = Gmap[i];
        !           216:                cp->blu = Bmap[i];
        !           217:                cp->zero = 0;
        !           218:        }
        !           219:        else
        !           220:        for (i = 0; i < 256; i++, cp++)
        !           221:        {       cp->tag = 'Q';
        !           222:                cp->loc = i;
        !           223:                cp->red = (Rmap[i]&224) ? (Rmap[i]&224)    : 0;
        !           224:                cp->grn = (Gmap[i]& 28) ? (Gmap[i]& 28)<<3 : 0;
        !           225:                cp->blu = (Bmap[i]&  3) ? (Bmap[i]&  3)<<6 : 0;
        !           226:                cp->zero = 0;
        !           227:        }
        !           228: 
        !           229:        b[0] = 'O'; b[1] = 0377;
        !           230:        signal(SIGINT, SIG_IGN);
        !           231:        write(om_fd, b, 2);
        !           232:        write(om_fd, color, sizeof(color));
        !           233:        signal(SIGINT, onquit);
        !           234: }
        !           235: 
        !           236: metgetcmap(i, r,g,b)
        !           237: {      int h = 0, k = 0;
        !           238: 
        !           239:        if (r) { h++; k += Rmap[i]; }
        !           240:        if (g) { h++; k += Gmap[i]; }
        !           241:        if (b) { h++; k += Bmap[i]; }
        !           242:        if (h > 1) k /= h;
        !           243: 
        !           244:        return k;
        !           245: }

unix.superglobalmegacorp.com

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