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