/* $Xorg: regions.h,v 1.3 2000/08/17 19:46:32 cpqbld Exp $ */
/* Copyright International Business Machines, Corp. 1991
* All Rights Reserved
* Copyright Lexmark International, Inc. 1991
* All Rights Reserved
*
* License 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 IBM or Lexmark not be
* used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
*
* IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
* ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
* AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE
* QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
* OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE
* SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
* ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL
* IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
* THIS SOFTWARE.
*/
/* $XFree86: xc/lib/font/Type1/regions.h,v 1.7 2001/01/17 19:43:23 dawes Exp $ */
/*SHARED*/
#define Interior(p,rule) t1_Interior(p,rule)
#define Union(a1,a2) t1_Union(a1,a2)
#define Intersect(a1,a2) t1_Intersect(a1,a2)
#define Complement(area) t1_Complement(area)
#define Overlap(a1,a2) t1_OverLap(a1,a2)
/* returns the interior of a closed path */
extern struct region *t1_Interior ( struct segment *p, int fillrule );
#if 0
struct region *t1_Union(); /* set union of paths or regions */
struct region *t1_Intersect(); /* set intersection of regions */
struct region *t1_Complement(); /* complement of a region */
int t1_Overlap(); /* returns a Boolean; TRUE if regions overlap */
#endif
#define TT_INFINITY t1_Infinity
/*END SHARED*/
/*SHARED*/
#define ChangeDirection(type,R,x,y,dy) t1_ChangeDirection(type,R,x,y,dy)
/* called when we change direction in Y */
extern void t1_ChangeDirection ( int type, struct region *R, fractpel x,
fractpel y, fractpel dy );
#define CD_FIRST -1 /* enumeration of ChangeDirection type */
#define CD_CONTINUE 0 /* enumeration of ChangeDirection type */
#define CD_LAST 1 /* enumeration of ChangeDirection type */
#define MoreWorkArea(R,x1,y1,x2,y2) t1_MoreWorkArea(R,x1,y1,x2,y2)
#define KillRegion(area) t1_KillRegion(area)
#define CopyRegion(area) t1_CopyRegion(area)
#define BoxClip(R,xmin,ymin,xmax,ymax) t1_BoxClip(R,xmin,ymin,xmax,ymax)
#define SortSwath(a,p,f) t1_SortSwath(a,p,f)
#define SwathUnion(b,e) t1_SwathUnion(b,e)
#define RegionBounds(r) t1_RegionBounds(r)
#define CoerceRegion(p) t1_CoerceRegion(p)
#define MoveEdges(R,dx,dy) t1_MoveEdges(R,dx,dy)
#define UnJumble(R) t1_UnJumble(R)
typedef struct edgelist *(*SwathFunc)(struct edgelist *, struct edgelist *);
/* get longer edge list for stepping */
extern void t1_MoreWorkArea ( struct region *R, fractpel x1, fractpel y1,
fractpel x2, fractpel y2 );
/* duplicate a region */
extern struct region *t1_CopyRegion ( struct region *area );
/* destroy a region */
extern void t1_KillRegion ( struct region *area );
/*END SHARED*/
/*SHARED*/
#define GOING_TO(R, x1, y1, x2, y2, dy) { \
if (dy < 0) { \
if (R->lastdy >= 0) \
ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
if (y2 < R->edgeYstop) \
MoreWorkArea(R, x1, y1, x2, y2); \
} \
else if (dy > 0) { \
if (R->lastdy <= 0) \
ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
if (y2 > R->edgeYstop) \
MoreWorkArea(R, x1, y1, x2, y2); \
} \
else /* dy == 0 */ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \
if (x2 < R->edgexmin) R->edgexmin = x2; \
else if (x2 > R->edgexmax) R->edgexmax = x2; \
}
#ifndef FONTMODULE
#ifndef __sxg__
#include <limits.h>
#endif
#endif
#ifdef SHRT_MIN
#define MINPEL SHRT_MIN
#else
#define MINPEL ((pel)(-1<<(8*sizeof(pel)-1))) /* smallest value fitting in a pel */
#endif
#ifdef SHRT_MAX
#define MAXPEL SHRT_MAX
#else
#define MAXPEL ((pel)((1<<(8*sizeof(pel)-1))-1))/* largest value fitting in a pel */
#endif
/*
The "Unique"-type macro is different (unique?) for regions, because some
regions structures are shared among several objects, and might have
to be made unique for that reason (i.e., references > 1).
*/
#define ConsumeRegion(R) MAKECONSUME(R,KillRegion(R))
#define UniqueRegion(R) MAKEUNIQUE(R,CopyRegion(R))
/*END SHARED*/
/*SHARED*/
typedef void (*NewEdgeFunc)(struct region *,
fractpel, fractpel, fractpel, fractpel, int);
struct region {
XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
/* type = REGIONTYPE */
struct fractpoint origin; /* beginning handle: X,Y origin of region */
struct fractpoint ending; /* ending handle: X,Y change after painting region */
pel xmin,ymin; /* minimum X,Y of region */
pel xmax,ymax; /* mat1_mum X,Y of region */
struct edgelist *anchor; /* list of edges that bound the region */
struct picture *thresholded; /* region defined by thresholded picture*/
/*
Note that the ending handle and the bounding box values are stored
relative to 'origin'.
The above elements describe a region. The following elements are
scratchpad areas used while the region is being built:
*/
fractpel lastdy; /* direction of last segment */
fractpel firstx,firsty; /* starting point of current edge */
fractpel edgexmin,edgexmax; /* x extent of current edge */
struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */
pel *edge; /* pointer to array of X values for edge */
fractpel edgeYstop; /* Y value where 'edges' array ends */
NewEdgeFunc newedgefcn; /* function to use when building a new edge */
struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */
} ;
/*
The ISCOMPLEMENT flag indicates the region is reversed--it is the
"outside" of the nominal region.
*/
#define ISCOMPLEMENT(flag) ((flag)&0x80)
/*
The ISJUMBLED flag indicates the region is not sorted top-to-bottom.
*/
#define ISJUMBLED(flag) ((flag)&0x40)
/*
The ISINFINITE flag allows a quick check for an INFINITE region, which
is frequently intersected.
*/
#define ISINFINITE(flag) ((flag)&0x20)
/*END SHARED*/
/*SHARED*/
#define ISRECTANGULAR(flag) ((flag)&0x08)
/*END SHARED*/
/*SHARED*/
#define EmptyRegion t1_EmptyRegion
/*END SHARED*/
/*SHARED*/
struct edgelist {
XOBJ_COMMON /* xobject common data define 3-26-91 PNM */
/* type = EDGETYPE */
struct edgelist *link; /* pointer to next in linked list */
struct edgelist *subpath; /* informational link for "same subpath" */
pel xmin,xmax; /* range of edge in X */
pel ymin,ymax; /* range of edge in Y */
pel *xvalues; /* pointer to ymax-ymin X values */
} ;
/*
The end of the list is marked by either "link" being NULL, or by
ymin == ymax. See :hdref refid=discard.. We define the VALIDEDGE
predicate to test for the opposite of these conditions:
*/
#define VALIDEDGE(p) ((p)!=NULL&&(p)->ymin<(p)->ymax)
/*END SHARED*/
/*SHARED*/
#define ISDOWN(f) ((f)&0x80)
#define ISAMBIGUOUS(f) ((f)&0x40)
/*END SHARED*/
/*SHARED*/
/*
Interior() rule enumerations:
*/
#define WINDINGRULE -2
#define EVENODDRULE -3
#define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */
/*END SHARED*/
|