1 /* Copyright (C) 2001-2012 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,
8 modified or distributed except as expressly authorized under the terms
9 of the license contained in the file LICENSE in this distribution.
10
11 Refer to licensing information at http://www.artifex.com or contact
12 Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
13 CA 94903, U.S.A., +1(415)492-9861, for further information.
14 */
15
16
17 /* Setting trapping parameters and zones */
18 #include "string_.h"
19 #include "gx.h"
20 #include "gserrors.h"
21 #include "gstrap.h"
22 #include "gsparamx.h"
23
24 /* Put a float parameter. */
25 static bool
check_unit(float * pval)26 check_unit(float *pval)
27 {
28 return (*pval >= 0 && *pval <= 1);
29 }
30 static bool
check_positive(float * pval)31 check_positive(float *pval)
32 {
33 return (*pval > 0);
34 }
35 static int
trap_put_float_param(gs_param_list * plist,gs_param_name param_name,float * pval,bool (* check)(float * pval),int ecode)36 trap_put_float_param(gs_param_list * plist, gs_param_name param_name,
37 float *pval, bool(*check) (float *pval), int ecode)
38 {
39 int code;
40
41 switch (code = param_read_float(plist, param_name, pval)) {
42 case 0:
43 if ((*check) (pval))
44 return 0;
45 code = gs_error_rangecheck;
46 default:
47 ecode = code;
48 param_signal_error(plist, param_name, ecode);
49 break;
50 case 1:
51 break;
52 }
53 return ecode;
54 }
55
56 /* settrapparams */
57 int
gs_settrapparams(gs_trap_params_t * pparams,gs_param_list * plist)58 gs_settrapparams(gs_trap_params_t * pparams, gs_param_list * plist)
59 {
60 gs_trap_params_t params;
61 int ecode = 0;
62 static const char *const trap_placement_names[] = {
63 gs_trap_placement_names, 0
64 };
65
66 params = *pparams;
67 ecode = trap_put_float_param(plist, "BlackColorLimit",
68 ¶ms.BlackColorLimit, check_unit, ecode);
69 ecode = trap_put_float_param(plist, "BlackDensityLimit",
70 ¶ms.BlackDensityLimit,
71 check_positive, ecode);
72 ecode = trap_put_float_param(plist, "BlackWidth",
73 ¶ms.BlackWidth, check_positive, ecode);
74 ecode = param_put_bool(plist, "Enabled",
75 ¶ms.Enabled, ecode);
76 ecode = param_put_bool(plist, "ImageInternalTrapping",
77 ¶ms.ImageInternalTrapping, ecode);
78 ecode = param_put_bool(plist, "ImagemaskTrapping",
79 ¶ms.ImagemaskTrapping, ecode);
80 ecode = param_put_int(plist, "ImageResolution",
81 ¶ms.ImageResolution, ecode);
82 if (params.ImageResolution <= 0)
83 param_signal_error(plist, "ImageResolution",
84 ecode = gs_error_rangecheck);
85 ecode = param_put_bool(plist, "ImageToObjectTrapping",
86 ¶ms.ImageToObjectTrapping, ecode);
87 {
88 int placement = params.ImageTrapPlacement;
89
90 ecode = param_put_enum(plist, "ImageTrapPlacement",
91 &placement, trap_placement_names, ecode);
92 params.ImageTrapPlacement = placement;
93 }
94 ecode = trap_put_float_param(plist, "SlidingTrapLimit",
95 ¶ms.SlidingTrapLimit, check_unit, ecode);
96 ecode = trap_put_float_param(plist, "StepLimit",
97 ¶ms.StepLimit, check_unit, ecode);
98 ecode = trap_put_float_param(plist, "TrapColorScaling",
99 ¶ms.TrapColorScaling, check_unit, ecode);
100 ecode = trap_put_float_param(plist, "TrapWidth",
101 ¶ms.TrapWidth, check_positive, ecode);
102 if (ecode < 0)
103 return ecode;
104 *pparams = params;
105 return 0;
106 }
107