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