Annotation of 43BSDTahoe/new/X/libibm/libsrc/spixline.h, revision 1.1

1.1     ! root        1: /* $Header: spixline.h,v 10.1 86/11/19 10:46:29 jg Exp $ */
        !             2: /* spixline.h - macros used by the single pixel wide line drawing routine
        !             3:  *              SinglePixelLine()
        !             4:  *
        !             5:  *     Author:
        !             6:  *             Scott Bates
        !             7:  *             Brown University
        !             8:  *             IRIS, Box 1946
        !             9:  *             Providence, RI 02912
        !            10:  *
        !            11:  *
        !            12:  *             Copyright (c) 1986 Brown University
        !            13:  *
        !            14:  * Permission to use, copy, modify and distribute this software and its
        !            15:  * documentation for any purpose and without fee is hereby granted, provided
        !            16:  * that the above copyright notice appear in all copies, and that both
        !            17:  * that copyright notice and this permission notice appear in supporting
        !            18:  * documentation, and that the name of Brown University not be used in
        !            19:  * advertising or publicity pertaining to distribution of the software
        !            20:  * without specific, written prior permission. Brown University makes no
        !            21:  * representations about the suitability of this software for any purpose.
        !            22:  * It is provided "as-is" without express or implied warranty.
        !            23:  */
        !            24: 
        !            25: #if (defined(APA8) || defined(APA8C))
        !            26: /*
        !            27:  * Macro for incrementing destination address
        !            28:  */
        !            29: 
        !            30: #define DESTINATION \
        !            31:        Destination = (u_short *) ((long)Destination + DestinationIncrement)
        !            32: #else
        !            33: #define DESTINATION    Destination++
        !            34: #endif (APA8 || APA8C)
        !            35: 
        !            36: /*
        !            37:  * Macro used to advanced to the next scan line or row of the
        !            38:  * destination bitmap
        !            39:  */
        !            40: 
        !            41: #define NEXT_ROW \
        !            42:        Destination = (u_short *) ((long)Destination + NumberOfBytes)
        !            43: 
        !            44: /*
        !            45:  * Macro that draws horizontal solid, dashed and patterned lines
        !            46:  */
        !            47: 
        !            48: #define HORIZONTAL_LINE(Rule1, Rule2) {                        \
        !            49:     switch (Mode) {                                    \
        !            50:     case (DrawSolidLine):                              \
        !            51:         while (BitsLeftToDraw--) {                     \
        !            52:            Rule1                                       \
        !            53:            if ((MaskBit >>= 1) == 0) {                 \
        !            54:                    MaskBit = 0x8000;                   \
        !            55:                    DESTINATION;                        \
        !            56:            }                                           \
        !            57:            if ((Sentinel -= DeltaY) < 0) {             \
        !            58:                NEXT_ROW;                               \
        !            59:                Sentinel += DeltaX;                     \
        !            60:            }                                           \
        !            61:         }                                              \
        !            62:        Rule1                                           \
        !            63:        break;                                          \
        !            64:     case (DrawDashedLine):                             \
        !            65:         while (BitsLeftToDraw--) {                     \
        !            66:            if(Pattern & PatternBit)                    \
        !            67:                Rule1                                   \
        !            68:            if(--RepeatCount == 0) {                    \
        !            69:                RepeatCount = PatternMultiplier;        \
        !            70:                if((PatternBit >>= 1) == 0)             \
        !            71:                    PatternBit = PatternFirstBit;       \
        !            72:            }                                           \
        !            73:            if ((MaskBit >>= 1) == 0) {                 \
        !            74:                MaskBit = 0x8000;                       \
        !            75:                DESTINATION;                            \
        !            76:            }                                           \
        !            77:            if ((Sentinel -= DeltaY) < 0) {             \
        !            78:                NEXT_ROW;                               \
        !            79:                Sentinel += DeltaX;                     \
        !            80:            }                                           \
        !            81:         }                                              \
        !            82:        if(Pattern & PatternBit)                        \
        !            83:            Rule1                                       \
        !            84:        break;                                          \
        !            85:     case (DrawPatternedLine):                          \
        !            86:         while (BitsLeftToDraw--) {                     \
        !            87:            if(Pattern & PatternBit)                    \
        !            88:                Rule1                                   \
        !            89:            else                                        \
        !            90:                Rule2                                   \
        !            91:            if(--RepeatCount == 0) {                    \
        !            92:                RepeatCount = PatternMultiplier;        \
        !            93:                if((PatternBit >>= 1) == 0)             \
        !            94:                    PatternBit = PatternFirstBit;       \
        !            95:            }                                           \
        !            96:            if ((MaskBit >>= 1) == 0) {                 \
        !            97:                MaskBit = 0x8000;                       \
        !            98:                DESTINATION;                            \
        !            99:            }                                           \
        !           100:            if ((Sentinel -= DeltaY) < 0) {             \
        !           101:                NEXT_ROW;                               \
        !           102:                Sentinel += DeltaX;                     \
        !           103:            }                                           \
        !           104:         }                                              \
        !           105:        if(Pattern & PatternBit)                        \
        !           106:            Rule1                                       \
        !           107:        else                                            \
        !           108:            Rule2                                       \
        !           109:     }                                                  \
        !           110: }
        !           111: 
        !           112: /*
        !           113:  * Macro that draws vertical solid, dashed and patterned lines
        !           114:  */
        !           115: 
        !           116: #define VERTICAL_LINE(Rule1, Rule2) {                  \
        !           117:     switch (Mode) {                                    \
        !           118:     case (DrawSolidLine):                              \
        !           119:         while (BitsLeftToDraw--) {                     \
        !           120:            Rule1                                       \
        !           121:            NEXT_ROW;                                   \
        !           122:            if ((Sentinel -= DeltaX) < 0) {             \
        !           123:                if ((MaskBit >>= 1) == 0) {             \
        !           124:                        MaskBit = 0x8000;               \
        !           125:                        DESTINATION;                    \
        !           126:                }                                       \
        !           127:                Sentinel += DeltaY;                     \
        !           128:            }                                           \
        !           129:         }                                              \
        !           130:         Rule1                                          \
        !           131:        break;                                          \
        !           132:     case (DrawDashedLine):                             \
        !           133:         while (BitsLeftToDraw--) {                     \
        !           134:            if(Pattern & PatternBit)                    \
        !           135:                Rule1                                   \
        !           136:            if(--RepeatCount == 0) {                    \
        !           137:                RepeatCount = PatternMultiplier;        \
        !           138:                if((PatternBit >>= 1) == 0)             \
        !           139:                    PatternBit = PatternFirstBit;       \
        !           140:            }                                           \
        !           141:            NEXT_ROW;                                   \
        !           142:            if ((Sentinel -= DeltaX) < 0) {             \
        !           143:                if ((MaskBit >>= 1) == 0) {             \
        !           144:                    MaskBit = 0x8000;                   \
        !           145:                    DESTINATION;                        \
        !           146:                }                                       \
        !           147:                Sentinel += DeltaY;                     \
        !           148:            }                                           \
        !           149:         }                                              \
        !           150:         if(Pattern & PatternBit)                       \
        !           151:             Rule1                                      \
        !           152:        break;                                          \
        !           153:     case (DrawPatternedLine):                          \
        !           154:         while (BitsLeftToDraw--) {                     \
        !           155:            if(Pattern & PatternBit)                    \
        !           156:                Rule1                                   \
        !           157:            else                                        \
        !           158:                Rule2                                   \
        !           159:            if(--RepeatCount == 0) {                    \
        !           160:                RepeatCount = PatternMultiplier;        \
        !           161:                if((PatternBit >>= 1) == 0)             \
        !           162:                    PatternBit = PatternFirstBit;       \
        !           163:            }                                           \
        !           164:            NEXT_ROW;                                   \
        !           165:            if ((Sentinel -= DeltaX) < 0) {             \
        !           166:                if ((MaskBit >>= 1) == 0) {             \
        !           167:                    MaskBit = 0x8000;                   \
        !           168:                    DESTINATION;                        \
        !           169:                }                                       \
        !           170:                Sentinel += DeltaY;                     \
        !           171:            }                                           \
        !           172:         }                                              \
        !           173:         if(Pattern & PatternBit)                       \
        !           174:            Rule1                                       \
        !           175:         else                                           \
        !           176:            Rule2                                       \
        !           177:     }                                                  \
        !           178: }
        !           179: 
        !           180: /*
        !           181:  * Cohen-Sutherland clipping algorithm
        !           182:  *
        !           183:  * See: Fundamentals of Interactive Computer Graphics
        !           184:  *      J. D. Foley & A. Van Dam
        !           185:  *      Pages 146 - 149
        !           186:  */
        !           187: 
        !           188: #define OUTCODE_TOP            0x08
        !           189: #define OUTCODE_BOTTOM         0x04
        !           190: #define OUTCODE_RIGHT          0x02
        !           191: #define OUTCODE_LEFT           0x01
        !           192: 
        !           193: 
        !           194: #define OUTCODES(x, y, clip)                                   \
        !           195:      (((x) < clip->left ? OUTCODE_LEFT :                       \
        !           196:         (x) >= clip->left + clip->width ? OUTCODE_RIGHT : 0)   \
        !           197:            +((y) < clip->top ? OUTCODE_TOP :                   \
        !           198:        (y) >= clip->top + clip->height ? OUTCODE_BOTTOM : 0))
        !           199: 
        !           200: #define ClipLine(x0, y0, x1, y1, clip) {                                   \
        !           201:                                                                            \
        !           202:     if (clip) {                                                                    \
        !           203:         int OutCode0 = OUTCODES(x0, y0, clip);                             \
        !           204:         int OutCode1 = OUTCODES(x1, y1, clip);                             \
        !           205:                                                                            \
        !           206:         while (OutCode0 | OutCode1) {  /* trivially accepted ? */          \
        !           207:             if (OutCode0 & OutCode1)   /* trivially rejected ? */          \
        !           208:                 return;                                                            \
        !           209:             if (OutCode0) {                                                \
        !           210:                if (OutCode0 & (OUTCODE_LEFT | OUTCODE_RIGHT)) {            \
        !           211:                    int Clip_X = (OutCode0 & OUTCODE_LEFT) ? clip->left :   \
        !           212:                                clip->left + clip->width - 1;               \
        !           213:                                                                            \
        !           214:                    y0 = y0 + (y1 - y0) * (Clip_X - x0) / (x1 - x0);        \
        !           215:                    x0 = Clip_X;                                            \
        !           216:                } else if (OutCode0 & (OUTCODE_TOP | OUTCODE_BOTTOM)) {     \
        !           217:                    int Clip_Y = (OutCode0 & OUTCODE_TOP) ? clip->top :     \
        !           218:                                clip->top + clip->height - 1;               \
        !           219:                                                                            \
        !           220:                    x0 = x0 + (x1 - x0) * (Clip_Y - y0) / (y1 - y0);        \
        !           221:                    y0 = Clip_Y;                                            \
        !           222:                }                                                           \
        !           223:                OutCode0 = OUTCODES(x0, y0, clip);                          \
        !           224:            } else if (OutCode1) {                                          \
        !           225:                if (OutCode1 & (OUTCODE_LEFT | OUTCODE_RIGHT)) {            \
        !           226:                    int Clip_X = (OutCode1 & OUTCODE_LEFT) ? clip->left :   \
        !           227:                                clip->left + clip->width - 1;               \
        !           228:                                                                            \
        !           229:                    y1 = y0 + (y1 - y0) * (Clip_X - x0) / (x1 - x0);        \
        !           230:                    x1 = Clip_X;                                            \
        !           231:                } else if (OutCode1 & (OUTCODE_TOP | OUTCODE_BOTTOM)) {     \
        !           232:                    int Clip_Y = (OutCode1 & OUTCODE_TOP) ? clip->top :     \
        !           233:                                clip->top + clip->height - 1;               \
        !           234:                                                                            \
        !           235:                    x1 = x0 + (x1 - x0) * (Clip_Y - y0) / (y1 - y0);        \
        !           236:                    y1 = Clip_Y;                                            \
        !           237:                }                                                           \
        !           238:                OutCode1 = OUTCODES(x1, y1, clip);                          \
        !           239:            }                                                               \
        !           240:        }                                                                   \
        !           241:    }                                                                       \
        !           242: }

unix.superglobalmegacorp.com

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