xref: /plan9/sys/src/cmd/gs/src/gstrap.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 1998, 1999, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gstrap.c,v 1.6 2002/06/16 05:48:55 lpd Exp $ */
187dd7cddfSDavid du Colombier /* Setting trapping parameters and zones */
197dd7cddfSDavid du Colombier #include "string_.h"
207dd7cddfSDavid du Colombier #include "gx.h"
217dd7cddfSDavid du Colombier #include "gserrors.h"
227dd7cddfSDavid du Colombier #include "gstrap.h"
237dd7cddfSDavid du Colombier #include "gsparamx.h"
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier /* Put a float parameter. */
267dd7cddfSDavid du Colombier private bool
check_unit(float * pval)277dd7cddfSDavid du Colombier check_unit(float *pval)
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier     return (*pval >= 0 && *pval <= 1);
307dd7cddfSDavid du Colombier }
317dd7cddfSDavid du Colombier private bool
check_positive(float * pval)327dd7cddfSDavid du Colombier check_positive(float *pval)
337dd7cddfSDavid du Colombier {
347dd7cddfSDavid du Colombier     return (*pval > 0);
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier private int
trap_put_float_param(gs_param_list * plist,gs_param_name param_name,float * pval,bool (* check)(float * pval),int ecode)377dd7cddfSDavid du Colombier trap_put_float_param(gs_param_list * plist, gs_param_name param_name,
38*593dc095SDavid du Colombier 		     float *pval, bool(*check) (float *pval), int ecode)
397dd7cddfSDavid du Colombier {
407dd7cddfSDavid du Colombier     int code;
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier     switch (code = param_read_float(plist, param_name, pval)) {
437dd7cddfSDavid du Colombier 	case 0:
447dd7cddfSDavid du Colombier 	    if ((*check) (pval))
457dd7cddfSDavid du Colombier 		return 0;
467dd7cddfSDavid du Colombier 	    code = gs_error_rangecheck;
477dd7cddfSDavid du Colombier 	default:
487dd7cddfSDavid du Colombier 	    ecode = code;
497dd7cddfSDavid du Colombier 	    param_signal_error(plist, param_name, ecode);
507dd7cddfSDavid du Colombier 	    break;
517dd7cddfSDavid du Colombier 	case 1:
527dd7cddfSDavid du Colombier 	    break;
537dd7cddfSDavid du Colombier     }
547dd7cddfSDavid du Colombier     return ecode;
557dd7cddfSDavid du Colombier }
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier /* settrapparams */
587dd7cddfSDavid du Colombier int
gs_settrapparams(gs_trap_params_t * pparams,gs_param_list * plist)597dd7cddfSDavid du Colombier gs_settrapparams(gs_trap_params_t * pparams, gs_param_list * plist)
607dd7cddfSDavid du Colombier {
617dd7cddfSDavid du Colombier     gs_trap_params_t params;
627dd7cddfSDavid du Colombier     int ecode = 0;
637dd7cddfSDavid du Colombier     static const char *const trap_placement_names[] = {
647dd7cddfSDavid du Colombier 	gs_trap_placement_names, 0
657dd7cddfSDavid du Colombier     };
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier     params = *pparams;
687dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "BlackColorLimit",
697dd7cddfSDavid du Colombier 				 &params.BlackColorLimit, check_unit, ecode);
707dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "BlackDensityLimit",
717dd7cddfSDavid du Colombier 				 &params.BlackDensityLimit,
727dd7cddfSDavid du Colombier 				 check_positive, ecode);
737dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "BlackWidth",
747dd7cddfSDavid du Colombier 				 &params.BlackWidth, check_positive, ecode);
757dd7cddfSDavid du Colombier     ecode = param_put_bool(plist, "Enabled",
767dd7cddfSDavid du Colombier 			   &params.Enabled, ecode);
777dd7cddfSDavid du Colombier     ecode = param_put_bool(plist, "ImageInternalTrapping",
787dd7cddfSDavid du Colombier 			   &params.ImageInternalTrapping, ecode);
793ff48bf5SDavid du Colombier     ecode = param_put_bool(plist, "ImagemaskTrapping",
803ff48bf5SDavid du Colombier 			   &params.ImagemaskTrapping, ecode);
817dd7cddfSDavid du Colombier     ecode = param_put_int(plist, "ImageResolution",
827dd7cddfSDavid du Colombier 			  &params.ImageResolution, ecode);
837dd7cddfSDavid du Colombier     if (params.ImageResolution <= 0)
847dd7cddfSDavid du Colombier 	param_signal_error(plist, "ImageResolution",
857dd7cddfSDavid du Colombier 			   ecode = gs_error_rangecheck);
867dd7cddfSDavid du Colombier     ecode = param_put_bool(plist, "ImageToObjectTrapping",
877dd7cddfSDavid du Colombier 			   &params.ImageToObjectTrapping, ecode);
887dd7cddfSDavid du Colombier     {
897dd7cddfSDavid du Colombier 	int placement = params.ImageTrapPlacement;
907dd7cddfSDavid du Colombier 
917dd7cddfSDavid du Colombier 	ecode = param_put_enum(plist, "ImageTrapPlacement",
927dd7cddfSDavid du Colombier 			       &placement, trap_placement_names, ecode);
937dd7cddfSDavid du Colombier 	params.ImageTrapPlacement = placement;
947dd7cddfSDavid du Colombier     }
957dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "SlidingTrapLimit",
967dd7cddfSDavid du Colombier 				 &params.SlidingTrapLimit, check_unit, ecode);
977dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "StepLimit",
987dd7cddfSDavid du Colombier 				 &params.StepLimit, check_unit, ecode);
997dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "TrapColorScaling",
1007dd7cddfSDavid du Colombier 				 &params.TrapColorScaling, check_unit, ecode);
1017dd7cddfSDavid du Colombier     ecode = trap_put_float_param(plist, "TrapWidth",
1027dd7cddfSDavid du Colombier 				 &params.TrapWidth, check_positive, ecode);
1037dd7cddfSDavid du Colombier     if (ecode < 0)
1047dd7cddfSDavid du Colombier 	return ecode;
1057dd7cddfSDavid du Colombier     *pparams = params;
1067dd7cddfSDavid du Colombier     return 0;
1077dd7cddfSDavid du Colombier }
108