17dd7cddfSDavid du Colombier /* Copyright (C) 1993, 1995, 1996, 1997, 1998 Aladdin Enterprises. All rights reserved. 27dd7cddfSDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 57dd7cddfSDavid du Colombier 6*593dc095SDavid du Colombier This software is distributed under license and may not be copied, 7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms 8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution. 97dd7cddfSDavid du Colombier 10*593dc095SDavid du Colombier For more information about licensing, please refer to 11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on 12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or 13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861. 157dd7cddfSDavid du Colombier */ 167dd7cddfSDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gxht.h,v 1.9 2004/08/04 19:36:12 stefan Exp $ */ 187dd7cddfSDavid du Colombier /* Rest of (client) halftone definitions */ 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier #ifndef gxht_INCLUDED 217dd7cddfSDavid du Colombier # define gxht_INCLUDED 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier #include "gsht1.h" 247dd7cddfSDavid du Colombier #include "gsrefct.h" 257dd7cddfSDavid du Colombier #include "gxhttype.h" 267dd7cddfSDavid du Colombier #include "gxtmap.h" 27*593dc095SDavid du Colombier #include "gscspace.h" 287dd7cddfSDavid du Colombier 297dd7cddfSDavid du Colombier /* 307dd7cddfSDavid du Colombier * Halftone types. Note that for this implementation there are only 317dd7cddfSDavid du Colombier * spot functions, thresholds, and multi-component halftones; the peculiar 327dd7cddfSDavid du Colombier * colored halftones supported by PostScript (HalftoneType's 2 and 4) are 337dd7cddfSDavid du Colombier * not supported. 347dd7cddfSDavid du Colombier * 357dd7cddfSDavid du Colombier * NB1: While this code supports relocation of the client data, it will not 367dd7cddfSDavid du Colombier * free that data when the halftone is released. The client must handle 377dd7cddfSDavid du Colombier * that task directly. 387dd7cddfSDavid du Colombier * 397dd7cddfSDavid du Colombier * NB2: The garbage collection code will deal with the user provided data as 407dd7cddfSDavid du Colombier * a structure pointer allocated on the heap. The client must make 417dd7cddfSDavid du Colombier * certain this is the case. 427dd7cddfSDavid du Colombier * 437dd7cddfSDavid du Colombier * There is, somewhat unfortunately, no identifier applied to these 447dd7cddfSDavid du Colombier * halftones. This reflects the origin of this graphics library as a set 457dd7cddfSDavid du Colombier * of routines for use by a PostScript interpreter. 467dd7cddfSDavid du Colombier * 477dd7cddfSDavid du Colombier * In PostScript, halftone objects do not exist in an identified form outside 487dd7cddfSDavid du Colombier * of the graphic state. Though Level 2 and PostScript 3 support halftone 497dd7cddfSDavid du Colombier * dictionaries, these are neither read-only structures nor tagged 507dd7cddfSDavid du Colombier * by a unique identifier. Hence, they are not suitable for use as cache keys. 517dd7cddfSDavid du Colombier * Caching of halftones for PostScript is confined to the graphic state, 527dd7cddfSDavid du Colombier * and this holds true for the graphic library as well. 537dd7cddfSDavid du Colombier * 547dd7cddfSDavid du Colombier * Note also that implementing a generalized halftone cache is not trivial, 557dd7cddfSDavid du Colombier * as the device-specific representation of spot halftones depends on the 567dd7cddfSDavid du Colombier * default transformation for the device, and more generally the device 577dd7cddfSDavid du Colombier * specific representation of halftones may depend on the sense of the device 587dd7cddfSDavid du Colombier * (additive or subtract). Hence, a halftone cache would need to be keyed 597dd7cddfSDavid du Colombier * by device. (This is not an issue when caching halftones in the graphic 607dd7cddfSDavid du Colombier * state as the device is also a component of the graphic state). 617dd7cddfSDavid du Colombier */ 627dd7cddfSDavid du Colombier 637dd7cddfSDavid du Colombier /* 647dd7cddfSDavid du Colombier * Note that the transfer_closure members will replace transfer sometime 657dd7cddfSDavid du Colombier * in the future. For the moment, transfer_closure is only used if 667dd7cddfSDavid du Colombier * transfer = 0. 677dd7cddfSDavid du Colombier */ 687dd7cddfSDavid du Colombier 697dd7cddfSDavid du Colombier /* Type 1 halftone. This is just a Level 1 halftone with */ 707dd7cddfSDavid du Colombier /* a few extra members. */ 717dd7cddfSDavid du Colombier typedef struct gs_spot_halftone_s { 727dd7cddfSDavid du Colombier gs_screen_halftone screen; 737dd7cddfSDavid du Colombier bool accurate_screens; 747dd7cddfSDavid du Colombier gs_mapping_proc transfer; /* OBSOLETE */ 757dd7cddfSDavid du Colombier gs_mapping_closure_t transfer_closure; 767dd7cddfSDavid du Colombier } gs_spot_halftone; 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier #define st_spot_halftone_max_ptrs st_screen_halftone_max_ptrs + 1 797dd7cddfSDavid du Colombier 807dd7cddfSDavid du Colombier /* Define common elements for Type 3 and extended Type 3 halftones. */ 817dd7cddfSDavid du Colombier #define GS_THRESHOLD_HALFTONE_COMMON\ 827dd7cddfSDavid du Colombier int width;\ 837dd7cddfSDavid du Colombier int height;\ 847dd7cddfSDavid du Colombier gs_mapping_closure_t transfer_closure 857dd7cddfSDavid du Colombier typedef struct gs_threshold_halftone_common_s { 867dd7cddfSDavid du Colombier GS_THRESHOLD_HALFTONE_COMMON; 877dd7cddfSDavid du Colombier } gs_threshold_halftone_common; 887dd7cddfSDavid du Colombier 897dd7cddfSDavid du Colombier /* Type 3 halftone. */ 907dd7cddfSDavid du Colombier typedef struct gs_threshold_halftone_s { 917dd7cddfSDavid du Colombier GS_THRESHOLD_HALFTONE_COMMON; /* must be first */ 927dd7cddfSDavid du Colombier gs_const_string thresholds; 937dd7cddfSDavid du Colombier gs_mapping_proc transfer; /* OBSOLETE */ 947dd7cddfSDavid du Colombier } gs_threshold_halftone; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier #define st_threshold_halftone_max_ptrs 2 977dd7cddfSDavid du Colombier 987dd7cddfSDavid du Colombier /* Extended Type 3 halftone. */ 997dd7cddfSDavid du Colombier typedef struct gs_threshold2_halftone_s { 1007dd7cddfSDavid du Colombier GS_THRESHOLD_HALFTONE_COMMON; /* must be first */ 1017dd7cddfSDavid du Colombier int width2; 1027dd7cddfSDavid du Colombier int height2; 1037dd7cddfSDavid du Colombier int bytes_per_sample; /* 1 or 2 */ 1047dd7cddfSDavid du Colombier gs_const_bytestring thresholds; /* nota bene */ 1057dd7cddfSDavid du Colombier } gs_threshold2_halftone; 1067dd7cddfSDavid du Colombier 1077dd7cddfSDavid du Colombier /* Client-defined halftone that generates a halftone order. */ 1087dd7cddfSDavid du Colombier typedef struct gs_client_order_halftone_s gs_client_order_halftone; 1097dd7cddfSDavid du Colombier 1107dd7cddfSDavid du Colombier #ifndef gx_ht_order_DEFINED 1117dd7cddfSDavid du Colombier # define gx_ht_order_DEFINED 1127dd7cddfSDavid du Colombier typedef struct gx_ht_order_s gx_ht_order; 1137dd7cddfSDavid du Colombier #endif 1147dd7cddfSDavid du Colombier typedef struct gs_client_order_ht_procs_s { 1157dd7cddfSDavid du Colombier 1167dd7cddfSDavid du Colombier /* 1177dd7cddfSDavid du Colombier * Allocate and fill in the order. gx_ht_alloc_client_order 1187dd7cddfSDavid du Colombier * (see gzht.h) does everything but fill in the actual data. 1197dd7cddfSDavid du Colombier */ 1207dd7cddfSDavid du Colombier 121*593dc095SDavid du Colombier int (*create_order) (gx_ht_order * porder, 1227dd7cddfSDavid du Colombier gs_state * pgs, 1237dd7cddfSDavid du Colombier const gs_client_order_halftone * phcop, 124*593dc095SDavid du Colombier gs_memory_t * mem); 1257dd7cddfSDavid du Colombier 1267dd7cddfSDavid du Colombier } gs_client_order_ht_procs_t; 1277dd7cddfSDavid du Colombier struct gs_client_order_halftone_s { 1287dd7cddfSDavid du Colombier int width; 1297dd7cddfSDavid du Colombier int height; 1307dd7cddfSDavid du Colombier int num_levels; 1317dd7cddfSDavid du Colombier const gs_client_order_ht_procs_t *procs; 1327dd7cddfSDavid du Colombier const void *client_data; 1337dd7cddfSDavid du Colombier gs_mapping_closure_t transfer_closure; 1347dd7cddfSDavid du Colombier }; 1357dd7cddfSDavid du Colombier 1367dd7cddfSDavid du Colombier #define st_client_order_halftone_max_ptrs 2 1377dd7cddfSDavid du Colombier 1387dd7cddfSDavid du Colombier /* Define the elements of a Type 5 halftone. */ 1397dd7cddfSDavid du Colombier typedef struct gs_halftone_component_s { 140*593dc095SDavid du Colombier int comp_number; 141*593dc095SDavid du Colombier int cname; 1427dd7cddfSDavid du Colombier gs_halftone_type type; 1437dd7cddfSDavid du Colombier union { 1447dd7cddfSDavid du Colombier gs_spot_halftone spot; /* Type 1 */ 1457dd7cddfSDavid du Colombier gs_threshold_halftone threshold; /* Type 3 */ 1467dd7cddfSDavid du Colombier gs_threshold2_halftone threshold2; /* Extended Type 3 */ 1477dd7cddfSDavid du Colombier gs_client_order_halftone client_order; /* client order */ 1487dd7cddfSDavid du Colombier } params; 1497dd7cddfSDavid du Colombier } gs_halftone_component; 1507dd7cddfSDavid du Colombier 1517dd7cddfSDavid du Colombier extern_st(st_halftone_component); 1527dd7cddfSDavid du Colombier #define public_st_halftone_component() /* in gsht1.c */\ 1537dd7cddfSDavid du Colombier gs_public_st_composite(st_halftone_component, gs_halftone_component,\ 1547dd7cddfSDavid du Colombier "gs_halftone_component", halftone_component_enum_ptrs,\ 1557dd7cddfSDavid du Colombier halftone_component_reloc_ptrs) 1567dd7cddfSDavid du Colombier extern_st(st_ht_component_element); 1577dd7cddfSDavid du Colombier #define public_st_ht_component_element() /* in gsht1.c */\ 1587dd7cddfSDavid du Colombier gs_public_st_element(st_ht_component_element, gs_halftone_component,\ 1597dd7cddfSDavid du Colombier "gs_halftone_component[]", ht_comp_elt_enum_ptrs, ht_comp_elt_reloc_ptrs,\ 1607dd7cddfSDavid du Colombier st_halftone_component) 1617dd7cddfSDavid du Colombier #define st_halftone_component_max_ptrs\ 1627dd7cddfSDavid du Colombier max(max(st_spot_halftone_max_ptrs, st_threshold_halftone_max_ptrs),\ 1637dd7cddfSDavid du Colombier st_client_order_halftone_max_ptrs) 1647dd7cddfSDavid du Colombier 1657dd7cddfSDavid du Colombier /* Define the Type 5 halftone itself. */ 1667dd7cddfSDavid du Colombier typedef struct gs_multiple_halftone_s { 1677dd7cddfSDavid du Colombier gs_halftone_component *components; 1687dd7cddfSDavid du Colombier uint num_comp; 169*593dc095SDavid du Colombier int (*get_colorname_string)(const gs_memory_t *mem, gs_separation_name colorname_index, 170*593dc095SDavid du Colombier unsigned char **ppstr, unsigned int *pname_size); 1717dd7cddfSDavid du Colombier } gs_multiple_halftone; 1727dd7cddfSDavid du Colombier 1737dd7cddfSDavid du Colombier #define st_multiple_halftone_max_ptrs 1 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier /* 1767dd7cddfSDavid du Colombier * The halftone stored in the graphics state is the union of 1777dd7cddfSDavid du Colombier * setscreen, setcolorscreen, Type 1, Type 3, and Type 5. 1787dd7cddfSDavid du Colombier * 1797dd7cddfSDavid du Colombier * NOTE: it is assumed that all subsidiary structures of halftones (the 1807dd7cddfSDavid du Colombier * threshold array(s) for Type 3 halftones or halftone components, and the 1817dd7cddfSDavid du Colombier * components array for Type 5 halftones) are allocated with the same 1827dd7cddfSDavid du Colombier * allocator as the halftone structure itself. 1837dd7cddfSDavid du Colombier */ 1847dd7cddfSDavid du Colombier struct gs_halftone_s { 1857dd7cddfSDavid du Colombier gs_halftone_type type; 1867dd7cddfSDavid du Colombier rc_header rc; 1877dd7cddfSDavid du Colombier union { 1887dd7cddfSDavid du Colombier gs_screen_halftone screen; /* setscreen */ 1897dd7cddfSDavid du Colombier gs_colorscreen_halftone colorscreen; /* setcolorscreen */ 1907dd7cddfSDavid du Colombier gs_spot_halftone spot; /* Type 1 */ 1917dd7cddfSDavid du Colombier gs_threshold_halftone threshold; /* Type 3 */ 1927dd7cddfSDavid du Colombier gs_threshold2_halftone threshold2; /* Extended Type 3 */ 1937dd7cddfSDavid du Colombier gs_client_order_halftone client_order; /* client order */ 1947dd7cddfSDavid du Colombier gs_multiple_halftone multiple; /* Type 5 */ 1957dd7cddfSDavid du Colombier } params; 1967dd7cddfSDavid du Colombier }; 1977dd7cddfSDavid du Colombier 1987dd7cddfSDavid du Colombier extern_st(st_halftone); 1997dd7cddfSDavid du Colombier #define public_st_halftone() /* in gsht.c */\ 2007dd7cddfSDavid du Colombier gs_public_st_composite(st_halftone, gs_halftone, "gs_halftone",\ 2017dd7cddfSDavid du Colombier halftone_enum_ptrs, halftone_reloc_ptrs) 2027dd7cddfSDavid du Colombier #define st_halftone_max_ptrs\ 2037dd7cddfSDavid du Colombier max(max(st_screen_halftone_max_ptrs, st_colorscreen_halftone_max_ptrs),\ 2047dd7cddfSDavid du Colombier max(max(st_spot_halftone_max_ptrs, st_threshold_halftone_max_ptrs),\ 2057dd7cddfSDavid du Colombier max(st_client_order_halftone_max_ptrs,\ 2067dd7cddfSDavid du Colombier st_multiple_halftone_max_ptrs))) 2077dd7cddfSDavid du Colombier 2087dd7cddfSDavid du Colombier /* Procedural interface for AccurateScreens */ 2097dd7cddfSDavid du Colombier 2107dd7cddfSDavid du Colombier /* 2117dd7cddfSDavid du Colombier * Set/get the default AccurateScreens value (for set[color]screen). 2127dd7cddfSDavid du Colombier * Note that this value is stored in a static variable. 2137dd7cddfSDavid du Colombier */ 214*593dc095SDavid du Colombier void gs_setaccuratescreens(bool); 215*593dc095SDavid du Colombier bool gs_currentaccuratescreens(void); 216*593dc095SDavid du Colombier 217*593dc095SDavid du Colombier /* 218*593dc095SDavid du Colombier * Set/get the value for UseWTS. Also a static, but it's going away. 219*593dc095SDavid du Colombier */ 220*593dc095SDavid du Colombier void gs_setusewts(bool); 221*593dc095SDavid du Colombier bool gs_currentusewts(void); 2227dd7cddfSDavid du Colombier 2237dd7cddfSDavid du Colombier /* Initiate screen sampling with optional AccurateScreens. */ 224*593dc095SDavid du Colombier int gs_screen_init_memory(gs_screen_enum *, gs_state *, 225*593dc095SDavid du Colombier gs_screen_halftone *, bool, gs_memory_t *); 2267dd7cddfSDavid du Colombier 2277dd7cddfSDavid du Colombier #define gs_screen_init_accurate(penum, pgs, phsp, accurate)\ 2287dd7cddfSDavid du Colombier gs_screen_init_memory(penum, pgs, phsp, accurate, pgs->memory) 2297dd7cddfSDavid du Colombier 2307dd7cddfSDavid du Colombier /* Procedural interface for MinScreenLevels (a Ghostscript extension) */ 2317dd7cddfSDavid du Colombier 2327dd7cddfSDavid du Colombier /* 2337dd7cddfSDavid du Colombier * Set/get the MinScreenLevels value. 2347dd7cddfSDavid du Colombier * 2357dd7cddfSDavid du Colombier * Note that this value is stored in a static variable. 2367dd7cddfSDavid du Colombier */ 237*593dc095SDavid du Colombier void gs_setminscreenlevels(uint); 238*593dc095SDavid du Colombier uint gs_currentminscreenlevels(void); 2397dd7cddfSDavid du Colombier 2407dd7cddfSDavid du Colombier #endif /* gxht_INCLUDED */ 241