1 /* Copyright (C) 1991, 1995, 1998, 1999 Aladdin Enterprises. All rights reserved. 2 3 This software is provided AS-IS with no warranty, either express or 4 implied. 5 6 This software is distributed under license and may not be copied, 7 modified or distributed except as expressly authorized under the terms 8 of the license contained in the file LICENSE in this distribution. 9 10 For more information about licensing, please refer to 11 http://www.ghostscript.com/licensing/. For information on 12 commercial licensing, go to http://www.artifex.com/licensing/ or 13 contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14 San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15 */ 16 17 /* $Id: gxcpath.h,v 1.5 2002/06/16 08:45:43 lpd Exp $ */ 18 /* Definitions for clipping lists and devices */ 19 /* Requires gxdevice.h */ 20 21 #ifndef gxcpath_INCLUDED 22 # define gxcpath_INCLUDED 23 24 /* We expose the implementation of clipping lists so that clients */ 25 /* can allocate clipping lists or devices on the stack. */ 26 27 /* 28 * For clipping, a path is represented as a list of rectangles. 29 * Normally, a path is created as a list of segments; 30 * installing it as a clipping path creates the rectangle list. 31 * However, when the clipping path originates in some other way 32 * (e.g., from initclip, or for clipping a cached character), 33 * or if it is a non-trivial intersection of two paths, 34 * the resulting clipping path exists only as a rectangle list; 35 * clippath constructs the segment representation if needed. 36 * Note that even if the path only exists as a rectangle list, 37 * its bounding box (path.bbox) is still correct. 38 */ 39 40 /* 41 * Rectangle list structure. 42 * Consecutive gx_clip_rect entries either have the same Y values, 43 * or ymin of this entry >= ymax of the previous entry. 44 */ 45 typedef struct gx_clip_rect_s gx_clip_rect; 46 struct gx_clip_rect_s { 47 gx_clip_rect *next, *prev; 48 int ymin, ymax; /* ymax > ymin */ 49 int xmin, xmax; /* xmax > xmin */ 50 byte to_visit; /* bookkeeping for gs_clippath */ 51 }; 52 53 /* The descriptor is public only for gxacpath.c. */ 54 extern_st(st_clip_rect); 55 #define public_st_clip_rect() /* in gxcpath.c */\ 56 gs_public_st_ptrs2(st_clip_rect, gx_clip_rect, "clip_rect",\ 57 clip_rect_enum_ptrs, clip_rect_reloc_ptrs, next, prev) 58 #define st_clip_rect_max_ptrs 2 59 60 /* 61 * A clip list may consist either of a single rectangle, 62 * with null head and tail, or a list of rectangles. In the latter case, 63 * there is a dummy head entry with p.x = q.x to cover Y values 64 * starting at min_int, and a dummy tail entry to cover Y values 65 * ending at max_int. This eliminates the need for end tests. 66 */ 67 #ifndef gx_clip_list_DEFINED 68 # define gx_clip_list_DEFINED 69 typedef struct gx_clip_list_s gx_clip_list; 70 #endif 71 struct gx_clip_list_s { 72 gx_clip_rect single; /* (has next = prev = 0) */ 73 gx_clip_rect *head; 74 gx_clip_rect *tail; 75 int xmin, xmax; /* min and max X over all but head/tail */ 76 int count; /* # of rectangles not counting */ 77 /* head or tail */ 78 }; 79 80 #define private_st_clip_list() /* in gxcpath.c */\ 81 gs_private_st_ptrs2(st_clip_list, gx_clip_list, "clip_list",\ 82 clip_list_enum_ptrs, clip_list_reloc_ptrs, head, tail) 83 #define st_clip_list_max_ptrs 2 /* head, tail */ 84 #define clip_list_is_rectangle(clp) ((clp)->count <= 1) 85 86 /* 87 * Clipping devices provide for translation before clipping. 88 * This ability, a late addition, currently is used only in a few 89 * situations that require breaking up a transfer into pieces, 90 * but we suspect it could be used more widely. 91 * 92 * Note that clipping devices cache their clipping box, so the target's 93 * clipping box and the clip list must be const after the clipping device 94 * is opened. 95 */ 96 #ifndef gx_device_clip_DEFINED 97 # define gx_device_clip_DEFINED 98 typedef struct gx_device_clip_s gx_device_clip; 99 #endif 100 struct gx_device_clip_s { 101 gx_device_forward_common; /* target is set by client */ 102 gx_clip_list list; /* set by client */ 103 gx_clip_rect *current; /* cursor in list */ 104 gs_int_point translation; 105 gs_fixed_rect clipping_box; 106 bool clipping_box_set; 107 }; 108 109 extern_st(st_device_clip); 110 #define public_st_device_clip() /* in gxcpath.c */\ 111 gs_public_st_composite_use_final(st_device_clip, gx_device_clip,\ 112 "gx_device_clip", device_clip_enum_ptrs, device_clip_reloc_ptrs,\ 113 gx_device_finalize) 114 void gx_make_clip_translate_device(gx_device_clip * dev, 115 const gx_clip_list * list, 116 int tx, int ty, gs_memory_t *mem); 117 118 #define gx_make_clip_device(dev, list)\ 119 gx_make_clip_translate_device(dev, list, 0, 0, NULL) 120 void gx_make_clip_path_device(gx_device_clip *, const gx_clip_path *); 121 122 #define clip_rect_print(ch, str, ar)\ 123 if_debug7(ch, "[%c]%s 0x%lx: (%d,%d),(%d,%d)\n", ch, str, (ulong)ar,\ 124 (ar)->xmin, (ar)->ymin, (ar)->xmax, (ar)->ymax) 125 126 /* Exported by gxcpath.c for gxacpath.c */ 127 128 /* Initialize a clip list. */ 129 void gx_clip_list_init(gx_clip_list *); 130 131 /* Free a clip list. */ 132 void gx_clip_list_free(gx_clip_list *, gs_memory_t *); 133 134 /* Set the outer box for a clipping path from its bounding box. */ 135 void gx_cpath_set_outer_box(gx_clip_path *); 136 137 /* Exported by gxcpath.c for gxclip.c */ 138 139 /* Return the rectangle list of a clipping path (for local use only). */ 140 const gx_clip_list *gx_cpath_list(const gx_clip_path *pcpath); 141 142 #endif /* gxcpath_INCLUDED */ 143