123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /* This file is part of the GNU libxmi package.
- Copyright (C) 1985, 1986, 1987, 1988, 1989, X Consortium. For an
- associated permission notice, see the accompanying file README-X.
-
- GNU enhancements Copyright (C) 1998, 1999, 2000, 2005, Free Software
- Foundation, Inc.
- The GNU libxmi package is free software. You may redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software foundation; either version 2, or (at your
- option) any later version.
- The GNU libxmi package is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License along
- with the GNU plotutils package; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin St., Fifth Floor,
- Boston, MA 02110-1301, USA. */
- /* Author: Keith Packard, MIT X Consortium */
- /* definitions related to filling of convex polygons, used in code for
- * drawing of wide lines (with caps/joins) via span merging
- */
- /* Structure used for moving along left and right edges of polygons via the
- midpoint line algorithm. The algorithm: increment y, (height-1) times.
- At each step, increment e by dx. If this makes e positive, also
- subtract dy. Corresponding change to x: add stepx to x, and (if dy
- needed to be subtracted from e), also add signdx to x. */
- typedef struct
- {
- unsigned int height; /* number of scanlines in edge */
- int x; /* starting x coordinate of edge */
- int stepx; /* fixed integer dx (usually 0) */
- int signdx; /* additional (optional) integer dx */
- int e; /* initial value for decision variable */
- int dy; /* dy/dx is (rational) slope of edge */
- int dx;
- } PolyEdge;
- /*
- * types for general polygon routines
- */
- typedef struct
- {
- double x, y;
- } PolyVertex;
- typedef struct
- {
- int dx, dy; /* dy/dx is (rational) slope */
- double k; /* x0 * dy - y0 * dx */
- } PolySlope;
- /*
- * Line face, used in constructing additional cap/join polygons
- */
- typedef struct
- {
- double xa, ya; /* endpoint of line face (rel. to (x,y)) */
- int dx, dy; /* (dx,dy) points into line (a convention) */
- int x, y; /* line end, i.e. center of face */
- double k; /* xa * dy - ya * dx */
- } LineFace;
- /* Macros for stepping around a convex polygon (i.e. downward from top,
- along the sequence of `left edges' and `right edges') */
- /* load fields from next left edge in list */
- #define MIPOLYRELOADLEFT if (!left_height && left_count) { \
- left_height = left->height; \
- left_x = left->x; \
- left_stepx = left->stepx; \
- left_signdx = left->signdx; \
- left_e = left->e; \
- left_dy = left->dy; \
- left_dx = left->dx; \
- --left_count; \
- ++left; \
- }
- /* load fields from next right edge in list */
- #define MIPOLYRELOADRIGHT if (!right_height && right_count) { \
- right_height = right->height; \
- right_x = right->x; \
- right_stepx = right->stepx; \
- right_signdx = right->signdx; \
- right_e = right->e; \
- right_dy = right->dy; \
- right_dx = right->dx; \
- --right_count; \
- ++right; \
- }
- /* Update steps in edge traversal via midpoint line algorithm */
- /* step along left edge (modify x appropriately as y is incremented by 1) */
- #define MIPOLYSTEPLEFT left_x += left_stepx; \
- left_e += left_dx; \
- if (left_e > 0) \
- { \
- left_x += left_signdx; \
- left_e -= left_dy; \
- }
- /* step along right edge (modify x appropriately as y is incremented by 1) */
- #define MIPOLYSTEPRIGHT right_x += right_stepx; \
- right_e += right_dx; \
- if (right_e > 0) \
- { \
- right_x += right_signdx; \
- right_e -= right_dy; \
- }
|