|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T s ┃
Length: 7296 (0x1c80) Types: TextFile Names: »spixline.h«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libibm/libsrc/spixline.h«
/* $Header: spixline.h,v 10.1 86/11/19 10:46:29 jg Exp $ */ /* spixline.h - macros used by the single pixel wide line drawing routine * SinglePixelLine() * * Author: * Scott Bates * Brown University * IRIS, Box 1946 * Providence, RI 02912 * * * Copyright (c) 1986 Brown University * * Permission to use, copy, modify and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies, and that both * that copyright notice and this permission notice appear in supporting * documentation, and that the name of Brown University not be used in * advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Brown University makes no * representations about the suitability of this software for any purpose. * It is provided "as-is" without express or implied warranty. */ #if (defined(APA8) || defined(APA8C)) /* * Macro for incrementing destination address */ #define DESTINATION \ Destination = (u_short *) ((long)Destination + DestinationIncrement) #else #define DESTINATION Destination++ #endif (APA8 || APA8C) /* * Macro used to advanced to the next scan line or row of the * destination bitmap */ #define NEXT_ROW \ Destination = (u_short *) ((long)Destination + NumberOfBytes) /* * Macro that draws horizontal solid, dashed and patterned lines */ #define HORIZONTAL_LINE(Rule1, Rule2) { \ switch (Mode) { \ case (DrawSolidLine): \ while (BitsLeftToDraw--) { \ Rule1 \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ if ((Sentinel -= DeltaY) < 0) { \ NEXT_ROW; \ Sentinel += DeltaX; \ } \ } \ Rule1 \ break; \ case (DrawDashedLine): \ while (BitsLeftToDraw--) { \ if(Pattern & PatternBit) \ Rule1 \ if(--RepeatCount == 0) { \ RepeatCount = PatternMultiplier; \ if((PatternBit >>= 1) == 0) \ PatternBit = PatternFirstBit; \ } \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ if ((Sentinel -= DeltaY) < 0) { \ NEXT_ROW; \ Sentinel += DeltaX; \ } \ } \ if(Pattern & PatternBit) \ Rule1 \ break; \ case (DrawPatternedLine): \ while (BitsLeftToDraw--) { \ if(Pattern & PatternBit) \ Rule1 \ else \ Rule2 \ if(--RepeatCount == 0) { \ RepeatCount = PatternMultiplier; \ if((PatternBit >>= 1) == 0) \ PatternBit = PatternFirstBit; \ } \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ if ((Sentinel -= DeltaY) < 0) { \ NEXT_ROW; \ Sentinel += DeltaX; \ } \ } \ if(Pattern & PatternBit) \ Rule1 \ else \ Rule2 \ } \ } /* * Macro that draws vertical solid, dashed and patterned lines */ #define VERTICAL_LINE(Rule1, Rule2) { \ switch (Mode) { \ case (DrawSolidLine): \ while (BitsLeftToDraw--) { \ Rule1 \ NEXT_ROW; \ if ((Sentinel -= DeltaX) < 0) { \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ Sentinel += DeltaY; \ } \ } \ Rule1 \ break; \ case (DrawDashedLine): \ while (BitsLeftToDraw--) { \ if(Pattern & PatternBit) \ Rule1 \ if(--RepeatCount == 0) { \ RepeatCount = PatternMultiplier; \ if((PatternBit >>= 1) == 0) \ PatternBit = PatternFirstBit; \ } \ NEXT_ROW; \ if ((Sentinel -= DeltaX) < 0) { \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ Sentinel += DeltaY; \ } \ } \ if(Pattern & PatternBit) \ Rule1 \ break; \ case (DrawPatternedLine): \ while (BitsLeftToDraw--) { \ if(Pattern & PatternBit) \ Rule1 \ else \ Rule2 \ if(--RepeatCount == 0) { \ RepeatCount = PatternMultiplier; \ if((PatternBit >>= 1) == 0) \ PatternBit = PatternFirstBit; \ } \ NEXT_ROW; \ if ((Sentinel -= DeltaX) < 0) { \ if ((MaskBit >>= 1) == 0) { \ MaskBit = 0x8000; \ DESTINATION; \ } \ Sentinel += DeltaY; \ } \ } \ if(Pattern & PatternBit) \ Rule1 \ else \ Rule2 \ } \ } /* * Cohen-Sutherland clipping algorithm * * See: Fundamentals of Interactive Computer Graphics * J. D. Foley & A. Van Dam * Pages 146 - 149 */ #define OUTCODE_TOP 0x08 #define OUTCODE_BOTTOM 0x04 #define OUTCODE_RIGHT 0x02 #define OUTCODE_LEFT 0x01 #define OUTCODES(x, y, clip) \ (((x) < clip->left ? OUTCODE_LEFT : \ (x) >= clip->left + clip->width ? OUTCODE_RIGHT : 0) \ +((y) < clip->top ? OUTCODE_TOP : \ (y) >= clip->top + clip->height ? OUTCODE_BOTTOM : 0)) #define ClipLine(x0, y0, x1, y1, clip) { \ \ if (clip) { \ int OutCode0 = OUTCODES(x0, y0, clip); \ int OutCode1 = OUTCODES(x1, y1, clip); \ \ while (OutCode0 | OutCode1) { /* trivially accepted ? */ \ if (OutCode0 & OutCode1) /* trivially rejected ? */ \ return; \ if (OutCode0) { \ if (OutCode0 & (OUTCODE_LEFT | OUTCODE_RIGHT)) { \ int Clip_X = (OutCode0 & OUTCODE_LEFT) ? clip->left : \ clip->left + clip->width - 1; \ \ y0 = y0 + (y1 - y0) * (Clip_X - x0) / (x1 - x0); \ x0 = Clip_X; \ } else if (OutCode0 & (OUTCODE_TOP | OUTCODE_BOTTOM)) { \ int Clip_Y = (OutCode0 & OUTCODE_TOP) ? clip->top : \ clip->top + clip->height - 1; \ \ x0 = x0 + (x1 - x0) * (Clip_Y - y0) / (y1 - y0); \ y0 = Clip_Y; \ } \ OutCode0 = OUTCODES(x0, y0, clip); \ } else if (OutCode1) { \ if (OutCode1 & (OUTCODE_LEFT | OUTCODE_RIGHT)) { \ int Clip_X = (OutCode1 & OUTCODE_LEFT) ? clip->left : \ clip->left + clip->width - 1; \ \ y1 = y0 + (y1 - y0) * (Clip_X - x0) / (x1 - x0); \ x1 = Clip_X; \ } else if (OutCode1 & (OUTCODE_TOP | OUTCODE_BOTTOM)) { \ int Clip_Y = (OutCode1 & OUTCODE_TOP) ? clip->top : \ clip->top + clip->height - 1; \ \ x1 = x0 + (x1 - x0) * (Clip_Y - y0) / (y1 - y0); \ y1 = Clip_Y; \ } \ OutCode1 = OUTCODES(x1, y1, clip); \ } \ } \ } \ }