Annotation of lucent/sys/src/libgnot/gsegment.c, revision 1.1.1.1

1.1       root        1: #include <u.h>
                      2: #include <libg.h>
                      3: #include <gnot.h>
                      4: 
                      5: #define        PSHIFT(x, y)    {if(LENDIAN) x <<= y; else x >>= y;}
                      6: 
                      7: int
                      8: _setdda(int x, int y, Linedesc *l)
                      9: {
                     10:        int e;
                     11: 
                     12:        /*
                     13:         * Unfold all the symmetry folded out in gsetline()
                     14:         */
                     15:        if(l->slopeneg == 0)
                     16:                e = ((2*(x-l->x0)+2)*l->dminor
                     17:                        -(2*(y-l->y0)+1)*l->dmajor);
                     18:        else{
                     19:                if(l->xmajor)
                     20:                        e = ((2*(x-l->x0)+2)*l->dminor
                     21:                                +(2*(l->y0+y)-1)*l->dmajor);
                     22:                else
                     23:                        e = ((2*(l->x0-x)+2)*l->dminor
                     24:                                -(2*(l->y0+y)+1)*l->dmajor)-1;
                     25:        }
                     26:        return e;
                     27: }
                     28: 
                     29: /*
                     30:  * Strange, usually fast line code.
                     31:  * Based on the observation that given src and f, src is constant
                     32:  * for the call, so we can reduce f by that symmetry.  Then we can
                     33:  * reduce it again by choosing the src we actually run with; thus
                     34:  *     src, f -> src', f'
                     35:  * In the code, src is replicated through the register m.
                     36:  * The f's we choose (they are somewhat arbitrary) are
                     37:  *     f(0) = S & D
                     38:  * and
                     39:  *     f(1) = S | ~D,
                     40:  * chosen by the bits of the incoming f.  In particular, if
                     41:  *     src == 0
                     42:  * we select
                     43:  *     f' = f&1, src' = (f&2) >> 1
                     44:  * else
                     45:  *     f' = (f>>2)&1, src' = ((f>>2)&2) >> 1
                     46:  * If src is all 1's or all 0's (guaranteed true on a 1-bit display),
                     47:  * this is all we need; otherwise (the slower case) we insert into the dest
                     48:  * twice: once for the 1 bits in src, once for the 0 bits, using f' and src'
                     49:  * each computed as above.
                     50:  */
                     51: 
                     52: void
                     53: gsegment(GBitmap *b, Point p, Point q, int src, Fcode f)
                     54: {
                     55:        int i, dw, dx, dy;
                     56:        int e, e1, e2;
                     57:        uchar m, m1, k, k0, k1, f0, f1, lom, him, him0, him1, t, *dest;
                     58:        int ld, bpp, xshift;
                     59:        int m0, lo, lo0, lo1, kk, kk0, kk1;
                     60:        Linedesc l;
                     61: 
                     62:        if(!_clipline(b->clipr, &p, &q, &l))
                     63:                return;
                     64:        /* line is now clipped and closed */
                     65:        dx = q.x - p.x;
                     66:        dy = q.y - p.y;
                     67:        if(dx < 0)      /* can't happen, but breaks code if it does */
                     68:                return;
                     69: 
                     70:        ld = b->ldepth;
                     71:        bpp = 8>>(3-ld);
                     72:        lom = ((1<<bpp)-1);
                     73:        him = lom<<(8-bpp);
                     74:        xshift = (p.x&(7>>ld))<<ld;
                     75:        if(LENDIAN)
                     76:                xshift = 8-bpp - xshift;
                     77:        k = him>>xshift;        /* mask */
                     78:        lo = src&lom;
                     79: 
                     80:        if(lo==lom || lo==0){
                     81:                /*
                     82:                 * set new f, new src
                     83:                 */
                     84:                if(lo)
                     85:                        f >>= 2;
                     86:                f &= 3;
                     87:                if(f & 2)
                     88:                        lo = lom;
                     89:                else
                     90:                        lo = 0;
                     91:                f &= 1;
                     92:                /*
                     93:                 * develop m as a register full of pixels containing 'lo1'
                     94:                 */
                     95:                m = lo;
                     96:                for(i=1<<ld; i<8; i+=i)
                     97:                        m |= m<<i;
                     98:        }else{
                     99:                /*
                    100:                 * set *1 for 1 bits; *0 for 0 bits
                    101:                 */
                    102:                f1 = (f>>2)&3;
                    103:                if(f1 & 2)
                    104:                        lo1 = lom & lo;
                    105:                else
                    106:                        lo1 = 0;
                    107:                f1 &= 1;
                    108:                him1 = (lom&lo)<<(8-bpp);
                    109:                k1 = him1>>xshift;      /* mask */
                    110:                f0 = f&3;
                    111:                if(f0 & 2)
                    112:                        lo0 = lom & ~lo;
                    113:                else
                    114:                        lo0 = 0;
                    115:                f0 &= 1;
                    116:                him0 = (lom&~lo)<<(8-bpp);
                    117:                k0 = him0>>xshift;      /* mask */
                    118:                /*
                    119:                 * develop m0, m1 as a register full of pixels containing 'lo1'
                    120:                 */
                    121:                m0 = lo0;
                    122:                m1 = lo1;
                    123:                for(i=1<<ld; i<8; i+=i){
                    124:                        m0 |= m0<<i;
                    125:                        m1 |= m1<<i;
                    126:                }
                    127:                f = 2;
                    128:        }
                    129: 
                    130:        if(LENDIAN){
                    131:                him >>= 8-bpp;
                    132:                him0 >>= 8-bpp;
                    133:                him1 >>= 8-bpp;
                    134:        }
                    135:        
                    136:        dw = b->width*sizeof(ulong);
                    137:        if(dy < 0){
                    138:                dw = -dw;
                    139:                dy = -dy;
                    140:        }
                    141:        dest = (uchar*)gaddr(b, p) + ((p.x&(31>>ld))>>(3-ld));
                    142:        e1 = 2*l.dminor;
                    143:        e2 = e1 - 2*l.dmajor;
                    144:        if(l.xmajor == 0)
                    145:                goto majory;
                    146: 
                    147: majorx:
                    148:        e = _setdda(p.x, p.y, &l);
                    149:        switch(f){
                    150:        case 0:
                    151:                kk = 0;
                    152:                for(i=dx; i>=0; i--){
                    153:                        kk |= k;
                    154:                        PSHIFT(k, bpp);
                    155:                        if(e >= 0){
                    156:                                *dest &= m|~kk;
                    157:                                dest += dw;
                    158:                                e += e2;
                    159:                                kk = 0;
                    160:                                if(k == 0){
                    161:                                        k = him;
                    162:                                        dest++;
                    163:                                }
                    164:                                continue;
                    165:                        }
                    166:                        e += e1;
                    167:                        if(k == 0){
                    168:                                k = him;
                    169:                                *dest &= m|~kk;
                    170:                                dest++;
                    171:                                kk = 0;
                    172:                        }
                    173:                }
                    174:                if(kk)
                    175:                        *dest &= m|~kk;
                    176:                return;
                    177: 
                    178:        case 1:
                    179:                kk = 0;
                    180:                for(i=dx; i>=0; i--){
                    181:                        kk |= k;
                    182:                        PSHIFT(k, bpp);
                    183:                        if(e >= 0){
                    184:                                t = *dest;
                    185:                                *dest = (kk ^ t) | (t & m);
                    186:                                dest += dw;
                    187:                                e += e2;
                    188:                                kk = 0;
                    189:                                if(k == 0){
                    190:                                        k = him;
                    191:                                        dest++;
                    192:                                }
                    193:                                continue;
                    194:                        }
                    195:                        e += e1;
                    196:                        if(k == 0){
                    197:                                t = *dest;
                    198:                                *dest = (kk ^ t) | (t & m);
                    199:                                dest++;
                    200:                                k = him;
                    201:                                kk = 0;
                    202:                        }
                    203:                }
                    204:                if(kk){
                    205:                        t = *dest;
                    206:                        *dest = (kk ^ t) | (t & m);
                    207:                }
                    208:                return;
                    209: 
                    210:        case 2:
                    211:                kk = 0;
                    212:                kk0 = 0;
                    213:                kk1 = 0;
                    214:                for(i=dx; i>=0; i--){
                    215:                        kk |= k;
                    216:                        kk0 |= k0;
                    217:                        kk1 |= k1;
                    218:                        PSHIFT(k, bpp);
                    219:                        PSHIFT(k0, bpp);
                    220:                        PSHIFT(k1, bpp);
                    221:                        if(e >= 0){
                    222:                                t = *dest;
                    223:                                if(f0 == 0)
                    224:                                        t &= m0|~kk0;
                    225:                                else
                    226:                                        t = (kk0 ^ t) | (t & m0);
                    227:                                if(f1 == 0)
                    228:                                        *dest = t & (m1|~kk1);
                    229:                                else
                    230:                                        *dest = (kk1 ^ t) | (t & m1);
                    231:                                dest += dw;
                    232:                                e += e2;
                    233:                                kk = 0;
                    234:                                kk0 = 0;
                    235:                                kk1 = 0;
                    236:                                if(k == 0){
                    237:                                        k = him;
                    238:                                        k0 = him0;
                    239:                                        k1 = him1;
                    240:                                        dest++;
                    241:                                }
                    242:                                continue;
                    243:                        }
                    244:                        e += e1;
                    245:                        if(k == 0){
                    246:                                t = *dest;
                    247:                                if(f0 == 0)
                    248:                                        t &= m0|~kk0;
                    249:                                else
                    250:                                        t = (kk0 ^ t) | (t & m0);
                    251:                                if(f1 == 0)
                    252:                                        *dest = t & (m1|~kk1);
                    253:                                else
                    254:                                        *dest = (kk1 ^ t) | (t & m1);
                    255:                                dest++;
                    256:                                k = him;
                    257:                                k0 = him0;
                    258:                                k1 = him1;
                    259:                                kk = 0;
                    260:                                kk0 = 0;
                    261:                                kk1 = 0;
                    262:                        }
                    263:                }
                    264:                if(kk){
                    265:                        t = *dest;
                    266:                        if(f0 == 0)
                    267:                                t &= m0|~kk0;
                    268:                        else
                    269:                                t = (kk0 ^ t) | (t & m0);
                    270:                        if(f1 == 0)
                    271:                                *dest = t & (m1|~kk1);
                    272:                        else
                    273:                                *dest = (kk1 ^ t) | (t & m1);
                    274:                }
                    275:                return;
                    276:        }
                    277:        return;
                    278: 
                    279: majory:
                    280:        e = _setdda(p.y, p.x, &l);
                    281:        switch (f){
                    282:        case 0:
                    283:                for(i=dy; i>=0; --i){
                    284:                        *dest &= m|~k;
                    285:                        dest += dw;
                    286:                        if(e >= 0){
                    287:                                PSHIFT(k, bpp);
                    288:                                if(k == 0){
                    289:                                        dest++;
                    290:                                        k = him;
                    291:                                }
                    292:                                e += e2;
                    293:                        }else
                    294:                                e += e1;
                    295:                }
                    296:                return;
                    297: 
                    298:        case 1:
                    299:                for(i=dy; i>=0; --i){
                    300:                        t = *dest;
                    301:                        *dest = (k ^ t) | (t & m);
                    302:                        dest += dw;
                    303:                        if(e >= 0){
                    304:                                PSHIFT(k, bpp);
                    305:                                if(k == 0){
                    306:                                        dest++;
                    307:                                        k = him;
                    308:                                }
                    309:                                e += e2;
                    310:                        }else
                    311:                                e += e1;
                    312:                }
                    313:                return;
                    314: 
                    315:        case 2:
                    316:                for(i=dy; i>=0; --i){
                    317:                        t = *dest;
                    318:                        if(f0 == 0)
                    319:                                t &= m0|~k0;
                    320:                        else
                    321:                                t = (k0 ^ t) | (t & m0);
                    322:                        if(f1 == 0)
                    323:                                *dest = t & (m1|~k1);
                    324:                        else
                    325:                                *dest = (k1 ^ t) | (t & m1);
                    326:                        dest += dw;
                    327:                        if(e >= 0){
                    328:                                PSHIFT(k, bpp);
                    329:                                PSHIFT(k0, bpp);
                    330:                                PSHIFT(k1, bpp);
                    331:                                if(k == 0){
                    332:                                        dest++;
                    333:                                        k = him;
                    334:                                        k0 = him0;
                    335:                                        k1 = him1;
                    336:                                }
                    337:                                e += e2;
                    338:                        }else
                    339:                                e += e1;
                    340:                }
                    341:        }
                    342:        return;
                    343: }

unix.superglobalmegacorp.com

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