Annotation of 43BSDTahoe/new/X/libibm/libsrc/mpixline.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid_mpixline_c = "$Header: mpixline.c,v 10.1 86/11/19 10:43:05 jg Exp $";
        !             3: #endif lint
        !             4: /* mpixline.c - multi pixel wide line drawing routines
        !             5:  *
        !             6:  *     MultiPixelLine  preprocessing routine for multi pixel wide line drawing
        !             7:  *     SolidLine       draws solid lines
        !             8:  *     DashedLine      draws dashed lines
        !             9:  *     PatternedLine   draws patterned lines
        !            10:  *
        !            11:  *     Author:
        !            12:  *             Scott Bates
        !            13:  *             Brown University
        !            14:  *             IRIS, Box 1946
        !            15:  *             Providence, RI 02912
        !            16:  *
        !            17:  *
        !            18:  *             Copyright (c) 1986 Brown University
        !            19:  *
        !            20:  * Permission to use, copy, modify and distribute this software and its
        !            21:  * documentation for any purpose and without fee is hereby granted, provided
        !            22:  * that the above copyright notice appear in all copies, and that both
        !            23:  * that copyright notice and this permission notice appear in supporting
        !            24:  * documentation, and that the name of Brown University not be used in
        !            25:  * advertising or publicity pertaining to distribution of the software
        !            26:  * without specific, written prior permission. Brown University makes no
        !            27:  * representations about the suitability of this software for any purpose.
        !            28:  * It is provided "as-is" without express or implied warranty.
        !            29:  */
        !            30: 
        !            31: #include "private.h"
        !            32: #include "bitblt.h"
        !            33: 
        !            34: MultiPixelLine(Line)
        !            35:        register Blt_Line *Line;
        !            36: {
        !            37:        register Blt *blt = &Line->blt;
        !            38: 
        !            39: #ifdef TRACE_X
        !            40:        fprintf(stderr, "In MultiPixelLine\n");
        !            41:        fflush(stderr);
        !            42: #endif TRACE_X
        !            43: 
        !            44: #ifdef AED
        !            45:        blt->blt_flags |= BLT_ECHO;
        !            46: #endif AED
        !            47: 
        !            48:        /*
        !            49:         * If the line is a solid horizontal or vertical tile
        !            50:         * the destination rectangle.
        !            51:         */
        !            52: 
        !            53:        if (Line->DrawMode == DrawSolidLine && (Line->StopX == Line->StartX ||
        !            54:            Line->StopY == Line->StartY)) {
        !            55:                /*
        !            56:                 * Line is a solid horizontal or vertical so handle
        !            57:                 * this as a tile fill of destination rectangle
        !            58:                 */
        !            59: 
        !            60:                bitblt(blt);
        !            61:        } else  {                       /* Line is a diagonal */
        !            62:                register short StartX = Line->StartX;
        !            63:                register short StartY = Line->StartY;
        !            64:                register short StopX = Line->StopX;
        !            65:                register short StopY = Line->StopY;
        !            66:                int BrushX = Line->BrushX;
        !            67:                int BrushY = Line->BrushY;
        !            68:                short *Top, *Left, *Bottom, *Right;
        !            69:                int DeltaX, DeltaY, SignY;
        !            70: 
        !            71:                /*
        !            72:                 * Always draw line from left to right
        !            73:                 */
        !            74: 
        !            75:                if (StopX < StartX) {
        !            76:                        short Temp;
        !            77: 
        !            78:                        Temp = StopX; StopX = StartX; StartX = Temp;
        !            79:                        Temp = StopY; StopY = StartY; StartY = Temp;
        !            80:                }
        !            81: 
        !            82:                /*
        !            83:                 * Initialize pointers to destination rectangle
        !            84:                 */
        !            85: 
        !            86:                Top = &blt->dst_rect.origin_y;
        !            87:                Left = &blt->dst_rect.origin_x;
        !            88:                Bottom = &blt->dst_rect.corner_y;
        !            89:                Right = &blt->dst_rect.corner_x;
        !            90: 
        !            91:                /*
        !            92:                 * Set destination rectangle to be the first
        !            93:                 * the point in line
        !            94:                 */
        !            95: 
        !            96:                *Left = StartX;
        !            97:                *Top = StartY;
        !            98:                *Right = StartX + Line->BrushX;
        !            99:                *Bottom = StartY + Line->BrushY;
        !           100: 
        !           101:                /*
        !           102:                 * Compute X and Y deltas
        !           103:                 */
        !           104: 
        !           105:                DeltaX = StopX - StartX;
        !           106:                DeltaY = StopY - StartY;
        !           107: 
        !           108:                /*
        !           109:                 * Determine vertical drawing direction
        !           110:                 * and adjust values if required
        !           111:                 */
        !           112: 
        !           113:                if(DeltaY < 0) {
        !           114:                        DeltaY = -DeltaY;       /* bottom to top */
        !           115:                        SignY = -1;
        !           116:                        BrushY = -BrushY;
        !           117:                        Top = &blt->dst_rect.corner_y;
        !           118:                        Bottom = &blt->dst_rect.origin_y;
        !           119:                } else  {
        !           120:                        SignY = 1;              /* top to bottom */
        !           121:                }
        !           122: 
        !           123:                /*
        !           124:                 * Call appropriate line drawing routine
        !           125:                 */
        !           126: 
        !           127:                switch (Line->DrawMode) {
        !           128:                case (DrawSolidLine):
        !           129:                        SolidLine(Line, Top, Left, Bottom, Right,
        !           130:                                  DeltaX, DeltaY, BrushX, BrushY, SignY);
        !           131:                        break;
        !           132:                case (DrawDashedLine):
        !           133:                        DashedLine(Line, Top, Left, Bottom, Right,
        !           134:                                   DeltaX, DeltaY, BrushX, BrushY, SignY);
        !           135:                        break;
        !           136:                case (DrawPatternedLine):
        !           137:                        PatternedLine(Line, Top, Left, Bottom, Right,
        !           138:                                      DeltaX, DeltaY, BrushX, BrushY, SignY);
        !           139:                }
        !           140:        }
        !           141: }
        !           142: 
        !           143: /*
        !           144:  * Draw a solid line
        !           145:  */
        !           146: 
        !           147: static
        !           148: SolidLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
        !           149:                BrushX, BrushY, SignY)
        !           150:        Blt_Line *Line;
        !           151:        register short *Top, *Left;
        !           152:        register short *Bottom, *Right;
        !           153:        int DeltaX, DeltaY;
        !           154:        int BrushX, BrushY;
        !           155:        int SignY;
        !           156: {
        !           157:        Blt *blt = &Line->blt;
        !           158:        register BitsLeftToDraw, Sentinel;
        !           159: 
        !           160: #ifdef TRACE_X
        !           161:        fprintf(stderr, "In SolidLine\n");
        !           162:        fflush(stderr);
        !           163: #endif TRACE_X
        !           164: 
        !           165:        /*
        !           166:         * draw solid line
        !           167:         */
        !           168:                                /* line is more horizontal */
        !           169:        if(DeltaX > DeltaY) {   
        !           170:                Sentinel = DeltaX >> 1;
        !           171:                BitsLeftToDraw = DeltaX;
        !           172: 
        !           173:                while (BitsLeftToDraw--) {
        !           174:                        if ((Sentinel -= DeltaY) < 0) {
        !           175:                                bitblt(blt);
        !           176:                                *Left = *Right - BrushX + 1;
        !           177:                                *Top += SignY;
        !           178:                                *Bottom += SignY;
        !           179:                                Sentinel += DeltaX;
        !           180:                        }
        !           181:                        (*Right)++;
        !           182:                }
        !           183:                bitblt(blt);
        !           184:        } else  {               /* line is more vertical */
        !           185:                Sentinel = DeltaY >> 1;
        !           186:                BitsLeftToDraw = DeltaY;
        !           187: 
        !           188:                while (BitsLeftToDraw--) {
        !           189:                        if ((Sentinel -= DeltaX) < 0) {
        !           190:                                bitblt(blt);
        !           191:                                *Top = *Bottom - BrushY + SignY;
        !           192:                                (*Left)++;
        !           193:                                (*Right)++;
        !           194:                                Sentinel += DeltaY;
        !           195:                        }
        !           196:                        *Bottom += SignY;
        !           197:                }
        !           198:                bitblt(blt);
        !           199:        }
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Draw a dashed line
        !           204:  */
        !           205: 
        !           206: static
        !           207: DashedLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
        !           208:                BrushX, BrushY, SignY)
        !           209:        Blt_Line *Line;
        !           210:        register short *Top, *Left;
        !           211:        register short *Bottom, *Right;
        !           212:        int DeltaX, DeltaY;
        !           213:        int BrushX, BrushY;
        !           214:        int SignY;
        !           215: {
        !           216:        Blt *blt = &Line->blt;
        !           217:        u_short PatternFirstBit = 1 << (Line->PatternLength - 1);
        !           218:        u_short PatternBit = PatternFirstBit;
        !           219:        u_short Pattern = Line->Pattern;
        !           220:        short PatternMultiplier = Line->PatternMultiplier;
        !           221:        register BitsLeftToDraw, Sentinel;
        !           222: 
        !           223: #ifdef TRACE_X
        !           224:        fprintf(stderr, "In DashedLine\n");
        !           225:        fflush(stderr);
        !           226: #endif TRACE_X
        !           227: 
        !           228:        /*
        !           229:         * Draw dashed line
        !           230:         */
        !           231: 
        !           232:                                /* line is more horizontal */
        !           233:        if(DeltaX > DeltaY) {
        !           234:                Sentinel = DeltaX >> 1;
        !           235:                BitsLeftToDraw = DeltaX;
        !           236: 
        !           237:                while (BitsLeftToDraw--) {
        !           238:                        if(Pattern & PatternBit)
        !           239:                                bitblt(blt);
        !           240:                        if(--PatternMultiplier == 0) {
        !           241:                                PatternMultiplier = Line->PatternMultiplier;
        !           242:                                if((PatternBit >>= 1) == 0)
        !           243:                                        PatternBit = PatternFirstBit;
        !           244:                        }
        !           245:                        *Left = *Right - BrushX + 1;
        !           246:                        (*Right)++;
        !           247:                        if ((Sentinel -= DeltaY) < 0) {
        !           248:                                *Top += SignY;
        !           249:                                *Bottom += SignY;
        !           250:                                Sentinel += DeltaX;
        !           251:                        }
        !           252:                }
        !           253:                if(Pattern & PatternBit)
        !           254:                        bitblt(blt);
        !           255:        } else  {               /* line is more vertical */
        !           256:                Sentinel = DeltaY >> 1;
        !           257:                BitsLeftToDraw = DeltaY;
        !           258: 
        !           259:                while (BitsLeftToDraw--) {
        !           260:                        if(Pattern & PatternBit)
        !           261:                                bitblt(blt);
        !           262:                        if(--PatternMultiplier == 0) {
        !           263:                                PatternMultiplier = Line->PatternMultiplier;
        !           264:                                if((PatternBit >>= 1) == 0)
        !           265:                                        PatternBit = PatternFirstBit;
        !           266:                        }
        !           267:                        *Top = *Bottom - BrushY + SignY;
        !           268:                        *Bottom += SignY;
        !           269:                        if ((Sentinel -= DeltaX) < 0) {
        !           270:                                (*Left)++;
        !           271:                                (*Right)++;
        !           272:                                Sentinel += DeltaY;
        !           273:                        }
        !           274:                }
        !           275:                if(Pattern & PatternBit)
        !           276:                        bitblt(blt);
        !           277:        }
        !           278: }
        !           279: 
        !           280: /*
        !           281:  * Draw a patterned line
        !           282:  */
        !           283: 
        !           284: static
        !           285: PatternedLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
        !           286:                BrushX, BrushY, SignY)
        !           287:        Blt_Line *Line;
        !           288:        register short *Top, *Left;
        !           289:        register short *Bottom, *Right;
        !           290:        int DeltaX, DeltaY;
        !           291:        int BrushX, BrushY;
        !           292:        int SignY;
        !           293: {
        !           294:        Blt *blt = &Line->blt;
        !           295:        u_short PatternFirstBit = 1 << (Line->PatternLength - 1);
        !           296:        u_short PatternBit = PatternFirstBit;
        !           297:        u_short Pattern = Line->Pattern;
        !           298:        short PatternMultiplier = Line->PatternMultiplier;
        !           299:        Blt_Tile *SourceTile = blt->tile_ptr;
        !           300:        Blt_Tile *AltSourceTile = Line->AlternateTile;
        !           301:        register BitsLeftToDraw, Sentinel;
        !           302: 
        !           303: #ifdef TRACE_X
        !           304:        fprintf(stderr, "In PatternedLine\n");
        !           305:        fflush(stderr);
        !           306: #endif TRACE_X
        !           307: 
        !           308:        /*
        !           309:         * Draw patterned line
        !           310:         */
        !           311: 
        !           312:                                /* line is more horizontal */
        !           313:        if(DeltaX > DeltaY) {
        !           314:                Sentinel = DeltaX >> 1;
        !           315:                BitsLeftToDraw = DeltaX;
        !           316: 
        !           317:                while (BitsLeftToDraw--) {
        !           318:                        if(Pattern & PatternBit)
        !           319:                                blt->tile_ptr = SourceTile;
        !           320:                        else
        !           321:                                blt->tile_ptr = AltSourceTile;
        !           322:                        bitblt(blt);
        !           323: 
        !           324:                        if(--PatternMultiplier == 0) {
        !           325:                                PatternMultiplier = Line->PatternMultiplier;
        !           326:                                if((PatternBit >>= 1) == 0)
        !           327:                                        PatternBit = PatternFirstBit;
        !           328:                        }
        !           329: 
        !           330:                        *Left = *Right - BrushX + 1;
        !           331:                        (*Right)++;
        !           332:                        if ((Sentinel -= DeltaY) < 0) {
        !           333:                                *Top += SignY;
        !           334:                                *Bottom += SignY;
        !           335:                                Sentinel += DeltaX;
        !           336:                        }
        !           337:                }
        !           338:                if(Pattern & PatternBit)
        !           339:                        blt->tile_ptr = SourceTile;
        !           340:                else
        !           341:                        blt->tile_ptr = AltSourceTile;
        !           342:                bitblt(blt);
        !           343:                blt->tile_ptr = SourceTile;
        !           344:        } else  {               /* line is more vertical */
        !           345:                Sentinel = DeltaY >> 1;
        !           346:                BitsLeftToDraw = DeltaY;
        !           347: 
        !           348:                while (BitsLeftToDraw--) {
        !           349:                        if(Pattern & PatternBit)
        !           350:                                blt->tile_ptr = SourceTile;
        !           351:                        else
        !           352:                                blt->tile_ptr = AltSourceTile;
        !           353:                        bitblt(blt);
        !           354: 
        !           355:                        if(--PatternMultiplier == 0) {
        !           356:                                PatternMultiplier = Line->PatternMultiplier;
        !           357:                                if((PatternBit >>= 1) == 0)
        !           358:                                        PatternBit = PatternFirstBit;
        !           359:                        }
        !           360: 
        !           361:                        *Top = *Bottom - BrushY + SignY;
        !           362:                        *Bottom += SignY;
        !           363:                        if ((Sentinel -= DeltaX) < 0) {
        !           364:                                (*Left)++;
        !           365:                                (*Right)++;
        !           366:                                Sentinel += DeltaY;
        !           367:                        }
        !           368:                }
        !           369:                if(Pattern & PatternBit)
        !           370:                        blt->tile_ptr = SourceTile;
        !           371:                else
        !           372:                        blt->tile_ptr = AltSourceTile;
        !           373:                bitblt(blt);
        !           374:                blt->tile_ptr = SourceTile;
        !           375:        }
        !           376: }

unix.superglobalmegacorp.com

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