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 ¶ms.BlackColorLimit, check_unit, ecode);
67 ecode = trap_put_float_param(plist, "BlackDensityLimit",
68 ¶ms.BlackDensityLimit,
69 check_positive, ecode);
70 ecode = trap_put_float_param(plist, "BlackWidth",
71 ¶ms.BlackWidth, check_positive, ecode);
72 ecode = param_put_bool(plist, "Enabled",
73 ¶ms.Enabled, ecode);
74 ecode = param_put_bool(plist, "ImageInternalTrapping",
75 ¶ms.ImageInternalTrapping, ecode);
76 ecode = param_put_bool(plist, "ImagemaskTrapping",
77 ¶ms.ImagemaskTrapping, ecode);
78 ecode = param_put_int(plist, "ImageResolution",
79 ¶ms.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 ¶ms.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 ¶ms.SlidingTrapLimit, check_unit, ecode);
94 ecode = trap_put_float_param(plist, "StepLimit",
95 ¶ms.StepLimit, check_unit, ecode);
96 ecode = trap_put_float_param(plist, "TrapColorScaling",
97 ¶ms.TrapColorScaling, check_unit, ecode);
98 ecode = trap_put_float_param(plist, "TrapWidth",
99 ¶ms.TrapWidth, check_positive, ecode);
100 if (ecode < 0)
101 return ecode;
102 *pparams = params;
103 return 0;
104 }
105