123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /* 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. */
- /* This is the public include file for the miPaintedSet module, contained
- in mi_spans.c. */
- /* A Spans structure is a sorted list of spans, i.e. a list of point ranges
- [xmin,xmax], sorted in increasing y order. There may be more than one
- span at a given y. */
- typedef struct
- {
- int count; /* number of spans */
- miPoint *points; /* pointer to list of start points */
- unsigned int *widths; /* pointer to list of widths */
- } Spans;
- /* A SpanGroup is an unsorted list of Spans's, associated with a particular
- pixel value.
- A SpanGroup is allowed to include more than a single Spans because most
- libxmi drawing functions write out multiple Spans's. */
- typedef struct
- {
- miPixel pixel; /* pixel value */
- Spans *group; /* Spans slots */
- int size; /* number of Spans slots allocated */
- int count; /* number of Spans slots filled */
- int ymin, ymax; /* min, max y values over all Spans's */
- } SpanGroup;
- /* A miPaintedSet structure is an array of SpanGroups, specifying the
- partition into differently painted subsets. There is at most one
- SpanGroup for any pixel. */
- typedef struct lib_miPaintedSet
- {
- SpanGroup **groups; /* SpanGroup slots */
- int size; /* number of SpanGroup slots allocated */
- int ngroups; /* number of SpanGroup slots filled */
- } _miPaintedSet;
- /* libxmi's low-level painting macro. It `paints' a Spans, i.e. a list of
- spans assumed to be in y-increasing order, to a miPaintedSet with a
- specified pixel value. To do this, it invokes the lower-level function
- miAddSpansToPaintedSet() in mi_spans.c.
- The passed point and width arrays should have been allocated on the
- heap, since they will be eventually freed; e.g., when the miPaintedSet
- is cleared or deallocated. */
- #define MI_PAINT_SPANS(paintedSet, pixel, numSpans, ppts, pwidths) \
- {\
- Spans spanRec;\
- if (numSpans > 0) \
- { \
- spanRec.points = (ppts);\
- spanRec.widths = (pwidths);\
- spanRec.count = (numSpans);\
- miAddSpansToPaintedSet (&spanRec, (paintedSet), (pixel));\
- } \
- else \
- { \
- free (ppts); \
- free (pwidths); \
- } \
- }
- /* A wrapper for MI_PAINT_SPANS() that can be applied to a span array
- (i.e. to a point and width array) that can't be freed, so must be
- copied. We try not to use this. */
- #define MI_COPY_AND_PAINT_SPANS(paintedSet, pixel, nPts, FirstPoint, FirstWidth) \
- {\
- if ((nPts) > 0) \
- { \
- miPoint *ppt, *pptInit, *oldppt; \
- unsigned int *pwidth, *pwidthInit, *oldpwidth; \
- int ptsCounter; \
- ppt = pptInit = (miPoint *) mi_xmalloc ((nPts) * sizeof (miPoint));\
- pwidth = pwidthInit = (unsigned int *) mi_xmalloc ((nPts) * sizeof (unsigned int));\
- oldppt = FirstPoint;\
- oldpwidth = FirstWidth;\
- for (ptsCounter = (nPts); --ptsCounter >= 0; )\
- {\
- *ppt++ = *oldppt++;\
- *pwidth++ = *oldpwidth++;\
- }\
- MI_PAINT_SPANS(paintedSet, pixel, (nPts), pptInit, pwidthInit)\
- } \
- }
- /* miPaintedSet manipulation routines (other than public) */
- extern void miAddSpansToPaintedSet (const Spans *spans, miPaintedSet *paintedSet, miPixel pixel);
- extern void miQuickSortSpansY (miPoint *points, unsigned int *widths, int numSpans);
- extern void miUniquifyPaintedSet (miPaintedSet *paintedSet);
|