|
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 d
Length: 5468 (0x155c) Types: TextFile Names: »draw.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/draw.c«
#ifndef lint static char *rcsid_draw_c = "$Header: draw.c,v 10.1 86/11/19 10:41:27 jg Exp $"; #endif lint /* draw.c - Draw lines, curves, and polygons on the screen * * DrawCurve Draw a generalized line/polygon/combination * * 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" DrawCurve (verts, vertcount, xbase, ybase, srcpix, altpix, mode, bwidth, bheight, pat, patlen, patmul, clips, clipcount, func, zmask) Vertex *verts; int vertcount, xbase, ybase, srcpix, altpix, mode, bwidth, bheight; int pat, patlen, patmul, clipcount, zmask; int func; CLIP *clips; { register NumberOfClips; register CLIP *ClipPointer; Vertex *newverts; int newvertcount, i; #ifdef TRACE_X fprintf(stderr, "In DrawCurve\n"); fflush(stderr); #endif TRACE_X /* * Limit draw operation to one plane and * ignore requests of less than two points */ if ((zmask & 1) == 0 || vertcount < 2) return; /* * Convert vertex list to absolute straight lines */ if(PathListConverter(verts, vertcount, xbase, ybase, &newverts, &newvertcount, DRAW_PATH_LIST) == NULL ) { DeviceError("DrawCurve failure in PathListConverter()\n"); return; } /* * Single pixel wide line ? */ if (bwidth == 1 && bheight == 1) { /* * Loop thru vertex list */ for(i = 0; i < newvertcount; i += 2) { ClipPointer = clips; NumberOfClips = clipcount; /* * Draw the same line ounce for each * clipping rectangle */ for (;;) { SinglePixelLine(&pbm, newverts[i].x, newverts[i].y, newverts[i + 1].x, newverts[i + 1].y, ClipPointer, func, mode, srcpix, altpix, pat, patlen, patmul); /* * Any more clips ? */ if(--NumberOfClips <= 0) { /* * No more clips so lets leave */ break; } /* * Point to next clip */ ClipPointer++; } } } else { Blt_Rectangle dst_rect; Blt_Line line; register Blt_Line *Line = &line; register Blt_Rectangle *DstRect = &dst_rect; register Blt_Rectangle *ClipRect = &Line->blt.clp_rect; /* * Zero line data structure */ bzero((char *) Line, sizeof(Blt_Line)); /* * Fill in destination bitmap */ BitimageToBitmap((u_short *)pbm.data, 0, 0, pbm.width, pbm.height, &Line->blt.dst_bitmap); /* * Set brush size and tile pattern(s) */ Line->BrushX = bwidth; Line->BrushY = bheight; Line->blt.tile_ptr = (Blt_Tile *) ConstantTiles[srcpix & 1]; if(mode == DrawPatternedLine) Line->AlternateTile = (Blt_Tile *) ConstantTiles[altpix & 1]; /* * Fill in dash pattern */ if(mode != DrawSolidLine) { Line->Pattern = (u_short) pat; Line->PatternLength = (short) patlen; Line->PatternMultiplier = (short) patmul; } /* * Fill in appropriate combination rule */ if(IS_RULE_TILE(func)) { /* * Fill in rule directly */ Line->blt.comb_rule = func; } else { /* * Convert standard rule to tile rule */ Line->blt.comb_rule = MAKE_TILE_RULE(func); } /* * Fill in draw mode */ Line->DrawMode = mode; /* * Loop thru vertex list */ for (;newvertcount > 0; newvertcount -= 2) { /* * Set start and stop endpoints */ Line->StartX = newverts->x; Line->StartY = (newverts++)->y; Line->StopX = newverts->x; Line->StopY = (newverts++)->y; /* * Compute and set destination rectangle */ DstRect->origin_y = MIN(Line->StopY, Line->StartY); DstRect->origin_x = MIN(Line->StopX, Line->StartX); DstRect->corner_y = MAX(Line->StopY, Line->StartY) + Line->BrushY; DstRect->corner_x = MAX(Line->StopX, Line->StartX) + Line->BrushX; Line->blt.dst_rect = *DstRect; /* * Setup for clips */ NumberOfClips = clipcount; ClipPointer = clips; /* * Draw same line ounce for each clip specified */ for(;;) { /* * Convert X clip to clipping rectangle */ ClipToRect(ClipPointer, ClipRect); /* * If destination rectangle is inside the * clipping rectangle then turn off clipping * else turn it on. */ if(InsideBounds(DstRect, ClipRect)) { Line->blt.blt_flags &= ~BLT_CLIPON; } else { Line->blt.blt_flags |= BLT_CLIPON; } /* * Call multi pixel line drawing routine */ MultiPixelLine(Line); /* * Any more clips ? */ if(--NumberOfClips <= 0) { /* * No more clips so lets leave */ break; } /* * Point to next clip */ ClipPointer++; } } } /* * Free space used by new vertex list */ free((caddr_t)newverts); }