1 /* Copyright (C) 2001-2007 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 /* $Id: zncdummy.c 9043 2008-08-28 22:48:19Z giles $ */
14 /* Sample implementation for client custom processing of color spaces. */
15 
16 /*
17  * This module has been created to demonstrate how to add support for the use
18  * of custom color handling to the Ghostscript graphics library via a custom color
19  * callback mechanism.
20  *
21  * See the comments at the start of src/gsncdummy.c for more information.
22  */
23 
24 #include "math_.h"
25 #include "memory_.h"
26 #include "gx.h"
27 #include "gscdefs.h"
28 #include "gsnamecl.h"
29 #include "malloc_.h"
30 #include "ghost.h"
31 #include "oper.h"
32 #include "gsncdummy.h"
33 
34 #if ENABLE_CUSTOM_COLOR_CALLBACK
35 
36 extern pantone_list_t pantone_list[];
37 extern client_custom_color_procs_t demo_procs;
38 
39 /*
40  * Demo version of the PANTONE call back parameter structure.
41  */
42 client_custom_color_params_t demo_callback = {
43     &demo_procs,
44     /*
45      * Use our 'list' of Pantone colors as an example data.
46      */
47     (void *)(&pantone_list)
48 };
49 
50 #endif 			/* ENABLE_CUSTOM_COLOR_CALLBACK */
51 
52 /*
53  * This procedure is here to simplify debugging.  Normally one would expect the
54  * custom color callback structure to be set up by a calling application.
55  * Since I do not have a calling application, I need a simple way to setup the
56  * callback parameter.  The callback parameter is passed as a string value.
57  * This routine puts the address of our demo callback structure into the
58  * provided string.
59  *
60  * This routine allows the demo version of the PANTONE logic to be enabled
61  * by adding the following to the command line:
62  *  -c "<< /CustomColorCallback 32 string .pantonecallback >> setsystemparams" -f
63  */
64 
65 /* <string> .pantonecallback <string> */
66 static int
zpantonecallback(i_ctx_t * i_ctx_p)67 zpantonecallback(i_ctx_t *i_ctx_p)
68 {
69 #if ENABLE_CUSTOM_COLOR_CALLBACK
70     os_ptr op = osp;
71     int val, idx, buf_pos = 3;
72     size_t iptr;
73 #define PTR_STRING_SIZE (2 * size_of(void *) + 3)
74 
75     /* Verify that the string size is big enough for our output */
76     check_type(*op, t_string);
77     check_write(*op);
78     if (r_size(op) < PTR_STRING_SIZE)
79 	return_error(e_rangecheck);
80 
81     /* Convert our call back parameter structure pointer into a string */
82     op->value.bytes[0] = '1';
83     op->value.bytes[1] = '6';
84     op->value.bytes[2] = '#';
85     iptr = (size_t)(&demo_callback);
86     for (idx = ((int)size_of(size_t)) * 8 - 4; idx >= 0; idx -= 4) {
87 	val = (int)(iptr >> idx) & 0xf;
88 	op->value.bytes[buf_pos++] = (byte)((val <= 9) ? '0' + val
89 						       : 'a' - 10 + val);
90     }
91     r_size(op) = PTR_STRING_SIZE;
92 #endif 			/* ENABLE_CUSTOM_COLOR_CALLBACK */
93     return 0;
94 }
95 
96 /* ------ Initialization procedure ------ */
97 
98 const op_def pantone_op_defs[] =
99 {
100     {"1.pantonecallback", zpantonecallback},
101     op_def_end(0)
102 };
103