|
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: 3897 (0xf39) 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/libis/draw.c«
/* * $Source: /u1/X/libis/RCS/draw.c,v $ * $Header: draw.c,v 1.1 86/11/17 14:33:49 swick Rel $ */ #ifndef lint static char *rcsid_draw_c = "$Header: draw.c,v 1.1 86/11/17 14:33:49 swick Rel $"; #endif lint #include "is-copyright.h" /* draw.c Draw lines, curves, and polygons on the screen * * DrawCurve Draw a generalized line/polygon/combination * * Copyright (c) 1986, Integrated Solutions, Inc. */ /* * ToDo: * Dash/Pattern * Curves */ #include "Xis.h" #define imin(i,j) ((i)<(j)?(i):(j)) #define imax(i,j) ((i)>(j)?(i):(j)) static Draw_Solid(srcpix, xbase, ybase, func, vertcount, verts, clipcount, clips, zmask, bwidth, bheight) int srcpix; /* Pixel value to write */ int xbase, ybase; /* Origin of curve */ int func; /* Opcode */ int vertcount; /* Length of Vertex array */ Vertex *verts; /* Vertices */ int clipcount; /* Length of clip array */ CLIP *clips; /* clipping rectangles */ int zmask; /* plane mask */ int bwidth, bheight;/* brush width and height */ { PIXMAP *fillpix; extern PIXMAP *MakePixmap(); fillpix = MakePixmap((BITMAP *)NULL, srcpix, 0); do { /* for each clipping region */ register int xp, yp; register Vertex *v = verts; register int vc = vertcount; do { /* for each vertex */ register xo = xp, yo = yp; /* first vertex is always VertexDontDraw and !VertexRelative */ /* xo,yo do not matter and xp,yp get initialized first time */ if (v->flags & VertexRelative) { xp += v->x; yp += v->y; } else { xp = v->x + xbase; yp = v->y + ybase; } /* XXX - ignore VertexCurved for now */ /* XXX - ignore VertexDrawLastPoint for now */ if (!(v->flags & VertexDontDraw)) { CLIP bounds; /* bounding rectangle of two points */ bounds.top = imin(yo, yp); bounds.left = imin(xo, xp); bounds.width = imax(xo, xp) + bwidth - bounds.left; bounds.height = imax(yo, yp) + bheight - bounds.top; if (Overlap(bounds, clips[clipcount-1])) { /* vector at least partly visible */ CLIP i; i = Intersection(clips[clipcount-1], bounds); CheckCursor(i); if ((xo == xp) || (yo == yp)) { /* horizontal or vertical vector */ GIP_RasterOp((unsigned char)func, fillpix, 0, 0, &ScreenPixmap, i.left, i.top, (BITMAP *)0, 0, 0, i.width, i.height, zmask); } else { /* non-horizontal and non-vertical vector */ GIP_Vector((unsigned char)func, fillpix, 0, 0, &ScreenPixmap, xo, yo, xp, yp, i.left, i.top, i.left+i.width-1, i.top+i.height-1, bwidth, bheight, zmask); } } } v++; } while (--vc > 0); } while (--clipcount > 0); if (!--fillpix->refcnt) FreePixmap (fillpix); RestoreCursor(); } 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, func, zmask; CLIP *clips; { #ifdef DEBUG if (debug & D_DrawCurve) printf("DrawCurve(verts=0x%x, vertcount=%d, xbase=%d, ybase=%d,\n srcpix=%d, altpix=%d, mode=%d, bwidth=%d, bheight=%d\n pat=%d, patlen=%d, patmul=%d\n clips=0x%x, clipcount=%d, func=%d, zmask=0x%04x)\n", verts, vertcount, xbase, ybase, srcpix, altpix, mode, bwidth, bheight, pat, patlen, patmul, clips, clipcount, func, zmask); #endif DEBUG switch (mode) { /* XXX - ignores dash/pattern for now */ case DrawSolidLine: Draw_Solid(srcpix, xbase, ybase, func, vertcount, verts, clipcount, clips, zmask, bwidth, bheight); break; case DrawDashedLine: Draw_Solid(srcpix, xbase, ybase, func, vertcount, verts, clipcount, clips, zmask, bwidth, bheight); break; case DrawPatternedLine: Draw_Solid(srcpix, xbase, ybase, func, vertcount, verts, clipcount, clips, zmask, bwidth, bheight); break; } }