Annotation of researchv10no/cmd/view2d/jerq.c, revision 1.1

1.1     ! root        1: #include       <jerq.h>
        !             2: #include       <font.h>
        !             3: #undef xmax
        !             4: #undef ymax
        !             5: 
        !             6: #define                MAX             32767
        !             7: #define                ONE             512
        !             8: 
        !             9: #define        max(a,b)        ((a) > (b)? (a):(b))
        !            10: #define        abs(a)  ((a) >= 0? (a):-(a))
        !            11: 
        !            12: #ifdef lint
        !            13:        struct Mouse mouse;
        !            14: #endif lint
        !            15: 
        !            16: typedef struct Frame
        !            17: {
        !            18:        char time[20];
        !            19:        Bitmap *b;
        !            20: } Frame;
        !            21: Frame *frames;
        !            22: int maxframe;
        !            23: int start, nx, ny;
        !            24: int doshade = 0;
        !            25: int showgrid = 0;
        !            26: int ragnorok, nsleep;
        !            27: #define        SPEED   128
        !            28: #define        MSPEED  8192
        !            29: int speed = SPEED;
        !            30: int period;
        !            31: short floor;
        !            32: short zdata[4096];
        !            33: Rectangle bound;
        !            34: long dtime, rtime;
        !            35: extern char *genfn();
        !            36: Menu menu = { (char **)0, genfn };
        !            37: int N;
        !            38: Point  ctr, dpt;
        !            39: int    rad;
        !            40: int nf;
        !            41: short xmin, xmax, ymax, ymin;
        !            42: 
        !            43: Point
        !            44: grid(x, y)
        !            45: {
        !            46:        Point p;
        !            47: 
        !            48:        p.x = N*(x-y);
        !            49:        p.y = -(x+y-ny)*N/2;
        !            50:        return(add(p, dpt));
        !            51: }
        !            52: 
        !            53: #define        BB(n)   bitblt(frames[n].b, frames[n].b->rect, &display, ctr, F_STORE)
        !            54: #define        STOP    ((own()&MOUSE) && button123())
        !            55: 
        !            56: main()
        !            57: {
        !            58:        int n, done, x, y;
        !            59: 
        !            60:        request(RCV|SEND|MOUSE|KBD);
        !            61:        initgrey();
        !            62: 
        !            63:        dpt = div(add(Drect.origin, Drect.corner), 2);
        !            64: 
        !            65:        for(wait(RCV); (n = rcvchar()) != 'Q'; wait(RCV))
        !            66:                switch(n)
        !            67:                {
        !            68:                case 'G':
        !            69:                        showgrid = 1;
        !            70:                        break;
        !            71:                case 'S':
        !            72:                        doshade = 1;
        !            73:                        break;
        !            74:                case 'X':
        !            75:                        nx = getn();
        !            76:                        break;
        !            77:                case 'Y':
        !            78:                        ny = getn();
        !            79:                        break;
        !            80:                case 'P':
        !            81:                        period = getn();
        !            82:                        break;
        !            83:                case 'n':
        !            84:                        nf = getn();
        !            85:                        frames = (Frame *)alloc(nf*sizeof(struct Frame));
        !            86:                        break;
        !            87:                case 'F':
        !            88:                        gets(frames[maxframe].time);
        !            89:                        showf(maxframe, frames[maxframe].time);
        !            90:                        read(nx*ny);
        !            91:                        if(maxframe == 0)
        !            92:                                sizeit();
        !            93:                        if(frames[maxframe].b = balloc(bound))
        !            94:                        {
        !            95:                                draw(frames[maxframe].b);
        !            96:                                BB(maxframe);
        !            97:                                maxframe++;
        !            98:                        }
        !            99:                        break;
        !           100:                case 'I':
        !           101:                        floor = getn();
        !           102:                        break;
        !           103:                }
        !           104: 
        !           105:        rectf(&display, Drect, F_CLR);
        !           106:        showt();
        !           107:        start = 0;
        !           108:        done = 0;
        !           109:        goto startoff;
        !           110:        while(done == 0)
        !           111:        {
        !           112:                wait(MOUSE);
        !           113:                if(!button3()) continue;
        !           114:                switch(n = menuhit(&menu, 3))
        !           115:                {
        !           116:                case -1:
        !           117:                case 0:
        !           118:                        break;
        !           119:                case 1:
        !           120:                        if((speed >>= 1) < 1) speed = 1;
        !           121:                        break;
        !           122:                case 2:
        !           123:                        if((speed <<= 1) > MSPEED) speed = MSPEED;
        !           124:                        break;
        !           125:                case 3:
        !           126:                        play(start, start? start-1:maxframe-1);
        !           127:                        break;
        !           128:                case 4:
        !           129:        startoff:
        !           130:                        while(!STOP)
        !           131:                                play(start, start? start-1:maxframe-1);
        !           132:                        break;
        !           133:                case 5:
        !           134:                        done = 1;
        !           135:                        break;
        !           136:                default:
        !           137:                        n -= 6;
        !           138:                        BB(n);
        !           139:                        start = n;
        !           140:                        break;
        !           141:                }
        !           142:        } 
        !           143:        sendnchars(2, "x\n");
        !           144:        sleep(500);
        !           145: }
        !           146: 
        !           147: char buf[128], *str;
        !           148: 
        !           149: /*VARARGS2*/
        !           150: spr(s, n, m)
        !           151:        char *s;
        !           152:        unsigned n, m;
        !           153: {
        !           154:        str = buf;
        !           155:        while(*s)
        !           156:        {
        !           157:                if((*str++ = *s++) == '%')
        !           158:                {
        !           159:                        str--;
        !           160:                        if(n != 0xFFFF) digit(n), n = 0xFFFF;
        !           161:                        else    digit(m);
        !           162:                }
        !           163:        }
        !           164:        *str++ = 0;
        !           165: }
        !           166: 
        !           167: digit(n)
        !           168:        unsigned n;
        !           169: {
        !           170:        if(n >= 10) digit(n/10);
        !           171:        *str++ = (n%10) + '0';
        !           172: }
        !           173: 
        !           174: showf(n, t)
        !           175:        char *t;
        !           176: {
        !           177:        spr("reading frame %: time=", n);
        !           178:        while(*str++ = *t++);
        !           179:        str--;
        !           180:        string(&defont, buf, &display, add(Drect.origin, Pt(5, 5)), F_STORE);
        !           181: }
        !           182: 
        !           183: showt()
        !           184: {
        !           185:        spr("total draw time=%, read time=% Hz", (int)(dtime/maxframe), (int)(rtime/maxframe));
        !           186:        string(&defont, buf, &display, Drect.origin, F_STORE);
        !           187: }
        !           188: 
        !           189: char *
        !           190: genfn(i)
        !           191: {
        !           192:        switch(i)
        !           193:        {
        !           194:        case 0: spr("% frames t=%", maxframe, ragnorok); break;
        !           195:        case 1: spr("slower"); break;
        !           196:        case 2: spr("faster"); break;
        !           197:        case 3: spr("play %-%", start, start? start-1:maxframe-1); break;
        !           198:        case 4: spr("loop %-%", start, start? start-1:maxframe-1); break;
        !           199:        case 5: spr("exit"); break;
        !           200:        default:
        !           201:                i -= 6;
        !           202:                if(i >= maxframe) return((char *)0);
        !           203:                else
        !           204:                {
        !           205:                        spr("frame % t=", i);
        !           206:                        strcpy(str, frames[i].time);
        !           207:                }
        !           208:                break;
        !           209:        }
        !           210:        return(buf);
        !           211: }
        !           212:        
        !           213: getn()
        !           214: {
        !           215:        register i, j;
        !           216: 
        !           217:        if((i = rcvchar()) == -1)
        !           218:        {
        !           219:                wait(RCV);
        !           220:                i = rcvchar();
        !           221:        }
        !           222:        i <<= 8;
        !           223:        if((j = rcvchar()) == -1)
        !           224:        {
        !           225:                wait(RCV);
        !           226:                j = rcvchar();
        !           227:        }
        !           228:        j &= 0xff;
        !           229:        return((i|j)&0xffff);
        !           230: }
        !           231: 
        !           232: gets(s)
        !           233:        char *s;
        !           234: {
        !           235:        register k;
        !           236: 
        !           237:        for(k = -1; k; s++)
        !           238:        {
        !           239:                if((k = rcvchar()) == -1)
        !           240:                {
        !           241:                        wait(RCV);
        !           242:                        k = rcvchar();
        !           243:                }
        !           244:                *s = k;
        !           245:        }
        !           246: }
        !           247: 
        !           248: read(n)
        !           249: {
        !           250:        register short *s = zdata;
        !           251:        long tim;
        !           252: 
        !           253:        tim = realtime();
        !           254:        while(n--)
        !           255:                *s++ = getn();
        !           256:        rtime += realtime()-tim;
        !           257: }
        !           258: 
        !           259: play(a, b)
        !           260: {
        !           261:        long target;
        !           262:        int step;
        !           263: #define        INC(x)  if(++x == maxframe) x = 0
        !           264: 
        !           265:        step = period*60;
        !           266:        if(nf > 1) step /= nf-1;
        !           267:        step = muldiv(step, SPEED, speed);
        !           268:        target = realtime();
        !           269:        a--;
        !           270:        do
        !           271:        {
        !           272:                INC(a);
        !           273:                BB(a);
        !           274:                for(target += step; target > realtime(); sleep(1));
        !           275:        } while((a != b) && !STOP);
        !           276:        rectf(&display, raddp(frames[0].b->rect, sub(ctr, frames[0].b->rect.origin)), F_CLR);
        !           277:        sleep(muldiv(20, SPEED, speed));
        !           278: }
        !           279: 
        !           280: Point
        !           281: conv(x, y, z)
        !           282: {
        !           283:        Point p;
        !           284:        p = grid(x, y);
        !           285:        p.y -= muldiv(z, rad, MAX);
        !           286:        return(p);
        !           287: }
        !           288: 
        !           289: Texture backgnd =
        !           290: {
        !           291:        0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
        !           292:        0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
        !           293: };
        !           294: 
        !           295: #define        Z(x,y)  zdata[(x)+nx*(y)]
        !           296: #define        POLY(x1,y1,x2,y2,x3,y3,x4,y4)   poly(b,conv(x1,y1,Z(x1,y1)),conv(x2,y2,Z(x2,y2)),conv(x3,y3,Z(x3,y3)),conv(x4,y4,Z(x4,y4)),light(x1,y1-1),F_STORE)
        !           297: #define        SEG(x1,y1,x2,y2)        {int z1,z2; z1=Z(x1,y1); z2=Z(x2,y2); if((z1>=floor)&&(z2>=floor))segment(b,conv(x1,y1,z1),conv(x2,y2,z2),F_OR);}
        !           298: 
        !           299: draw(b)
        !           300:        Bitmap *b;
        !           301: {
        !           302:        register j, x, y;
        !           303:        int lasty;
        !           304:        long tim;
        !           305: 
        !           306:        if(doshade)
        !           307:                texture(b, b->rect, &backgnd, F_STORE);
        !           308:        else
        !           309:                rectf(b, b->rect, F_CLR);
        !           310:        tim = realtime();
        !           311:        if(showgrid && (doshade == 0))
        !           312:        {
        !           313:                for(y = 0; y < ny; y++)
        !           314:                {
        !           315:                        for(x = 0; x < nx; x++)
        !           316:                        {
        !           317:                                if(y) SEG(x, y-1, x, y);
        !           318:                                if(x) SEG(x-1, y, x, y);
        !           319:                        }
        !           320:                        wait(CPU);
        !           321:                }
        !           322:        }
        !           323:        else
        !           324:                for(j = nx+ny-3; j > 0; j--)
        !           325:                {
        !           326:                        y = min(ny-1, j);
        !           327:                        lasty = x = j-y;
        !           328:                        while(y != lasty)
        !           329:                        {
        !           330:                                POLY(x, y, x, y-1, x+1, y-1, x+1, y);
        !           331:                                x++;
        !           332:                                y--;
        !           333:                        }
        !           334:                        wait(CPU);
        !           335:                }
        !           336:        dtime += realtime() - tim;
        !           337: }
        !           338: 
        !           339: #define        NGREY   16
        !           340: 
        !           341: Texture grey[NGREY];
        !           342: 
        !           343: poly(bm, p1, p2, p3, p4, illum, mode)
        !           344:        Bitmap *bm;
        !           345:        Point p1, p2, p3, p4;
        !           346: {
        !           347:        illum /= ONE/NGREY;
        !           348:        if(doshade) ppfill(&p1, 4, bm, &grey[illum], mode);
        !           349:        if(showgrid)
        !           350:        {
        !           351:                if(illum == 0) mode = F_CLR;
        !           352:                segment(bm, p1, p2, mode);
        !           353:                segment(bm, p2, p3, mode);
        !           354:                segment(bm, p3, p4, mode);
        !           355:                segment(bm, p4, p1, mode);
        !           356:        }
        !           357: }
        !           358: 
        !           359: int lx, ly, lz;
        !           360: 
        !           361: light(X, Y)
        !           362: {
        !           363:        int x, y, z;
        !           364:        int res;
        !           365:        long a, len, m;
        !           366: 
        !           367:        if(doshade == 0) return(ONE-1);
        !           368:        x = (Z(X+1, Y)-Z(X, Y) + Z(X+1, Y-1)-Z(X, Y-1))/2;
        !           369:        y = (Z(X, Y)-Z(X, Y-1) + Z(X+1, Y)-Z(X+1, Y-1))/2;
        !           370:        z = (abs(X)+abs(Y));
        !           371:        len = sqrt(x*(long)x + y*(long)y + z*(long)z);
        !           372:        if(len == 0) len++;
        !           373:        x = muldiv(x, ONE, len);
        !           374:        y = muldiv(y, ONE, len);
        !           375:        z = muldiv(z, ONE, len);
        !           376:        res = muldiv(x, lx, ONE) + muldiv(y, ly, ONE) + muldiv(z, lz, ONE);
        !           377:        if(res < 0) res = 0;
        !           378:        return(res);
        !           379: }
        !           380: 
        !           381: initgrey()
        !           382: {
        !           383:        register mask, k, level, j, w, i;
        !           384:        Rectangle r;
        !           385: 
        !           386:        lx = -50; ly = 360; lz = 360;
        !           387: 
        !           388:        r = Drect;
        !           389:        r.corner.x = ((NGREY-1)*(long)Drect.origin.x+Drect.corner.x)/NGREY;
        !           390:        for(i = 0; i < NGREY-1; i++)
        !           391:        {
        !           392:                mask = 1;
        !           393:                w = 0;
        !           394:                level = ONE*i/(NGREY-1);
        !           395:                for(j = 0; j < 16; j++)
        !           396:                {
        !           397:                        for(k = 0; k < 16; k++)
        !           398:                        {
        !           399:                                if(nrand(ONE) > level) w |= mask;
        !           400:                                mask <<= 1;
        !           401:                        }
        !           402:                        grey[i].bits[j] = w;
        !           403:                        w = 0;
        !           404:                        mask = 1;
        !           405:                }
        !           406:                /*texture(&display, r, &grey[i], F_STORE);
        !           407:                r = raddp(r, Pt(r.corner.x-r.origin.x, 0));*/
        !           408:        }
        !           409: }
        !           410: 
        !           411: nrand(n)
        !           412: {
        !           413:        return(muldiv(rand(), n, 32767));
        !           414: }
        !           415: 
        !           416: #define                FUDGE           20
        !           417: 
        !           418: sizeit()
        !           419: {
        !           420:        register i, j;
        !           421:        Point p;
        !           422:        Bitmap *b;
        !           423: 
        !           424:        for(N = 10; N > 3; N--)
        !           425:        {
        !           426:                rad = 4*N;
        !           427:                xmin = XMAX; xmax = 0; ymax = 0; ymin = YMAX;
        !           428:                for(i = 0; i < nx; i++)
        !           429:                        for(j = 0; j < ny; j++)
        !           430:                        {
        !           431:                                p = conv(i, j, Z(i, j));
        !           432:                                if(p.x < xmin) xmin = p.x;
        !           433:                                if(p.x > xmax) xmax = p.x;
        !           434:                                if(p.y > ymax) ymax = p.y;
        !           435:                                if(p.y < ymin) ymin = p.y;
        !           436:                        }
        !           437:                xmin -= FUDGE; xmax += FUDGE; ymin -= FUDGE; ymax += FUDGE;
        !           438:                i = xmax-xmin;
        !           439:                j = ymax-ymin;
        !           440:                if((i > (Drect.corner.x-Drect.origin.x)) || (j > (Drect.corner.y-Drect.origin.y)))
        !           441:                        continue;
        !           442:                if(b = balloc(Rect(0, 0, i, nf*j)))
        !           443:                {
        !           444:                        bfree(b);
        !           445:                        break;
        !           446:                }
        !           447:        }
        !           448:        bound = raddp(Rect(xmin, ymin, xmax, ymax), Pt(0, 0));
        !           449:        ctr = sub(dpt, Pt((xmax-xmin)/2, (ymax-ymin)/2));
        !           450: }

unix.superglobalmegacorp.com

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