xref: /plan9/sys/src/cmd/gs/src/scfparam.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1998 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: scfparam.c,v 1.5 2005/07/06 20:54:07 stefan Exp $ */
18 /* CCITTFax filter parameter setting and reading */
19 #include "std.h"
20 #include "gserror.h"
21 #include "gserrors.h"
22 #include "gstypes.h"
23 #include "gsmemory.h"
24 #include "gsparam.h"
25 #include "scommon.h"
26 #include "scf.h"		/* for cfe_max_width */
27 #include "scfx.h"
28 
29 /* Define the CCITTFax parameters. */
30 private const gs_param_item_t s_CF_param_items[] =
31 {
32 #define cfp(key, type, memb) { key, type, offset_of(stream_CF_state, memb) }
33     cfp("Uncompressed", gs_param_type_bool, Uncompressed),
34     cfp("K", gs_param_type_int, K),
35     cfp("EndOfLine", gs_param_type_bool, EndOfLine),
36     cfp("EncodedByteAlign", gs_param_type_bool, EncodedByteAlign),
37     cfp("Columns", gs_param_type_int, Columns),
38     cfp("Rows", gs_param_type_int, Rows),
39     cfp("EndOfBlock", gs_param_type_bool, EndOfBlock),
40     cfp("BlackIs1", gs_param_type_bool, BlackIs1),
41     cfp("DamagedRowsBeforeError", gs_param_type_int, DamagedRowsBeforeError),
42     cfp("FirstBitLowOrder", gs_param_type_bool, FirstBitLowOrder),
43     cfp("DecodedByteAlign", gs_param_type_int, DecodedByteAlign),
44 #undef cfp
45     gs_param_item_end
46 };
47 
48 /* Define a limit on the Rows parameter, was too low at 32000 */
49 #define cf_max_height 1000000
50 
51 /* Get non-default CCITTFax filter parameters. */
52 stream_state_proc_get_params(s_CF_get_params, stream_CF_state);		/* check */
53 int
s_CF_get_params(gs_param_list * plist,const stream_CF_state * ss,bool all)54 s_CF_get_params(gs_param_list * plist, const stream_CF_state * ss, bool all)
55 {
56     stream_CF_state cfs_defaults;
57     const stream_CF_state *defaults;
58 
59     if (all)
60 	defaults = 0;
61     else {
62 	s_CF_set_defaults_inline(&cfs_defaults);
63 	defaults = &cfs_defaults;
64     }
65     return gs_param_write_items(plist, ss, defaults, s_CF_param_items);
66 }
67 
68 /* Put CCITTFax filter parameters. */
69 stream_state_proc_put_params(s_CF_put_params, stream_CF_state);		/* check */
70 int
s_CF_put_params(gs_param_list * plist,stream_CF_state * ss)71 s_CF_put_params(gs_param_list * plist, stream_CF_state * ss)
72 {
73     stream_CF_state state;
74     int code;
75 
76     state = *ss;
77     code = gs_param_read_items(plist, (void *)&state, s_CF_param_items);
78     if (code >= 0 &&
79 	(state.K < -cf_max_height || state.K > cf_max_height ||
80 	 state.Columns < 0 || state.Columns > cfe_max_width ||
81 	 state.Rows < 0 || state.Rows > cf_max_height ||
82 	 state.DamagedRowsBeforeError < 0 ||
83 	 state.DamagedRowsBeforeError > cf_max_height ||
84 	 state.DecodedByteAlign < 1 || state.DecodedByteAlign > 16 ||
85 	 (state.DecodedByteAlign & (state.DecodedByteAlign - 1)) != 0)
86 	)
87 	code = gs_note_error(gs_error_rangecheck);
88     if (code >= 0)
89 	*ss = state;
90     return code;
91 }
92