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

1.1       root        1: #include <u.h>
                      2: #include <libc.h>
                      3: #include <libg.h>
                      4: #include <gnot.h>
                      5: 
                      6: extern int _setdda(int, int, Linedesc*);
                      7: int check(GBitmap *, Point, Point, int);
                      8: int cleared(GBitmap *, Rectangle);
                      9: void clear(GBitmap *);
                     10: Bitmap *gtob(GBitmap *);
                     11: int dbg;
                     12: 
                     13: int
                     14: main(int argc, char *argv[])
                     15: {
                     16:        int iters, ld, simple, i, rx, ry, any;
                     17:        Point rmin, rmax, p0, p1, pp0, pp1;
                     18:        long seed;
                     19:        int good;
                     20:        Rectangle clipr, gbr;
                     21:        GBitmap *gb;
                     22:        Linedesc l;
                     23:        char c;
                     24: 
                     25:        binit(0, 0, 0);
                     26:        ld = 0;
                     27:        iters = 1000;
                     28:        simple = 0;
                     29:        ARGBEGIN {
                     30:        case 'i':
                     31:                iters = atoi(ARGF());
                     32:                break;
                     33:        case 's':
                     34:                simple = 1;
                     35:                break;
                     36:        } ARGEND
                     37:        if(argc > 0)
                     38:                ld = atoi(argv[0]);
                     39:        if(simple) {
                     40:                rmin = Pt(0,0);
                     41:                rmax = Pt(500,500);
                     42:        } else {
                     43:                seed = time(0);
                     44:                print("seed %lux\n", seed);
                     45:                srand(seed);
                     46:                rmin = Pt(nrand(63)-31,nrand(63)-31);
                     47:                rmax = Pt(rmin.x+500,rmin.y+500);
                     48:        }
                     49:        gbr = Rpt(rmin,rmax);
                     50:        gb = gballoc(gbr, ld);
                     51:        rmin = add(rmin,Pt(5,5));
                     52:        rmax = sub(rmax,Pt(5,5));
                     53:        rx = rmax.x - rmin.x;
                     54:        ry = rmax.y - rmin.y;
                     55:        print("unclipped lines\n");
                     56:        good = 0;
                     57:        for(i = 0; i < iters; i++) {
                     58:                p0 = add(rmin,Pt(nrand(rx),nrand(ry)));
                     59:                p1 = add(rmin,Pt(nrand(rx),nrand(ry)));
                     60:                pp0 = p0;
                     61:                pp1 = p1;
                     62:                any = _clipline(gb->r, &pp0, &pp1, &l);
                     63:                gsegment(gb, p0, p1, ~0, S);
                     64:                if(!check(gb, pp0, pp1, any)) {
                     65:                        print("%d good\n", good);
                     66:                        print("failure drawing [%d,%d][%d,%d], closed=[%d,%d][%d,%d]; dx %d dy %d\n",
                     67:                                p0.x, p0.y, p1.x, p1.y,
                     68:                                pp0.x, pp0.y, pp1.x, pp1.y,
                     69:                                p1.x-p0.x, p1.y-p0.y);
                     70:                        good = 0;
                     71:                }else
                     72:                        good++;
                     73:                gsegment(gb, p0, p1, 0, Zero);
                     74:        }
                     75:        print("%d good\n", good);
                     76:        print("clipped lines\n");
                     77:        good = 0;
                     78:        for(i = 0; i < iters; i++) {
                     79:                p0 = add(rmin,Pt(nrand(rx),nrand(ry)));
                     80:                p1 = add(rmin,Pt(nrand(rx),nrand(ry)));
                     81:                pp0 = p0;
                     82:                pp1 = p1;
                     83:                clipr = rcanon(Rpt(add(rmin,Pt(nrand(rx),nrand(ry))),
                     84:                                   add(rmin,Pt(nrand(rx),nrand(ry)))));
                     85:                any = _clipline(clipr, &pp0, &pp1, &l);
                     86:                gb->r = clipr;
                     87:                gsegment(gb, p0, p1, ~0, S);
                     88:                gb->r = gbr;
                     89:                if(!check(gb, pp0, pp1, any)) {
                     90:                        print("%d good\n", good);
                     91:                        print("failure drawing [%d,%d][%d,%d], clip rect [[%d,%d][%d,%d]], clipped,closed=[%d,%d][%d,%d]; dx %d dy %d\n",
                     92:                                p0.x, p0.y, p1.x, p1.y,
                     93:                                clipr.min.x, clipr.min.y, clipr.max.x, clipr.max.y,
                     94:                                pp0.x, pp0.y, pp1.x, pp1.y,
                     95:                                p1.x-p0.x, p1.y-p0.y);
                     96:                        good = 0;
                     97:                }else
                     98:                        good++;
                     99:                /*
                    100:                 * Zero out the line without clipping: see if same pixels touched
                    101:                 */
                    102:                gsegment(gb, p0, p1, 0, Zero);
                    103:                if(!cleared(gb, clipr)) {
                    104:                        if(good) {
                    105:                                print("%d good\n", good);
                    106:                                print("failure to clear [%d,%d][%d,%d], clip rect [[%d,%d][%d,%d]], clipped,closed=[%d,%d][%d,%d]; dx %d dy %d\n",
                    107:                                        p0.x, p0.y, p1.x, p1.y,
                    108:                                        clipr.min.x, clipr.min.y,
                    109:                                        clipr.max.x, clipr.max.y,
                    110:                                        pp0.x, pp0.y, pp1.x, pp1.y,
                    111:                                        p1.x-p0.x, p1.y-p0.y);
                    112:                                good = 0;
                    113:                        }
                    114:                        clear(gb);
                    115:                        bflush();
                    116:                        read(0, &c, 1);
                    117:                }
                    118:        }
                    119:        print("%d good\n", good);
                    120: }
                    121: 
                    122: int
                    123: pixset(GBitmap *b, Point p)
                    124: {
                    125:        uchar *d;
                    126:        uchar mask;
                    127:        int l;
                    128:        ulong v;
                    129: 
                    130:        if(!ptinrect(p, b->r))
                    131:                return 0;
                    132:        d = gbaddr(b, p);
                    133:        l = b->ldepth;
                    134:        mask = (~0UL)<<(8-(1<<l));
                    135:        l = (p.x&(0x7>>l))<<l;
                    136:        mask >>= l;
                    137: 
                    138:        v = (*d & mask);
                    139:        if(dbg)
                    140:                print("pixset [%d,%d] -> %lux\n", p.x, p.y, v);
                    141:        return v;
                    142: }
                    143: 
                    144: int
                    145: check(GBitmap *b, Point p0, Point p1, int any)
                    146: {
                    147:        int ans, dirx, diry;
                    148: 
                    149:        dirx = (p0.x < p1.x)? 1 : -1;
                    150:        diry = (p0.y < p1.y)? 1 : -1;
                    151:        ans = (any? pixset(b, p0) : !pixset(b, p0)) &&
                    152:                !pixset(b, add(p0, Pt(0, -diry))) &&
                    153:                !pixset(b, add(p0, Pt(-dirx, 0))) &&
                    154:                !pixset(b, add(p0, Pt(-dirx, -diry))) &&
                    155:              (any? pixset(b, p1) : !pixset(b, p1)) &&
                    156:                !pixset(b, add(p1, Pt(0, diry))) &&
                    157:                !pixset(b, add(p1, Pt(dirx, 0))) &&
                    158:                !pixset(b, add(p1, Pt(dirx, diry)));
                    159:        if(!ans) {
                    160:                dbg = 1;
                    161:                pixset(b, p0);
                    162:                pixset(b, add(p0, Pt(0, -diry)));
                    163:                pixset(b, add(p0, Pt(-dirx, 0)));
                    164:                pixset(b, add(p0, Pt(-dirx, -diry)));
                    165:                pixset(b, p1);
                    166:                pixset(b, add(p1, Pt(0, diry)));
                    167:                pixset(b, add(p1, Pt(dirx, 0)));
                    168:                pixset(b, add(p1, Pt(dirx, diry)));
                    169:                dbg = 0;
                    170:        }
                    171:        return ans;
                    172: }
                    173: 
                    174: long
                    175: bwords(GBitmap *b)
                    176: {
                    177:        long lsize;
                    178:        int wsize;
                    179: 
                    180:        wsize = 1<<(5-b->ldepth);
                    181:        if(b->r.max.x >= 0)
                    182:                lsize = (b->r.max.x+wsize-1)/wsize;
                    183:        else
                    184:                lsize = b->r.max.x/wsize;
                    185:        if(b->r.min.x >= 0)
                    186:                lsize -= b->r.min.x/wsize;
                    187:        else
                    188:                lsize -= (b->r.min.x-wsize+1)/wsize;
                    189:        lsize *= Dy(b->r);
                    190:        return lsize;
                    191: }
                    192: 
                    193: int
                    194: cleared(GBitmap *b, Rectangle r)
                    195: {
                    196:        ulong *p, *pe;
                    197:        ulong n;
                    198:        int i, j;
                    199:        Bitmap *bb;
                    200: 
                    201:        p = b->base;
                    202:        n = bwords(b);
                    203:        pe = b->base + n;
                    204:        while(p < pe)
                    205:                if(*p++){
                    206:                        --p;
                    207:                        for(i=b->r.min.x; i<b->r.max.x; i++)
                    208:                        for(j=b->r.min.y; j<b->r.max.y; j++)
                    209:                                if(gaddr(b, Pt(i, j)) == p){
                    210:                                        print("bad pixel [%d,%d] %.8lux\n", i, j, *p);
                    211:                                        bb = gtob(b);
                    212:                                        bitblt(&screen, bb->r.min, bb, bb->r, S);
                    213:                                        border(&screen, inset(r, -5), 5, ~D);
                    214:                                        return 0;
                    215:                                }
                    216:                        return 0;
                    217:                }
                    218:        return 1;
                    219: }
                    220: 
                    221: void
                    222: clear(GBitmap *b)
                    223: {
                    224:        memset(b->base, 0, bwords(b)*sizeof(long));
                    225: }
                    226: 
                    227: Bitmap*
                    228: gtob(GBitmap *g)
                    229: {
                    230:        Bitmap *b;
                    231:        uchar *u;
                    232:        int y;
                    233: 
                    234:        b = balloc(g->r, g->ldepth);
                    235:        if(b == 0){
                    236:                print("can't balloc %R\n", g->r);
                    237:                exits(0);
                    238:        }
                    239:        u = (uchar*)gaddr(g, g->r.min);
                    240:        u += (g->r.min.x&31)/8;
                    241:        for(y=g->r.min.y; y<g->r.max.y; y++, u+=sizeof(long)*g->width)
                    242:                wrbitmap(b, y, y+1, u);
                    243:        return b;
                    244: }

unix.superglobalmegacorp.com

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