/src/ghostpdl/base/scfparam.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (C) 2001-2023 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., 39 Mesa Street, Suite 108A, San Francisco, |
13 | | CA 94129, USA, for further information. |
14 | | */ |
15 | | |
16 | | |
17 | | /* CCITTFax filter parameter setting and reading */ |
18 | | #include "std.h" |
19 | | #include "gserrors.h" |
20 | | #include "gstypes.h" |
21 | | #include "gsmemory.h" |
22 | | #include "gsparam.h" |
23 | | #include "scommon.h" |
24 | | #include "scf.h" /* for cfe_max_width */ |
25 | | #include "scfx.h" |
26 | | |
27 | | /* Define the CCITTFax parameters. */ |
28 | | static const gs_param_item_t s_CF_param_items[] = |
29 | | { |
30 | | #define cfp(key, type, memb) { key, type, offset_of(stream_CF_state, memb) } |
31 | | cfp("Uncompressed", gs_param_type_bool, Uncompressed), |
32 | | cfp("K", gs_param_type_int, K), |
33 | | cfp("EndOfLine", gs_param_type_bool, EndOfLine), |
34 | | cfp("EncodedByteAlign", gs_param_type_bool, EncodedByteAlign), |
35 | | cfp("Columns", gs_param_type_int, Columns), |
36 | | cfp("Rows", gs_param_type_int, Rows), |
37 | | cfp("EndOfBlock", gs_param_type_bool, EndOfBlock), |
38 | | cfp("ErrsAsEOD", gs_param_type_bool, ErrsAsEOD), |
39 | | cfp("BlackIs1", gs_param_type_bool, BlackIs1), |
40 | | cfp("DamagedRowsBeforeError", gs_param_type_int, DamagedRowsBeforeError), |
41 | | cfp("FirstBitLowOrder", gs_param_type_bool, FirstBitLowOrder), |
42 | | cfp("DecodedByteAlign", gs_param_type_int, DecodedByteAlign), |
43 | | #undef cfp |
44 | | gs_param_item_end |
45 | | }; |
46 | | |
47 | | /* Define a limit on the Rows parameter, was too low at 32000 */ |
48 | 2.88k | #define cf_max_height 1000000 |
49 | | |
50 | | /* Get non-default CCITTFax filter parameters. */ |
51 | | stream_state_proc_get_params(s_CF_get_params, stream_CF_state); /* check */ |
52 | | int |
53 | | s_CF_get_params(gs_param_list * plist, const stream_CF_state * ss, bool all) |
54 | 119k | { |
55 | 119k | stream_CF_state cfs_defaults; |
56 | 119k | const stream_CF_state *defaults; |
57 | | |
58 | 119k | if (all) |
59 | 0 | defaults = 0; |
60 | 119k | else { |
61 | 119k | s_CF_set_defaults_inline(&cfs_defaults); |
62 | 119k | defaults = &cfs_defaults; |
63 | 119k | } |
64 | 119k | return gs_param_write_items(plist, ss, defaults, s_CF_param_items); |
65 | 119k | } |
66 | | |
67 | | /* Put CCITTFax filter parameters. */ |
68 | | stream_state_proc_put_params(s_CF_put_params, stream_CF_state); /* check */ |
69 | | int |
70 | | s_CF_put_params(gs_param_list * plist, stream_CF_state * ss) |
71 | 361 | { |
72 | 361 | stream_CF_state state; |
73 | 361 | int code; |
74 | | |
75 | 361 | state = *ss; |
76 | 361 | code = gs_param_read_items(plist, (void *)&state, s_CF_param_items, NULL); |
77 | 361 | if (code >= 0 && |
78 | 361 | (state.K < -cf_max_height || state.K > cf_max_height || |
79 | 361 | state.Columns < 0 || state.Columns > cfe_max_width || |
80 | 361 | state.Rows < 0 || state.Rows > cf_max_height || |
81 | 361 | state.DamagedRowsBeforeError < 0 || |
82 | 361 | state.DamagedRowsBeforeError > cf_max_height || |
83 | 361 | state.DecodedByteAlign < 1 || state.DecodedByteAlign > 16 || |
84 | 361 | (state.DecodedByteAlign & (state.DecodedByteAlign - 1)) != 0) |
85 | 361 | ) |
86 | 0 | code = gs_note_error(gs_error_rangecheck); |
87 | 361 | if (code >= 0) |
88 | 361 | *ss = state; |
89 | 361 | return code; |
90 | 361 | } |