1 /* Copyright (C) 1993, 1995, 1996, 1997, 1998 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: gxht.h,v 1.9 2004/08/04 19:36:12 stefan Exp $ */ 18 /* Rest of (client) halftone definitions */ 19 20 #ifndef gxht_INCLUDED 21 # define gxht_INCLUDED 22 23 #include "gsht1.h" 24 #include "gsrefct.h" 25 #include "gxhttype.h" 26 #include "gxtmap.h" 27 #include "gscspace.h" 28 29 /* 30 * Halftone types. Note that for this implementation there are only 31 * spot functions, thresholds, and multi-component halftones; the peculiar 32 * colored halftones supported by PostScript (HalftoneType's 2 and 4) are 33 * not supported. 34 * 35 * NB1: While this code supports relocation of the client data, it will not 36 * free that data when the halftone is released. The client must handle 37 * that task directly. 38 * 39 * NB2: The garbage collection code will deal with the user provided data as 40 * a structure pointer allocated on the heap. The client must make 41 * certain this is the case. 42 * 43 * There is, somewhat unfortunately, no identifier applied to these 44 * halftones. This reflects the origin of this graphics library as a set 45 * of routines for use by a PostScript interpreter. 46 * 47 * In PostScript, halftone objects do not exist in an identified form outside 48 * of the graphic state. Though Level 2 and PostScript 3 support halftone 49 * dictionaries, these are neither read-only structures nor tagged 50 * by a unique identifier. Hence, they are not suitable for use as cache keys. 51 * Caching of halftones for PostScript is confined to the graphic state, 52 * and this holds true for the graphic library as well. 53 * 54 * Note also that implementing a generalized halftone cache is not trivial, 55 * as the device-specific representation of spot halftones depends on the 56 * default transformation for the device, and more generally the device 57 * specific representation of halftones may depend on the sense of the device 58 * (additive or subtract). Hence, a halftone cache would need to be keyed 59 * by device. (This is not an issue when caching halftones in the graphic 60 * state as the device is also a component of the graphic state). 61 */ 62 63 /* 64 * Note that the transfer_closure members will replace transfer sometime 65 * in the future. For the moment, transfer_closure is only used if 66 * transfer = 0. 67 */ 68 69 /* Type 1 halftone. This is just a Level 1 halftone with */ 70 /* a few extra members. */ 71 typedef struct gs_spot_halftone_s { 72 gs_screen_halftone screen; 73 bool accurate_screens; 74 gs_mapping_proc transfer; /* OBSOLETE */ 75 gs_mapping_closure_t transfer_closure; 76 } gs_spot_halftone; 77 78 #define st_spot_halftone_max_ptrs st_screen_halftone_max_ptrs + 1 79 80 /* Define common elements for Type 3 and extended Type 3 halftones. */ 81 #define GS_THRESHOLD_HALFTONE_COMMON\ 82 int width;\ 83 int height;\ 84 gs_mapping_closure_t transfer_closure 85 typedef struct gs_threshold_halftone_common_s { 86 GS_THRESHOLD_HALFTONE_COMMON; 87 } gs_threshold_halftone_common; 88 89 /* Type 3 halftone. */ 90 typedef struct gs_threshold_halftone_s { 91 GS_THRESHOLD_HALFTONE_COMMON; /* must be first */ 92 gs_const_string thresholds; 93 gs_mapping_proc transfer; /* OBSOLETE */ 94 } gs_threshold_halftone; 95 96 #define st_threshold_halftone_max_ptrs 2 97 98 /* Extended Type 3 halftone. */ 99 typedef struct gs_threshold2_halftone_s { 100 GS_THRESHOLD_HALFTONE_COMMON; /* must be first */ 101 int width2; 102 int height2; 103 int bytes_per_sample; /* 1 or 2 */ 104 gs_const_bytestring thresholds; /* nota bene */ 105 } gs_threshold2_halftone; 106 107 /* Client-defined halftone that generates a halftone order. */ 108 typedef struct gs_client_order_halftone_s gs_client_order_halftone; 109 110 #ifndef gx_ht_order_DEFINED 111 # define gx_ht_order_DEFINED 112 typedef struct gx_ht_order_s gx_ht_order; 113 #endif 114 typedef struct gs_client_order_ht_procs_s { 115 116 /* 117 * Allocate and fill in the order. gx_ht_alloc_client_order 118 * (see gzht.h) does everything but fill in the actual data. 119 */ 120 121 int (*create_order) (gx_ht_order * porder, 122 gs_state * pgs, 123 const gs_client_order_halftone * phcop, 124 gs_memory_t * mem); 125 126 } gs_client_order_ht_procs_t; 127 struct gs_client_order_halftone_s { 128 int width; 129 int height; 130 int num_levels; 131 const gs_client_order_ht_procs_t *procs; 132 const void *client_data; 133 gs_mapping_closure_t transfer_closure; 134 }; 135 136 #define st_client_order_halftone_max_ptrs 2 137 138 /* Define the elements of a Type 5 halftone. */ 139 typedef struct gs_halftone_component_s { 140 int comp_number; 141 int cname; 142 gs_halftone_type type; 143 union { 144 gs_spot_halftone spot; /* Type 1 */ 145 gs_threshold_halftone threshold; /* Type 3 */ 146 gs_threshold2_halftone threshold2; /* Extended Type 3 */ 147 gs_client_order_halftone client_order; /* client order */ 148 } params; 149 } gs_halftone_component; 150 151 extern_st(st_halftone_component); 152 #define public_st_halftone_component() /* in gsht1.c */\ 153 gs_public_st_composite(st_halftone_component, gs_halftone_component,\ 154 "gs_halftone_component", halftone_component_enum_ptrs,\ 155 halftone_component_reloc_ptrs) 156 extern_st(st_ht_component_element); 157 #define public_st_ht_component_element() /* in gsht1.c */\ 158 gs_public_st_element(st_ht_component_element, gs_halftone_component,\ 159 "gs_halftone_component[]", ht_comp_elt_enum_ptrs, ht_comp_elt_reloc_ptrs,\ 160 st_halftone_component) 161 #define st_halftone_component_max_ptrs\ 162 max(max(st_spot_halftone_max_ptrs, st_threshold_halftone_max_ptrs),\ 163 st_client_order_halftone_max_ptrs) 164 165 /* Define the Type 5 halftone itself. */ 166 typedef struct gs_multiple_halftone_s { 167 gs_halftone_component *components; 168 uint num_comp; 169 int (*get_colorname_string)(const gs_memory_t *mem, gs_separation_name colorname_index, 170 unsigned char **ppstr, unsigned int *pname_size); 171 } gs_multiple_halftone; 172 173 #define st_multiple_halftone_max_ptrs 1 174 175 /* 176 * The halftone stored in the graphics state is the union of 177 * setscreen, setcolorscreen, Type 1, Type 3, and Type 5. 178 * 179 * NOTE: it is assumed that all subsidiary structures of halftones (the 180 * threshold array(s) for Type 3 halftones or halftone components, and the 181 * components array for Type 5 halftones) are allocated with the same 182 * allocator as the halftone structure itself. 183 */ 184 struct gs_halftone_s { 185 gs_halftone_type type; 186 rc_header rc; 187 union { 188 gs_screen_halftone screen; /* setscreen */ 189 gs_colorscreen_halftone colorscreen; /* setcolorscreen */ 190 gs_spot_halftone spot; /* Type 1 */ 191 gs_threshold_halftone threshold; /* Type 3 */ 192 gs_threshold2_halftone threshold2; /* Extended Type 3 */ 193 gs_client_order_halftone client_order; /* client order */ 194 gs_multiple_halftone multiple; /* Type 5 */ 195 } params; 196 }; 197 198 extern_st(st_halftone); 199 #define public_st_halftone() /* in gsht.c */\ 200 gs_public_st_composite(st_halftone, gs_halftone, "gs_halftone",\ 201 halftone_enum_ptrs, halftone_reloc_ptrs) 202 #define st_halftone_max_ptrs\ 203 max(max(st_screen_halftone_max_ptrs, st_colorscreen_halftone_max_ptrs),\ 204 max(max(st_spot_halftone_max_ptrs, st_threshold_halftone_max_ptrs),\ 205 max(st_client_order_halftone_max_ptrs,\ 206 st_multiple_halftone_max_ptrs))) 207 208 /* Procedural interface for AccurateScreens */ 209 210 /* 211 * Set/get the default AccurateScreens value (for set[color]screen). 212 * Note that this value is stored in a static variable. 213 */ 214 void gs_setaccuratescreens(bool); 215 bool gs_currentaccuratescreens(void); 216 217 /* 218 * Set/get the value for UseWTS. Also a static, but it's going away. 219 */ 220 void gs_setusewts(bool); 221 bool gs_currentusewts(void); 222 223 /* Initiate screen sampling with optional AccurateScreens. */ 224 int gs_screen_init_memory(gs_screen_enum *, gs_state *, 225 gs_screen_halftone *, bool, gs_memory_t *); 226 227 #define gs_screen_init_accurate(penum, pgs, phsp, accurate)\ 228 gs_screen_init_memory(penum, pgs, phsp, accurate, pgs->memory) 229 230 /* Procedural interface for MinScreenLevels (a Ghostscript extension) */ 231 232 /* 233 * Set/get the MinScreenLevels value. 234 * 235 * Note that this value is stored in a static variable. 236 */ 237 void gs_setminscreenlevels(uint); 238 uint gs_currentminscreenlevels(void); 239 240 #endif /* gxht_INCLUDED */ 241