1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/* 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);
|