|
|
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 - metrics - downloadIndex: T m
Length: 8422 (0x20e6)
Types: TextFile
Names: »mpixline.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libibm/libsrc/mpixline.c«
#ifndef lint
static char *rcsid_mpixline_c = "$Header: mpixline.c,v 10.1 86/11/19 10:43:05 jg Exp $";
#endif lint
/* mpixline.c - multi pixel wide line drawing routines
*
* MultiPixelLine preprocessing routine for multi pixel wide line drawing
* SolidLine draws solid lines
* DashedLine draws dashed lines
* PatternedLine draws patterned lines
*
* 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.
*/
#include "private.h"
#include "bitblt.h"
MultiPixelLine(Line)
register Blt_Line *Line;
{
register Blt *blt = &Line->blt;
#ifdef TRACE_X
fprintf(stderr, "In MultiPixelLine\n");
fflush(stderr);
#endif TRACE_X
#ifdef AED
blt->blt_flags |= BLT_ECHO;
#endif AED
/*
* If the line is a solid horizontal or vertical tile
* the destination rectangle.
*/
if (Line->DrawMode == DrawSolidLine && (Line->StopX == Line->StartX ||
Line->StopY == Line->StartY)) {
/*
* Line is a solid horizontal or vertical so handle
* this as a tile fill of destination rectangle
*/
bitblt(blt);
} else { /* Line is a diagonal */
register short StartX = Line->StartX;
register short StartY = Line->StartY;
register short StopX = Line->StopX;
register short StopY = Line->StopY;
int BrushX = Line->BrushX;
int BrushY = Line->BrushY;
short *Top, *Left, *Bottom, *Right;
int DeltaX, DeltaY, SignY;
/*
* Always draw line from left to right
*/
if (StopX < StartX) {
short Temp;
Temp = StopX; StopX = StartX; StartX = Temp;
Temp = StopY; StopY = StartY; StartY = Temp;
}
/*
* Initialize pointers to destination rectangle
*/
Top = &blt->dst_rect.origin_y;
Left = &blt->dst_rect.origin_x;
Bottom = &blt->dst_rect.corner_y;
Right = &blt->dst_rect.corner_x;
/*
* Set destination rectangle to be the first
* the point in line
*/
*Left = StartX;
*Top = StartY;
*Right = StartX + Line->BrushX;
*Bottom = StartY + Line->BrushY;
/*
* Compute X and Y deltas
*/
DeltaX = StopX - StartX;
DeltaY = StopY - StartY;
/*
* Determine vertical drawing direction
* and adjust values if required
*/
if(DeltaY < 0) {
DeltaY = -DeltaY; /* bottom to top */
SignY = -1;
BrushY = -BrushY;
Top = &blt->dst_rect.corner_y;
Bottom = &blt->dst_rect.origin_y;
} else {
SignY = 1; /* top to bottom */
}
/*
* Call appropriate line drawing routine
*/
switch (Line->DrawMode) {
case (DrawSolidLine):
SolidLine(Line, Top, Left, Bottom, Right,
DeltaX, DeltaY, BrushX, BrushY, SignY);
break;
case (DrawDashedLine):
DashedLine(Line, Top, Left, Bottom, Right,
DeltaX, DeltaY, BrushX, BrushY, SignY);
break;
case (DrawPatternedLine):
PatternedLine(Line, Top, Left, Bottom, Right,
DeltaX, DeltaY, BrushX, BrushY, SignY);
}
}
}
/*
* Draw a solid line
*/
static
SolidLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
BrushX, BrushY, SignY)
Blt_Line *Line;
register short *Top, *Left;
register short *Bottom, *Right;
int DeltaX, DeltaY;
int BrushX, BrushY;
int SignY;
{
Blt *blt = &Line->blt;
register BitsLeftToDraw, Sentinel;
#ifdef TRACE_X
fprintf(stderr, "In SolidLine\n");
fflush(stderr);
#endif TRACE_X
/*
* draw solid line
*/
/* line is more horizontal */
if(DeltaX > DeltaY) {
Sentinel = DeltaX >> 1;
BitsLeftToDraw = DeltaX;
while (BitsLeftToDraw--) {
if ((Sentinel -= DeltaY) < 0) {
bitblt(blt);
*Left = *Right - BrushX + 1;
*Top += SignY;
*Bottom += SignY;
Sentinel += DeltaX;
}
(*Right)++;
}
bitblt(blt);
} else { /* line is more vertical */
Sentinel = DeltaY >> 1;
BitsLeftToDraw = DeltaY;
while (BitsLeftToDraw--) {
if ((Sentinel -= DeltaX) < 0) {
bitblt(blt);
*Top = *Bottom - BrushY + SignY;
(*Left)++;
(*Right)++;
Sentinel += DeltaY;
}
*Bottom += SignY;
}
bitblt(blt);
}
}
/*
* Draw a dashed line
*/
static
DashedLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
BrushX, BrushY, SignY)
Blt_Line *Line;
register short *Top, *Left;
register short *Bottom, *Right;
int DeltaX, DeltaY;
int BrushX, BrushY;
int SignY;
{
Blt *blt = &Line->blt;
u_short PatternFirstBit = 1 << (Line->PatternLength - 1);
u_short PatternBit = PatternFirstBit;
u_short Pattern = Line->Pattern;
short PatternMultiplier = Line->PatternMultiplier;
register BitsLeftToDraw, Sentinel;
#ifdef TRACE_X
fprintf(stderr, "In DashedLine\n");
fflush(stderr);
#endif TRACE_X
/*
* Draw dashed line
*/
/* line is more horizontal */
if(DeltaX > DeltaY) {
Sentinel = DeltaX >> 1;
BitsLeftToDraw = DeltaX;
while (BitsLeftToDraw--) {
if(Pattern & PatternBit)
bitblt(blt);
if(--PatternMultiplier == 0) {
PatternMultiplier = Line->PatternMultiplier;
if((PatternBit >>= 1) == 0)
PatternBit = PatternFirstBit;
}
*Left = *Right - BrushX + 1;
(*Right)++;
if ((Sentinel -= DeltaY) < 0) {
*Top += SignY;
*Bottom += SignY;
Sentinel += DeltaX;
}
}
if(Pattern & PatternBit)
bitblt(blt);
} else { /* line is more vertical */
Sentinel = DeltaY >> 1;
BitsLeftToDraw = DeltaY;
while (BitsLeftToDraw--) {
if(Pattern & PatternBit)
bitblt(blt);
if(--PatternMultiplier == 0) {
PatternMultiplier = Line->PatternMultiplier;
if((PatternBit >>= 1) == 0)
PatternBit = PatternFirstBit;
}
*Top = *Bottom - BrushY + SignY;
*Bottom += SignY;
if ((Sentinel -= DeltaX) < 0) {
(*Left)++;
(*Right)++;
Sentinel += DeltaY;
}
}
if(Pattern & PatternBit)
bitblt(blt);
}
}
/*
* Draw a patterned line
*/
static
PatternedLine(Line, Top, Left, Bottom, Right, DeltaX, DeltaY,
BrushX, BrushY, SignY)
Blt_Line *Line;
register short *Top, *Left;
register short *Bottom, *Right;
int DeltaX, DeltaY;
int BrushX, BrushY;
int SignY;
{
Blt *blt = &Line->blt;
u_short PatternFirstBit = 1 << (Line->PatternLength - 1);
u_short PatternBit = PatternFirstBit;
u_short Pattern = Line->Pattern;
short PatternMultiplier = Line->PatternMultiplier;
Blt_Tile *SourceTile = blt->tile_ptr;
Blt_Tile *AltSourceTile = Line->AlternateTile;
register BitsLeftToDraw, Sentinel;
#ifdef TRACE_X
fprintf(stderr, "In PatternedLine\n");
fflush(stderr);
#endif TRACE_X
/*
* Draw patterned line
*/
/* line is more horizontal */
if(DeltaX > DeltaY) {
Sentinel = DeltaX >> 1;
BitsLeftToDraw = DeltaX;
while (BitsLeftToDraw--) {
if(Pattern & PatternBit)
blt->tile_ptr = SourceTile;
else
blt->tile_ptr = AltSourceTile;
bitblt(blt);
if(--PatternMultiplier == 0) {
PatternMultiplier = Line->PatternMultiplier;
if((PatternBit >>= 1) == 0)
PatternBit = PatternFirstBit;
}
*Left = *Right - BrushX + 1;
(*Right)++;
if ((Sentinel -= DeltaY) < 0) {
*Top += SignY;
*Bottom += SignY;
Sentinel += DeltaX;
}
}
if(Pattern & PatternBit)
blt->tile_ptr = SourceTile;
else
blt->tile_ptr = AltSourceTile;
bitblt(blt);
blt->tile_ptr = SourceTile;
} else { /* line is more vertical */
Sentinel = DeltaY >> 1;
BitsLeftToDraw = DeltaY;
while (BitsLeftToDraw--) {
if(Pattern & PatternBit)
blt->tile_ptr = SourceTile;
else
blt->tile_ptr = AltSourceTile;
bitblt(blt);
if(--PatternMultiplier == 0) {
PatternMultiplier = Line->PatternMultiplier;
if((PatternBit >>= 1) == 0)
PatternBit = PatternFirstBit;
}
*Top = *Bottom - BrushY + SignY;
*Bottom += SignY;
if ((Sentinel -= DeltaX) < 0) {
(*Left)++;
(*Right)++;
Sentinel += DeltaY;
}
}
if(Pattern & PatternBit)
blt->tile_ptr = SourceTile;
else
blt->tile_ptr = AltSourceTile;
bitblt(blt);
blt->tile_ptr = SourceTile;
}
}