1 /* Copyright (C) 1989, 1995, 1996, 1997, 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: gzstate.h,v 1.10 2004/03/13 18:28:52 igor Exp $ */ 18 /* Private graphics state definition for Ghostscript library */ 19 20 #ifndef gzstate_INCLUDED 21 # define gzstate_INCLUDED 22 23 #include "gscpm.h" 24 #include "gscspace.h" 25 #include "gsrefct.h" 26 #include "gxdcolor.h" 27 #include "gxistate.h" 28 #include "gsstate.h" 29 #include "gxstate.h" 30 31 /* Opaque types referenced by the graphics state. */ 32 #ifndef gx_path_DEFINED 33 # define gx_path_DEFINED 34 typedef struct gx_path_s gx_path; 35 #endif 36 #ifndef gx_clip_path_DEFINED 37 # define gx_clip_path_DEFINED 38 typedef struct gx_clip_path_s gx_clip_path; 39 #endif 40 #ifndef gx_clip_stack_DEFINED 41 # define gx_clip_stack_DEFINED 42 typedef struct gx_clip_stack_s gx_clip_stack_t; 43 #endif 44 #ifndef gs_color_space_DEFINED 45 # define gs_color_space_DEFINED 46 typedef struct gs_color_space_s gs_color_space; 47 #endif 48 #ifndef gs_client_color_DEFINED 49 # define gs_client_color_DEFINED 50 typedef struct gs_client_color_s gs_client_color; 51 #endif 52 #ifndef gs_font_DEFINED 53 # define gs_font_DEFINED 54 typedef struct gs_font_s gs_font; 55 #endif 56 #ifndef gs_transparency_group_DEFINED 57 # define gs_transparency_group_DEFINED 58 typedef struct gs_transparency_group_s gs_transparency_group_t; 59 #endif 60 #ifndef gs_device_filter_stack_DEFINED 61 # define gs_device_filter_stack_DEFINED 62 typedef struct gs_device_filter_stack_s gs_device_filter_stack_t; 63 #endif 64 65 /* Device filter stack structure is defined here so that gstate 66 lifecycle operations can access reference count; implementation is 67 in gsdfilt.c. 68 */ 69 70 #ifndef gs_device_filter_DEFINED 71 # define gs_device_filter_DEFINED 72 typedef struct gs_device_filter_s gs_device_filter_t; 73 #endif 74 75 /* This is the base structure from which device filters are derived. */ 76 struct gs_device_filter_stack_s { 77 gs_device_filter_stack_t *next; 78 gs_device_filter_t *df; 79 gx_device *next_device; 80 rc_header rc; 81 }; 82 83 /* Graphics state structure. */ 84 85 struct gs_state_s { 86 gs_imager_state_common; /* imager state, must be first */ 87 gs_state *saved; /* previous state from gsave */ 88 89 /* Transformation: */ 90 91 gs_matrix ctm_inverse; 92 bool ctm_inverse_valid; /* true if ctm_inverse = ctm^-1 */ 93 gs_matrix ctm_default; 94 bool ctm_default_set; /* if true, use ctm_default; */ 95 /* if false, ask device */ 96 /* Paths: */ 97 98 gx_path *path; 99 gx_clip_path *clip_path; 100 gx_clip_stack_t *clip_stack; /* (LanguageLevel 3 only) */ 101 gx_clip_path *view_clip; /* (may be 0, or have rule = 0) */ 102 103 /* Effective clip path cache */ 104 gs_id effective_clip_id; /* (key) clip path id */ 105 gs_id effective_view_clip_id; /* (key) view clip path id */ 106 gx_clip_path *effective_clip_path; /* (value) effective clip path, */ 107 /* possibly = clip_path or view_clip */ 108 bool effective_clip_shared; /* true iff e.c.p. = c.p. or v.c. */ 109 110 /* Color (device-independent): */ 111 112 gs_color_space *color_space; /* after substitution */ 113 gs_client_color *ccolor; 114 115 /* Color caches: */ 116 117 gx_device_color *dev_color; 118 119 /* Font: */ 120 121 gs_font *font; 122 gs_font *root_font; 123 gs_matrix_fixed char_tm; /* font matrix * ctm */ 124 #define char_tm_only(pgs) *(gs_matrix *)&(pgs)->char_tm 125 bool char_tm_valid; /* true if char_tm is valid */ 126 gs_in_cache_device_t in_cachedevice; /* (see gscpm.h) */ 127 gs_char_path_mode in_charpath; /* (see gscpm.h) */ 128 gs_state *show_gstate; /* gstate when show was invoked */ 129 /* (so charpath can append to path) */ 130 131 /* Other stuff: */ 132 133 int level; /* incremented by 1 per gsave */ 134 gx_device *device; 135 #undef gs_currentdevice_inline 136 #define gs_currentdevice_inline(pgs) ((pgs)->device) 137 gs_device_filter_stack_t *dfilter_stack; 138 139 gs_transparency_group_t *transparency_group_stack; /* (PDF 1.4 only) */ 140 141 /* Client data: */ 142 143 /*void *client_data;*/ /* in imager state */ 144 #define gs_state_client_data(pgs) ((pgs)->client_data) 145 gs_state_client_procs client_procs; 146 }; 147 148 #define public_st_gs_state() /* in gsstate.c */\ 149 gs_public_st_composite(st_gs_state, gs_state, "gs_state",\ 150 gs_state_enum_ptrs, gs_state_reloc_ptrs) 151 152 /* 153 * Enumerate the pointers in a graphics state, other than the ones in the 154 * imager state, and device, which must be handled specially. 155 */ 156 #define gs_state_do_ptrs(m)\ 157 m(0,saved) m(1,path) m(2,clip_path) m(3,clip_stack)\ 158 m(4,view_clip) m(5,effective_clip_path)\ 159 m(6,color_space) m(7,ccolor) m(8,dev_color)\ 160 m(9,font) m(10,root_font) m(11,show_gstate) /*m(---,device)*/\ 161 m(12,transparency_group_stack) 162 #define gs_state_num_ptrs 13 163 164 /* The following macro is used for development purpose for designating places 165 where current point is changed. Clients must not use it. */ 166 #define gx_setcurrentpoint(pgs, xx, yy)\ 167 (pgs)->current_point.x = xx;\ 168 (pgs)->current_point.y = yy; 169 170 #endif /* gzstate_INCLUDED */ 171