xref: /plan9/sys/src/cmd/gs/src/gxht.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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