xref: /plan9/sys/src/cmd/gs/src/gsfunc.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1997, 2000, 2002 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: gsfunc.h,v 1.13 2005/04/19 14:35:12 igor Exp $ */
187dd7cddfSDavid du Colombier /* Generic definitions for Functions */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gsfunc_INCLUDED
217dd7cddfSDavid du Colombier #  define gsfunc_INCLUDED
227dd7cddfSDavid du Colombier 
23*593dc095SDavid du Colombier #include "gstypes.h"		/* for gs_range_t */
24*593dc095SDavid du Colombier 
25*593dc095SDavid du Colombier #ifndef stream_DEFINED
26*593dc095SDavid du Colombier #  define stream_DEFINED
27*593dc095SDavid du Colombier typedef struct stream_s stream;
28*593dc095SDavid du Colombier #endif
29*593dc095SDavid du Colombier 
307dd7cddfSDavid du Colombier /* ---------------- Types and structures ---------------- */
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier /*
337dd7cddfSDavid du Colombier  * gs_function_type_t is defined as equivalent to int, rather than as an
347dd7cddfSDavid du Colombier  * enum type, because we can't enumerate all its possible values here in the
357dd7cddfSDavid du Colombier  * generic definitions.
367dd7cddfSDavid du Colombier  */
377dd7cddfSDavid du Colombier typedef int gs_function_type_t;
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier /*
407dd7cddfSDavid du Colombier  * Define information common to all Function types.
417dd7cddfSDavid du Colombier  * We separate the private part from the parameters so that
427dd7cddfSDavid du Colombier  * clients can create statically initialized parameter structures.
437dd7cddfSDavid du Colombier  */
447dd7cddfSDavid du Colombier #define gs_function_params_common\
457dd7cddfSDavid du Colombier     int m;			/* # of inputs */\
467dd7cddfSDavid du Colombier     const float *Domain;	/* 2 x m */\
477dd7cddfSDavid du Colombier     int n;			/* # of outputs */\
487dd7cddfSDavid du Colombier     const float *Range		/* 2 x n, optional except for type 0 */
497dd7cddfSDavid du Colombier 
503ff48bf5SDavid du Colombier /* Define abstract types. */
513ff48bf5SDavid du Colombier #ifndef gs_data_source_DEFINED
523ff48bf5SDavid du Colombier #  define gs_data_source_DEFINED
533ff48bf5SDavid du Colombier typedef struct gs_data_source_s gs_data_source_t;
543ff48bf5SDavid du Colombier #endif
553ff48bf5SDavid du Colombier #ifndef gs_param_list_DEFINED
563ff48bf5SDavid du Colombier #  define gs_param_list_DEFINED
573ff48bf5SDavid du Colombier typedef struct gs_param_list_s gs_param_list;
583ff48bf5SDavid du Colombier #endif
593ff48bf5SDavid du Colombier 
607dd7cddfSDavid du Colombier /* Define a generic function, for use as the target type of pointers. */
617dd7cddfSDavid du Colombier typedef struct gs_function_params_s {
627dd7cddfSDavid du Colombier     gs_function_params_common;
637dd7cddfSDavid du Colombier } gs_function_params_t;
643ff48bf5SDavid du Colombier #ifndef gs_function_DEFINED
657dd7cddfSDavid du Colombier typedef struct gs_function_s gs_function_t;
663ff48bf5SDavid du Colombier #  define gs_function_DEFINED
673ff48bf5SDavid du Colombier #endif
683ff48bf5SDavid du Colombier typedef struct gs_function_info_s {
693ff48bf5SDavid du Colombier     const gs_data_source_t *DataSource;
703ff48bf5SDavid du Colombier     ulong data_size;
713ff48bf5SDavid du Colombier     const gs_function_t *const *Functions;
723ff48bf5SDavid du Colombier     int num_Functions;
733ff48bf5SDavid du Colombier } gs_function_info_t;
743ff48bf5SDavid du Colombier 
753ff48bf5SDavid du Colombier /* Evaluate a function. */
763ff48bf5SDavid du Colombier #define FN_EVALUATE_PROC(proc)\
77*593dc095SDavid du Colombier   int proc(const gs_function_t * pfn, const float *in, float *out)
783ff48bf5SDavid du Colombier typedef FN_EVALUATE_PROC((*fn_evaluate_proc_t));
793ff48bf5SDavid du Colombier 
803ff48bf5SDavid du Colombier /* Test whether a function is monotonic. */
813ff48bf5SDavid du Colombier #define FN_IS_MONOTONIC_PROC(proc)\
82*593dc095SDavid du Colombier   int proc(const gs_function_t * pfn, const float *lower,\
83*593dc095SDavid du Colombier 	   const float *upper, uint *mask)
843ff48bf5SDavid du Colombier typedef FN_IS_MONOTONIC_PROC((*fn_is_monotonic_proc_t));
853ff48bf5SDavid du Colombier 
863ff48bf5SDavid du Colombier /* Get function information. */
873ff48bf5SDavid du Colombier #define FN_GET_INFO_PROC(proc)\
88*593dc095SDavid du Colombier   void proc(const gs_function_t *pfn, gs_function_info_t *pfi)
893ff48bf5SDavid du Colombier typedef FN_GET_INFO_PROC((*fn_get_info_proc_t));
903ff48bf5SDavid du Colombier 
913ff48bf5SDavid du Colombier /* Put function parameters on a parameter list. */
923ff48bf5SDavid du Colombier #define FN_GET_PARAMS_PROC(proc)\
93*593dc095SDavid du Colombier   int proc(const gs_function_t *pfn, gs_param_list *plist)
943ff48bf5SDavid du Colombier typedef FN_GET_PARAMS_PROC((*fn_get_params_proc_t));
953ff48bf5SDavid du Colombier 
96*593dc095SDavid du Colombier /*
97*593dc095SDavid du Colombier  * Create a new function with scaled output.  The i'th output value is
98*593dc095SDavid du Colombier  * transformed linearly so that [0 .. 1] are mapped to [pranges[i].rmin ..
99*593dc095SDavid du Colombier  * pranges[i].rmax].  Any necessary parameters or subfunctions of the
100*593dc095SDavid du Colombier  * original function are copied, not shared, even if their values aren't
101*593dc095SDavid du Colombier  * changed, so that the new function can be freed without having to worry
102*593dc095SDavid du Colombier  * about freeing data that should be kept.  Note that if there is a "data
103*593dc095SDavid du Colombier  * source", it is shared, not copied: this should not be a problem, since
104*593dc095SDavid du Colombier  * gs_function_free does not free the data source.
105*593dc095SDavid du Colombier  */
106*593dc095SDavid du Colombier #define FN_MAKE_SCALED_PROC(proc)\
107*593dc095SDavid du Colombier   int proc(const gs_function_t *pfn, gs_function_t **ppsfn,\
108*593dc095SDavid du Colombier 	   const gs_range_t *pranges, gs_memory_t *mem)
109*593dc095SDavid du Colombier typedef FN_MAKE_SCALED_PROC((*fn_make_scaled_proc_t));
110*593dc095SDavid du Colombier 
1113ff48bf5SDavid du Colombier /* Free function parameters. */
1123ff48bf5SDavid du Colombier #define FN_FREE_PARAMS_PROC(proc)\
113*593dc095SDavid du Colombier   void proc(gs_function_params_t * params, gs_memory_t * mem)
1143ff48bf5SDavid du Colombier typedef FN_FREE_PARAMS_PROC((*fn_free_params_proc_t));
1153ff48bf5SDavid du Colombier 
1163ff48bf5SDavid du Colombier /* Free a function. */
1173ff48bf5SDavid du Colombier #define FN_FREE_PROC(proc)\
118*593dc095SDavid du Colombier   void proc(gs_function_t * pfn, bool free_params, gs_memory_t * mem)
1193ff48bf5SDavid du Colombier typedef FN_FREE_PROC((*fn_free_proc_t));
1203ff48bf5SDavid du Colombier 
121*593dc095SDavid du Colombier /* Serialize a function. */
122*593dc095SDavid du Colombier #define FN_SERIALIZE_PROC(proc)\
123*593dc095SDavid du Colombier   int proc(const gs_function_t * pfn, stream *s)
124*593dc095SDavid du Colombier typedef FN_SERIALIZE_PROC((*fn_serialize_proc_t));
125*593dc095SDavid du Colombier 
1263ff48bf5SDavid du Colombier /* Define the generic function structures. */
1277dd7cddfSDavid du Colombier typedef struct gs_function_procs_s {
1287dd7cddfSDavid du Colombier     fn_evaluate_proc_t evaluate;
1297dd7cddfSDavid du Colombier     fn_is_monotonic_proc_t is_monotonic;
1303ff48bf5SDavid du Colombier     fn_get_info_proc_t get_info;
1313ff48bf5SDavid du Colombier     fn_get_params_proc_t get_params;
132*593dc095SDavid du Colombier     fn_make_scaled_proc_t make_scaled;
1337dd7cddfSDavid du Colombier     fn_free_params_proc_t free_params;
1347dd7cddfSDavid du Colombier     fn_free_proc_t free;
135*593dc095SDavid du Colombier     fn_serialize_proc_t serialize;
1367dd7cddfSDavid du Colombier } gs_function_procs_t;
1377dd7cddfSDavid du Colombier typedef struct gs_function_head_s {
1387dd7cddfSDavid du Colombier     gs_function_type_t type;
1397dd7cddfSDavid du Colombier     gs_function_procs_t procs;
1407dd7cddfSDavid du Colombier } gs_function_head_t;
1417dd7cddfSDavid du Colombier struct gs_function_s {
1427dd7cddfSDavid du Colombier     gs_function_head_t head;
1437dd7cddfSDavid du Colombier     gs_function_params_t params;
1447dd7cddfSDavid du Colombier };
1457dd7cddfSDavid du Colombier 
1467dd7cddfSDavid du Colombier #define FunctionType(pfn) ((pfn)->head.type)
1477dd7cddfSDavid du Colombier 
1487dd7cddfSDavid du Colombier /*
1497dd7cddfSDavid du Colombier  * Each specific function type has a definition in its own header file
1507dd7cddfSDavid du Colombier  * for its parameter record.  In order to keep names from overflowing
1517dd7cddfSDavid du Colombier  * various compilers' limits, we take the name of the function type and
1527dd7cddfSDavid du Colombier  * reduce it to the first and last letter of each word, e.g., for
1537dd7cddfSDavid du Colombier  * Sampled functions, XxYy is Sd.
1547dd7cddfSDavid du Colombier 
1557dd7cddfSDavid du Colombier typedef struct gs_function_XxYy_params_s {
1567dd7cddfSDavid du Colombier      gs_function_params_common;
1577dd7cddfSDavid du Colombier     << P additional members >>
1587dd7cddfSDavid du Colombier } gs_function_XxYy_params_t;
1597dd7cddfSDavid du Colombier #define private_st_function_XxYy()\
1607dd7cddfSDavid du Colombier   gs_private_st_suffix_addP(st_function_XxYy, gs_function_XxYy_t,\
1617dd7cddfSDavid du Colombier     "gs_function_XxYy_t", function_XxYy_enum_ptrs, function_XxYy_reloc_ptrs,\
1627dd7cddfSDavid du Colombier     st_function, <<params.additional_members>>)
1637dd7cddfSDavid du Colombier 
1647dd7cddfSDavid du Colombier  */
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier /* ---------------- Procedures ---------------- */
1677dd7cddfSDavid du Colombier 
1687dd7cddfSDavid du Colombier /*
1697dd7cddfSDavid du Colombier  * Each specific function type has a pair of procedures in its own
1707dd7cddfSDavid du Colombier  * header file, one to allocate and initialize an instance of that type,
1717dd7cddfSDavid du Colombier  * and one to free the parameters of that type.
1727dd7cddfSDavid du Colombier 
173*593dc095SDavid du Colombier int gs_function_XxYy_init(gs_function_t **ppfn,
1747dd7cddfSDavid du Colombier 			  const gs_function_XxYy_params_t *params,
1757dd7cddfSDavid du Colombier 			  gs_memory_t *mem));
1767dd7cddfSDavid du Colombier 
177*593dc095SDavid du Colombier void gs_function_XxYy_free_params(gs_function_XxYy_params_t *params,
178*593dc095SDavid du Colombier 				  gs_memory_t *mem);
1797dd7cddfSDavid du Colombier 
1807dd7cddfSDavid du Colombier  */
1817dd7cddfSDavid du Colombier 
182*593dc095SDavid du Colombier /* Allocate an array of function pointers. */
183*593dc095SDavid du Colombier int alloc_function_array(uint count, gs_function_t *** pFunctions,
184*593dc095SDavid du Colombier 			 gs_memory_t *mem);
185*593dc095SDavid du Colombier 
1867dd7cddfSDavid du Colombier /* Evaluate a function. */
1877dd7cddfSDavid du Colombier #define gs_function_evaluate(pfn, in, out)\
1883ff48bf5SDavid du Colombier   ((pfn)->head.procs.evaluate)(pfn, in, out)
1897dd7cddfSDavid du Colombier 
1907dd7cddfSDavid du Colombier /*
191*593dc095SDavid du Colombier  * Test whether a function is monotonic on a given (closed) interval.
192*593dc095SDavid du Colombier  * return 1 = monotonic, 0 = not or don't know, <0 = error..
193*593dc095SDavid du Colombier  * Sets mask : 1 bit per dimension :
194*593dc095SDavid du Colombier  *    1 - non-monotonic or don't know,
195*593dc095SDavid du Colombier  *    0 - monotonic.
196*593dc095SDavid du Colombier  * If lower[i] > upper[i], the result may be not defined.
1977dd7cddfSDavid du Colombier  */
198*593dc095SDavid du Colombier #define gs_function_is_monotonic(pfn, lower, upper, mask)\
199*593dc095SDavid du Colombier   ((pfn)->head.procs.is_monotonic)(pfn, lower, upper, mask)
2007dd7cddfSDavid du Colombier 
2013ff48bf5SDavid du Colombier /* Get function information. */
2023ff48bf5SDavid du Colombier #define gs_function_get_info(pfn, pfi)\
2033ff48bf5SDavid du Colombier   ((pfn)->head.procs.get_info(pfn, pfi))
2043ff48bf5SDavid du Colombier 
2053ff48bf5SDavid du Colombier /* Write function parameters. */
2063ff48bf5SDavid du Colombier #define gs_function_get_params(pfn, plist)\
2073ff48bf5SDavid du Colombier   ((pfn)->head.procs.get_params(pfn, plist))
2083ff48bf5SDavid du Colombier 
209*593dc095SDavid du Colombier /* Create a scaled function. */
210*593dc095SDavid du Colombier #define gs_function_make_scaled(pfn, ppsfn, pranges, mem)\
211*593dc095SDavid du Colombier   ((pfn)->head.procs.make_scaled(pfn, ppsfn, pranges, mem))
212*593dc095SDavid du Colombier 
2137dd7cddfSDavid du Colombier /* Free function parameters. */
2147dd7cddfSDavid du Colombier #define gs_function_free_params(pfn, mem)\
2153ff48bf5SDavid du Colombier   ((pfn)->head.procs.free_params(&(pfn)->params, mem))
2167dd7cddfSDavid du Colombier 
2177dd7cddfSDavid du Colombier /* Free a function's implementation, optionally including its parameters. */
2187dd7cddfSDavid du Colombier #define gs_function_free(pfn, free_params, mem)\
2193ff48bf5SDavid du Colombier   ((pfn)->head.procs.free(pfn, free_params, mem))
2207dd7cddfSDavid du Colombier 
221*593dc095SDavid du Colombier /* Serialize a function. */
222*593dc095SDavid du Colombier #define gs_function_serialize(pfn, s)\
223*593dc095SDavid du Colombier   ((pfn)->head.procs.serialize(pfn, s))
224*593dc095SDavid du Colombier 
2257dd7cddfSDavid du Colombier #endif /* gsfunc_INCLUDED */
226