Annotation of researchv9/jerq/src/lib/j/line.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * _line - draw a line from x0 to x1
        !             3:  *     assumes already clipped, so no checking, just GO!
        !             4:  *     the line is closed w.r.t. the endpoints
        !             5:  */
        !             6: /*
        !             7:  * From ACM Nov 1973 V16, #11, I thought, but look in Newman & Sproull
        !             8:  */
        !             9: #define        LINE_C          /* This file "owns" the header file line.h */
        !            10: #define        LEFT    1024    /* line will be drawn right to left */
        !            11: #include <jerq.h>
        !            12: #include <line.h>
        !            13: _line(b, x0, x1, fun)
        !            14:        register Bitmap *b;
        !            15:        Point x0, x1;
        !            16:        Code fun;
        !            17: {
        !            18:        register d, yincr;
        !            19:        short deltax, deltay;
        !            20:        short /*unsigned*/ x, y;
        !            21:        register UWord bit;
        !            22:        register Word *screenp;
        !            23:        register long screenincr;
        !            24:        register d1;
        !            25:        int d2;
        !            26:        register count;
        !            27:        Point temp;
        !            28: 
        !            29:        if(Jxmajor==0){
        !            30:                if(x0.y>x1.y){
        !            31:                        temp=x0;
        !            32:                        x0=x1;
        !            33:                        x1=temp;
        !            34:                }
        !            35:                if(x0.x>x1.x)
        !            36:                        fun|=LEFT;
        !            37:        }
        !            38:        else if(x0.x>x1.x){
        !            39:                temp=x0;
        !            40:                x0=x1;
        !            41:                x1=temp;
        !            42:        }
        !            43:        x=x0.x;
        !            44:        y=x0.y;
        !            45:        deltax=x1.x-x;
        !            46:        deltay=x1.y-y;
        !            47:        yincr=(deltay>0)? 1 : -1;
        !            48:        screenp=addr(b,x0);
        !            49:        screenincr=yincr*(int)b->width; /* signed product please */
        !            50:        bit=LASTBIT<<(WORDSIZE-1-(x&WORDMASK)); /* don't sign extend */
        !            51:        deltax=abs(deltax);
        !            52:        deltay=abs(deltay);
        !            53:        if(Jxmajor==0)
        !            54:     goto Steepline;
        !            55:        count=deltax+1; /* so we can say --count (faster) */
        !            56:        if(deltay==0){                  /* easy and fast */
        !            57:                y=x+count;      /* sorry about overusing the variables */
        !            58:                if(x&WORDMASK){
        !            59:                        d=topbits[x&WORDMASK];
        !            60:                        switch(fun){
        !            61:                        case F_STORE:
        !            62:                        case F_OR:
        !            63:                                if((x&~WORDMASK)==(y&~WORDMASK)){  /* same word */
        !            64:                                        d^=topbits[y&WORDMASK];
        !            65:                                        *screenp|=d;
        !            66:                                        return;
        !            67:                                }
        !            68:                                *screenp++|=~d;
        !            69:                                x=(x|WORDMASK)+1;
        !            70:                                break;
        !            71:                        case F_CLR:
        !            72:                                if((x&~WORDMASK)==(y&~WORDMASK)){  /* same word */
        !            73:                                        d^=topbits[y&WORDMASK];
        !            74:                                        *screenp&=~d;
        !            75:                                        return;
        !            76:                                }
        !            77:                                *screenp++&=d;
        !            78:                                x=(x|WORDMASK)+1;
        !            79:                                break;
        !            80:                        case F_XOR:
        !            81:                                if((x&~WORDMASK)==(y&~WORDMASK)){  /* same word */
        !            82:                                        d^=topbits[y&WORDMASK];
        !            83:                                        *screenp^=d;
        !            84:                                        return;
        !            85:                                }
        !            86:                                *screenp++^=~d;
        !            87:                                x=(x|WORDMASK)+1;
        !            88:                                break;
        !            89:                        }
        !            90:                }
        !            91:                switch(fun){
        !            92:                case F_STORE:
        !            93:                case F_OR:
        !            94:                        while((x+=WORDSIZE)<=y)
        !            95:                                *screenp++=ONES;
        !            96:                        if(y&WORDMASK)
        !            97:                                *screenp|=topbits[y&WORDMASK];
        !            98:                        break;
        !            99:                case F_CLR:
        !           100:                        while((x+=WORDSIZE)<=y)
        !           101:                                *screenp++=0;
        !           102:                        if(y&WORDMASK)
        !           103:                                *screenp&=~topbits[y&WORDMASK];
        !           104:                        break;
        !           105:                case F_XOR:
        !           106:                        while((x+=WORDSIZE)<=y)
        !           107:                                *screenp++^=ONES;
        !           108:                        if(y&WORDMASK)
        !           109:                                *screenp^=topbits[y&WORDMASK];
        !           110:                        break;
        !           111:                }
        !           112:                return;
        !           113:        }
        !           114:        /* else */
        !           115:        d=Jsetdda(x);
        !           116:        d1=2*Jdminor;
        !           117:        d2=d1-2*Jdmajor;
        !           118:        switch(fun){
        !           119:        case F_STORE:
        !           120:        case F_OR:
        !           121:                for(;;){
        !           122:                        *screenp|=bit;
        !           123:                        if(--count==0)
        !           124:                                return;
        !           125:                        if((bit>>=1)==0){
        !           126:                                screenp++;
        !           127:                                bit=FIRSTBIT;
        !           128:                        }
        !           129:                        if(d<0)
        !           130:                                d+=d1;
        !           131:                        else{
        !           132:                                d+=d2;
        !           133:                                screenp+=screenincr;
        !           134:                        }
        !           135:                }
        !           136:        case F_CLR:
        !           137:                for(;;){
        !           138:                        *screenp&=~bit;
        !           139:                        if(--count==0)
        !           140:                                return;
        !           141:                        if((bit>>=1)==0){
        !           142:                                screenp++;
        !           143:                                bit=FIRSTBIT;
        !           144:                        }
        !           145:                        if(d<0)
        !           146:                                d+=d1;
        !           147:                        else{
        !           148:                                d+=d2;
        !           149:                                screenp+=screenincr;
        !           150:                        }
        !           151:                }
        !           152:        case F_XOR:
        !           153:                for(;;){
        !           154:                        *screenp^=bit;
        !           155:                        if(--count==0)
        !           156:                                return;
        !           157:                        if((bit>>=1)==0){
        !           158:                                screenp++;
        !           159:                                bit=FIRSTBIT;
        !           160:                        }
        !           161:                        if(d<0)
        !           162:                                d+=d1;
        !           163:                        else{
        !           164:                                d+=d2;
        !           165:                                screenp+=screenincr;
        !           166:                        }
        !           167:                }
        !           168:        }
        !           169:     Steepline:
        !           170:        count=deltay+1;
        !           171:        if(deltax==0){                  /* easy and fast */
        !           172:                switch(fun){
        !           173:                case F_STORE:
        !           174:                case F_OR:
        !           175:                        for(;;screenp+=screenincr){
        !           176:                                *screenp|=bit;
        !           177:                                if(--count==0)
        !           178:                                        return;
        !           179:                        }
        !           180:                case F_CLR:
        !           181:                        bit= ~bit;
        !           182:                        for(;;screenp+=screenincr){
        !           183:                                *screenp&=bit;
        !           184:                                if(--count==0)
        !           185:                                        return;
        !           186:                        }
        !           187:                case F_XOR:
        !           188:                        for(;;screenp+=screenincr){
        !           189:                                *screenp^=bit;
        !           190:                                if(--count==0)
        !           191:                                        return;
        !           192:                        }
        !           193:                }
        !           194:        }
        !           195:        /* else */
        !           196:        d=Jsetdda(y);
        !           197:        d1=2*Jdminor;
        !           198:        d2=d1-2*Jdmajor;
        !           199:        switch(fun){
        !           200:        case F_STORE:
        !           201:        case F_OR:
        !           202:                for(;;screenp+=screenincr){
        !           203:                        *screenp|=bit;
        !           204:                        if(--count==0)
        !           205:                                return;
        !           206:                        if(d<0)
        !           207:                                d+=d1;
        !           208:                        else{
        !           209:                                d+=d2;
        !           210:                                if((bit>>=1)==0){
        !           211:                                        screenp++;
        !           212:                                        bit=FIRSTBIT;
        !           213:                                }
        !           214:                        }
        !           215:                }
        !           216:        case F_STORE|LEFT:
        !           217:        case F_OR|LEFT:
        !           218:                for(;;screenp+=screenincr){
        !           219:                        *screenp|=bit;
        !           220:                        if(--count==0)
        !           221:                                return;
        !           222:                        if(d<0)
        !           223:                                d+=d1;
        !           224:                        else{
        !           225:                                d+=d2;
        !           226:                                if((bit<<=1)==0){
        !           227:                                        screenp--;
        !           228:                                        bit=LASTBIT;
        !           229:                                }
        !           230:                        }
        !           231:                }
        !           232:        case F_CLR:
        !           233:                for(;;screenp+=screenincr){
        !           234:                        *screenp&=~bit;
        !           235:                        if(--count==0)
        !           236:                                return;
        !           237:                        if(d<0)
        !           238:                                d+=d1;
        !           239:                        else{
        !           240:                                d+=d2;
        !           241:                                if((bit>>=1)==0){
        !           242:                                        screenp++;
        !           243:                                        bit=FIRSTBIT;
        !           244:                                }
        !           245:                        }
        !           246:                }
        !           247:        case F_CLR|LEFT:
        !           248:                for(;;screenp+=screenincr){
        !           249:                        *screenp&=~bit;
        !           250:                        if(--count==0)
        !           251:                                return;
        !           252:                        if(d<0)
        !           253:                                d+=d1;
        !           254:                        else{
        !           255:                                d+=d2;
        !           256:                                if((bit<<=1)==0){
        !           257:                                        screenp--;
        !           258:                                        bit=LASTBIT;
        !           259:                                }
        !           260:                        }
        !           261:                }
        !           262:        case F_XOR:
        !           263:                for(;;screenp+=screenincr){
        !           264:                        *screenp^=bit;
        !           265:                        if(--count==0)
        !           266:                                return;
        !           267:                        if(d<0)
        !           268:                                d+=d1;
        !           269:                        else{
        !           270:                                d+=d2;
        !           271:                                if((bit>>=1)==0){
        !           272:                                        screenp++;
        !           273:                                        bit=FIRSTBIT;
        !           274:                                }
        !           275:                        }
        !           276:                }
        !           277:        case F_XOR|LEFT:
        !           278:                for(;;screenp+=screenincr){
        !           279:                        *screenp^=bit;
        !           280:                        if(--count==0)
        !           281:                                return;
        !           282:                        if(d<0)
        !           283:                                d+=d1;
        !           284:                        else{
        !           285:                                d+=d2;
        !           286:                                if((bit<<=1)==0){
        !           287:                                        screenp--;
        !           288:                                        bit=LASTBIT;
        !           289:                                }
        !           290:                        }
        !           291:                }
        !           292:        }
        !           293: }

unix.superglobalmegacorp.com

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