1 /* Copyright (C) 2001-2006 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 
14 /* $Id: gstrap.c 8250 2007-09-25 13:31:24Z giles $ */
15 /* Setting trapping parameters and zones */
16 #include "string_.h"
17 #include "gx.h"
18 #include "gserrors.h"
19 #include "gstrap.h"
20 #include "gsparamx.h"
21 
22 /* Put a float parameter. */
23 static bool
check_unit(float * pval)24 check_unit(float *pval)
25 {
26     return (*pval >= 0 && *pval <= 1);
27 }
28 static bool
check_positive(float * pval)29 check_positive(float *pval)
30 {
31     return (*pval > 0);
32 }
33 static int
trap_put_float_param(gs_param_list * plist,gs_param_name param_name,float * pval,bool (* check)(float * pval),int ecode)34 trap_put_float_param(gs_param_list * plist, gs_param_name param_name,
35 		     float *pval, bool(*check) (float *pval), int ecode)
36 {
37     int code;
38 
39     switch (code = param_read_float(plist, param_name, pval)) {
40 	case 0:
41 	    if ((*check) (pval))
42 		return 0;
43 	    code = gs_error_rangecheck;
44 	default:
45 	    ecode = code;
46 	    param_signal_error(plist, param_name, ecode);
47 	    break;
48 	case 1:
49 	    break;
50     }
51     return ecode;
52 }
53 
54 /* settrapparams */
55 int
gs_settrapparams(gs_trap_params_t * pparams,gs_param_list * plist)56 gs_settrapparams(gs_trap_params_t * pparams, gs_param_list * plist)
57 {
58     gs_trap_params_t params;
59     int ecode = 0;
60     static const char *const trap_placement_names[] = {
61 	gs_trap_placement_names, 0
62     };
63 
64     params = *pparams;
65     ecode = trap_put_float_param(plist, "BlackColorLimit",
66 				 &params.BlackColorLimit, check_unit, ecode);
67     ecode = trap_put_float_param(plist, "BlackDensityLimit",
68 				 &params.BlackDensityLimit,
69 				 check_positive, ecode);
70     ecode = trap_put_float_param(plist, "BlackWidth",
71 				 &params.BlackWidth, check_positive, ecode);
72     ecode = param_put_bool(plist, "Enabled",
73 			   &params.Enabled, ecode);
74     ecode = param_put_bool(plist, "ImageInternalTrapping",
75 			   &params.ImageInternalTrapping, ecode);
76     ecode = param_put_bool(plist, "ImagemaskTrapping",
77 			   &params.ImagemaskTrapping, ecode);
78     ecode = param_put_int(plist, "ImageResolution",
79 			  &params.ImageResolution, ecode);
80     if (params.ImageResolution <= 0)
81 	param_signal_error(plist, "ImageResolution",
82 			   ecode = gs_error_rangecheck);
83     ecode = param_put_bool(plist, "ImageToObjectTrapping",
84 			   &params.ImageToObjectTrapping, ecode);
85     {
86 	int placement = params.ImageTrapPlacement;
87 
88 	ecode = param_put_enum(plist, "ImageTrapPlacement",
89 			       &placement, trap_placement_names, ecode);
90 	params.ImageTrapPlacement = placement;
91     }
92     ecode = trap_put_float_param(plist, "SlidingTrapLimit",
93 				 &params.SlidingTrapLimit, check_unit, ecode);
94     ecode = trap_put_float_param(plist, "StepLimit",
95 				 &params.StepLimit, check_unit, ecode);
96     ecode = trap_put_float_param(plist, "TrapColorScaling",
97 				 &params.TrapColorScaling, check_unit, ecode);
98     ecode = trap_put_float_param(plist, "TrapWidth",
99 				 &params.TrapWidth, check_positive, ecode);
100     if (ecode < 0)
101 	return ecode;
102     *pparams = params;
103     return 0;
104 }
105