Annotation of researchv9/jtools/src/demo/asteroids/image.c, revision 1.1

1.1     ! root        1: #include <jerq.h>
        !             2: /*
        !             3:  * Images are encoded as arrays of characters, and interpreted into
        !             4:  * bitmaps by buildimage().  The coordinate system has (0,0) at the
        !             5:  * "location" of the object.
        !             6:  *
        !             7:  * Operators are:
        !             8:  *     'R'     minimum enclosing rectangle  (must be first!)
        !             9:  *     'p'     point
        !            10:  *     'r'     rectf
        !            11:  *     's'     segment
        !            12:  *     'm'     moveto
        !            13:  *     'l'     lineto
        !            14:  *     0       end
        !            15:  *
        !            16:  * All objects are drawn with F_OR.
        !            17:  */
        !            18: Point
        !            19: pscale(p)
        !            20:        Point p;
        !            21: {
        !            22: #define        o       Drect.origin
        !            23: #define        c       Drect.corner
        !            24:        p.x=muldiv(c.x-o.x, p.x, Drect.corner.x);
        !            25:        p.y=muldiv(c.y-o.y, p.y, Drect.corner.y);
        !            26: #undef c
        !            27: #undef o
        !            28:        return p;
        !            29: }
        !            30: Rectangle
        !            31: rscale(r)
        !            32:        Rectangle r;
        !            33: {
        !            34:        r.origin=pscale(r.origin);
        !            35:        r.corner=pscale(r.corner);
        !            36:        return r;
        !            37: }
        !            38: /*
        !            39:  * Reduce *p to be on the screen
        !            40:  */
        !            41: onscreen(p)
        !            42:        register Point *p;
        !            43: {
        !            44:        p->x%=Drect.corner.x;
        !            45:        p->y%=Drect.corner.y;
        !            46:        if(p->x < 0)
        !            47:                p->x+=Drect.corner.x;
        !            48:        if(p->y < 0)
        !            49:                p->y+=Drect.corner.y;
        !            50: }
        !            51: Bitmap *
        !            52: buildimage(s)
        !            53:        register char *s;
        !            54: {
        !            55:        register Bitmap *b=0;
        !            56:        Rectangle r;
        !            57:        Point p, curpt;
        !            58:        if(sext(*s++) != 'R')
        !            59:                quit();
        !            60:        r.origin.x= sext(*s++);
        !            61:        r.origin.y= sext(*s++);
        !            62:        r.corner.x= sext(*s++);
        !            63:        r.corner.y= sext(*s++);
        !            64:        b=balloc(rscale(r));
        !            65:        if(b==0)
        !            66:                quit();
        !            67:        rectf(b, b->rect, F_CLR);
        !            68:        for(;;){
        !            69:                switch(sext(*s++)){
        !            70:                case 'p':
        !            71:                        p.x= sext(*s++);
        !            72:                        p.y= sext(*s++);
        !            73:                        point(b, pscale(p), F_OR);/**/
        !            74:                        break;
        !            75:                case 'r':
        !            76:                        r.origin.x= sext(*s++);
        !            77:                        r.origin.y= sext(*s++);
        !            78:                        r.corner.x= sext(*s++);
        !            79:                        r.corner.y= sext(*s++);
        !            80:                        rectf(b, rscale(r), F_OR);/**/
        !            81:                        break;
        !            82:                case 's':
        !            83:                        r.origin.x= sext(*s++);
        !            84:                        r.origin.y= sext(*s++);
        !            85:                        r.corner.x= sext(*s++);
        !            86:                        r.corner.y= sext(*s++);
        !            87:                        r=rscale(r);
        !            88:                        segment(b, r.origin, r.corner, F_OR);/**/
        !            89:                        break;
        !            90:                case 'm':
        !            91:                        p.x= sext(*s++);
        !            92:                        p.y= sext(*s++);
        !            93:                        curpt=pscale(p);/**/
        !            94:                        break;
        !            95:                case 'l':
        !            96:                        p.x= sext(*s++);
        !            97:                        p.y= sext(*s++);
        !            98:                        p=pscale(p);
        !            99:                        segment(b, curpt, p, F_OR);/**/
        !           100:                        curpt=p;
        !           101:                        break;
        !           102:                case 0:
        !           103:                        return b;
        !           104:                }
        !           105:        }
        !           106: }
        !           107: 
        !           108: sext(c)
        !           109:        register c;
        !           110: {
        !           111:        if(c&0x80) c |= 0xFFFFFF00;
        !           112:        return(c);
        !           113: }

unix.superglobalmegacorp.com

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