17dd7cddfSDavid du Colombier /* Copyright (C) 1994, 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: zfdecode.c,v 1.6 2004/03/13 22:31:19 ray Exp $ */
187dd7cddfSDavid du Colombier /* Additional decoding filter creation */
197dd7cddfSDavid du Colombier #include "memory_.h"
207dd7cddfSDavid du Colombier #include "ghost.h"
217dd7cddfSDavid du Colombier #include "oper.h"
227dd7cddfSDavid du Colombier #include "gsparam.h"
237dd7cddfSDavid du Colombier #include "gsstruct.h"
247dd7cddfSDavid du Colombier #include "ialloc.h"
257dd7cddfSDavid du Colombier #include "idict.h"
267dd7cddfSDavid du Colombier #include "idparam.h"
277dd7cddfSDavid du Colombier #include "ilevel.h" /* for LL3 test */
287dd7cddfSDavid du Colombier #include "iparam.h"
297dd7cddfSDavid du Colombier #include "store.h"
307dd7cddfSDavid du Colombier #include "stream.h" /* for setting is_temp */
317dd7cddfSDavid du Colombier #include "strimpl.h"
327dd7cddfSDavid du Colombier #include "sfilter.h"
337dd7cddfSDavid du Colombier #include "sa85x.h"
347dd7cddfSDavid du Colombier #include "scfx.h"
357dd7cddfSDavid du Colombier #include "scf.h"
367dd7cddfSDavid du Colombier #include "slzwx.h"
377dd7cddfSDavid du Colombier #include "spdiffx.h"
387dd7cddfSDavid du Colombier #include "spngpx.h"
397dd7cddfSDavid du Colombier #include "ifilter.h"
407dd7cddfSDavid du Colombier #include "ifilter2.h"
417dd7cddfSDavid du Colombier #include "ifrpred.h"
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier /* ------ ASCII85 filters ------ */
447dd7cddfSDavid du Colombier
457dd7cddfSDavid du Colombier /* We include both encoding and decoding filters here, */
467dd7cddfSDavid du Colombier /* because it would be a nuisance to separate them. */
477dd7cddfSDavid du Colombier
487dd7cddfSDavid du Colombier /* <target> ASCII85Encode/filter <file> */
497dd7cddfSDavid du Colombier /* <target> <dict> ASCII85Encode/filter <file> */
507dd7cddfSDavid du Colombier private int
zA85E(i_ctx_t * i_ctx_p)517dd7cddfSDavid du Colombier zA85E(i_ctx_t *i_ctx_p)
527dd7cddfSDavid du Colombier {
537dd7cddfSDavid du Colombier return filter_write_simple(i_ctx_p, &s_A85E_template);
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier /* <source> ASCII85Decode/filter <file> */
577dd7cddfSDavid du Colombier /* <source> <dict> ASCII85Decode/filter <file> */
587dd7cddfSDavid du Colombier private int
zA85D(i_ctx_t * i_ctx_p)597dd7cddfSDavid du Colombier zA85D(i_ctx_t *i_ctx_p)
607dd7cddfSDavid du Colombier {
617dd7cddfSDavid du Colombier return filter_read_simple(i_ctx_p, &s_A85D_template);
627dd7cddfSDavid du Colombier }
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier /* ------ CCITTFaxDecode filter ------ */
657dd7cddfSDavid du Colombier
667dd7cddfSDavid du Colombier /* Common setup for encoding and decoding filters. */
677dd7cddfSDavid du Colombier extern stream_state_proc_put_params(s_CF_put_params, stream_CF_state);
687dd7cddfSDavid du Colombier int
zcf_setup(os_ptr op,stream_CF_state * pcfs,gs_ref_memory_t * imem)697dd7cddfSDavid du Colombier zcf_setup(os_ptr op, stream_CF_state *pcfs, gs_ref_memory_t *imem)
707dd7cddfSDavid du Colombier {
717dd7cddfSDavid du Colombier dict_param_list list;
727dd7cddfSDavid du Colombier int code = dict_param_list_read(&list, op, NULL, false, imem);
737dd7cddfSDavid du Colombier
747dd7cddfSDavid du Colombier if (code < 0)
757dd7cddfSDavid du Colombier return code;
767dd7cddfSDavid du Colombier s_CF_set_defaults_inline(pcfs);
777dd7cddfSDavid du Colombier code = s_CF_put_params((gs_param_list *)&list, pcfs);
787dd7cddfSDavid du Colombier iparam_list_release(&list);
797dd7cddfSDavid du Colombier return code;
807dd7cddfSDavid du Colombier }
817dd7cddfSDavid du Colombier
827dd7cddfSDavid du Colombier /* <source> <dict> CCITTFaxDecode/filter <file> */
837dd7cddfSDavid du Colombier /* <source> CCITTFaxDecode/filter <file> */
847dd7cddfSDavid du Colombier private int
zCFD(i_ctx_t * i_ctx_p)857dd7cddfSDavid du Colombier zCFD(i_ctx_t *i_ctx_p)
867dd7cddfSDavid du Colombier {
877dd7cddfSDavid du Colombier os_ptr op = osp;
887dd7cddfSDavid du Colombier os_ptr dop;
897dd7cddfSDavid du Colombier stream_CFD_state cfs;
907dd7cddfSDavid du Colombier int code;
917dd7cddfSDavid du Colombier
927dd7cddfSDavid du Colombier if (r_has_type(op, t_dictionary)) {
937dd7cddfSDavid du Colombier check_dict_read(*op);
947dd7cddfSDavid du Colombier dop = op;
957dd7cddfSDavid du Colombier } else
967dd7cddfSDavid du Colombier dop = 0;
977dd7cddfSDavid du Colombier code = zcf_setup(dop, (stream_CF_state *)&cfs, iimemory);
987dd7cddfSDavid du Colombier if (code < 0)
997dd7cddfSDavid du Colombier return code;
1007dd7cddfSDavid du Colombier return filter_read(i_ctx_p, 0, &s_CFD_template, (stream_state *)&cfs, 0);
1017dd7cddfSDavid du Colombier }
1027dd7cddfSDavid du Colombier
1037dd7cddfSDavid du Colombier /* ------ Common setup for possibly pixel-oriented decoding filters ------ */
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier int
filter_read_predictor(i_ctx_t * i_ctx_p,int npop,const stream_template * template,stream_state * st)1067dd7cddfSDavid du Colombier filter_read_predictor(i_ctx_t *i_ctx_p, int npop,
1077dd7cddfSDavid du Colombier const stream_template * template, stream_state * st)
1087dd7cddfSDavid du Colombier {
1097dd7cddfSDavid du Colombier os_ptr op = osp;
1107dd7cddfSDavid du Colombier int predictor, code;
1117dd7cddfSDavid du Colombier stream_PDiff_state pds;
1127dd7cddfSDavid du Colombier stream_PNGP_state pps;
1137dd7cddfSDavid du Colombier
1147dd7cddfSDavid du Colombier if (r_has_type(op, t_dictionary)) {
1157dd7cddfSDavid du Colombier if ((code = dict_int_param(op, "Predictor", 0, 15, 1, &predictor)) < 0)
1167dd7cddfSDavid du Colombier return code;
1177dd7cddfSDavid du Colombier switch (predictor) {
1187dd7cddfSDavid du Colombier case 0: /* identity */
1197dd7cddfSDavid du Colombier predictor = 1;
1207dd7cddfSDavid du Colombier case 1: /* identity */
1217dd7cddfSDavid du Colombier break;
1227dd7cddfSDavid du Colombier case 2: /* componentwise horizontal differencing */
1237dd7cddfSDavid du Colombier code = zpd_setup(op, &pds);
1247dd7cddfSDavid du Colombier break;
1257dd7cddfSDavid du Colombier case 10:
1267dd7cddfSDavid du Colombier case 11:
1277dd7cddfSDavid du Colombier case 12:
1287dd7cddfSDavid du Colombier case 13:
1297dd7cddfSDavid du Colombier case 14:
1307dd7cddfSDavid du Colombier case 15:
1317dd7cddfSDavid du Colombier /* PNG prediction */
1327dd7cddfSDavid du Colombier code = zpp_setup(op, &pps);
1337dd7cddfSDavid du Colombier break;
1347dd7cddfSDavid du Colombier default:
1357dd7cddfSDavid du Colombier return_error(e_rangecheck);
1367dd7cddfSDavid du Colombier }
1377dd7cddfSDavid du Colombier if (code < 0)
1387dd7cddfSDavid du Colombier return code;
1397dd7cddfSDavid du Colombier } else
1407dd7cddfSDavid du Colombier predictor = 1;
1417dd7cddfSDavid du Colombier if (predictor == 1)
1427dd7cddfSDavid du Colombier return filter_read(i_ctx_p, npop, template, st, 0);
1437dd7cddfSDavid du Colombier {
1447dd7cddfSDavid du Colombier /* We need to cascade filters. */
1457dd7cddfSDavid du Colombier ref rsource, rdict;
1467dd7cddfSDavid du Colombier int code;
1477dd7cddfSDavid du Colombier
1487dd7cddfSDavid du Colombier /* Save the operands, just in case. */
1497dd7cddfSDavid du Colombier ref_assign(&rsource, op - 1);
1507dd7cddfSDavid du Colombier ref_assign(&rdict, op);
1517dd7cddfSDavid du Colombier code = filter_read(i_ctx_p, 1, template, st, 0);
1527dd7cddfSDavid du Colombier if (code < 0)
1537dd7cddfSDavid du Colombier return code;
1547dd7cddfSDavid du Colombier /* filter_read changed osp.... */
1557dd7cddfSDavid du Colombier op = osp;
1567dd7cddfSDavid du Colombier code =
1577dd7cddfSDavid du Colombier (predictor == 2 ?
1587dd7cddfSDavid du Colombier filter_read(i_ctx_p, 0, &s_PDiffD_template, (stream_state *) & pds, 0) :
1597dd7cddfSDavid du Colombier filter_read(i_ctx_p, 0, &s_PNGPD_template, (stream_state *) & pps, 0));
1607dd7cddfSDavid du Colombier if (code < 0) {
1617dd7cddfSDavid du Colombier /* Restore the operands. Don't bother trying to clean up */
1627dd7cddfSDavid du Colombier /* the first stream. */
1637dd7cddfSDavid du Colombier osp = ++op;
1647dd7cddfSDavid du Colombier ref_assign(op - 1, &rsource);
1657dd7cddfSDavid du Colombier ref_assign(op, &rdict);
1667dd7cddfSDavid du Colombier return code;
1677dd7cddfSDavid du Colombier }
1687dd7cddfSDavid du Colombier /*
1697dd7cddfSDavid du Colombier * Mark the compression stream as temporary, and propagate
1707dd7cddfSDavid du Colombier * CloseSource from it to the predictor stream.
1717dd7cddfSDavid du Colombier */
1727dd7cddfSDavid du Colombier filter_mark_strm_temp(op, 2);
1737dd7cddfSDavid du Colombier return code;
1747dd7cddfSDavid du Colombier }
1757dd7cddfSDavid du Colombier }
1767dd7cddfSDavid du Colombier
1777dd7cddfSDavid du Colombier /* ------ Generalized LZW/GIF decoding filter ------ */
1787dd7cddfSDavid du Colombier
1797dd7cddfSDavid du Colombier /* Common setup for encoding and decoding filters. */
1807dd7cddfSDavid du Colombier int
zlz_setup(os_ptr op,stream_LZW_state * plzs)1817dd7cddfSDavid du Colombier zlz_setup(os_ptr op, stream_LZW_state * plzs)
1827dd7cddfSDavid du Colombier {
1837dd7cddfSDavid du Colombier int code;
1847dd7cddfSDavid du Colombier const ref *dop;
1857dd7cddfSDavid du Colombier
1867dd7cddfSDavid du Colombier if (r_has_type(op, t_dictionary)) {
1877dd7cddfSDavid du Colombier check_dict_read(*op);
1887dd7cddfSDavid du Colombier dop = op;
1897dd7cddfSDavid du Colombier } else
1907dd7cddfSDavid du Colombier dop = 0;
1917dd7cddfSDavid du Colombier if ( (code = dict_int_param(dop, "EarlyChange", 0, 1, 1,
1927dd7cddfSDavid du Colombier &plzs->EarlyChange)) < 0 ||
1937dd7cddfSDavid du Colombier /*
1947dd7cddfSDavid du Colombier * The following are not PostScript standard, although
1957dd7cddfSDavid du Colombier * LanguageLevel 3 provides the first two under different
1967dd7cddfSDavid du Colombier * names.
1977dd7cddfSDavid du Colombier */
1987dd7cddfSDavid du Colombier (code = dict_int_param(dop, "InitialCodeLength", 2, 11, 8,
1997dd7cddfSDavid du Colombier &plzs->InitialCodeLength)) < 0 ||
2007dd7cddfSDavid du Colombier (code = dict_bool_param(dop, "FirstBitLowOrder", false,
2017dd7cddfSDavid du Colombier &plzs->FirstBitLowOrder)) < 0 ||
2027dd7cddfSDavid du Colombier (code = dict_bool_param(dop, "BlockData", false,
2037dd7cddfSDavid du Colombier &plzs->BlockData)) < 0
2047dd7cddfSDavid du Colombier )
2057dd7cddfSDavid du Colombier return code;
2067dd7cddfSDavid du Colombier return 0;
2077dd7cddfSDavid du Colombier }
2087dd7cddfSDavid du Colombier
2097dd7cddfSDavid du Colombier /* <source> LZWDecode/filter <file> */
2107dd7cddfSDavid du Colombier /* <source> <dict> LZWDecode/filter <file> */
2117dd7cddfSDavid du Colombier private int
zLZWD(i_ctx_t * i_ctx_p)2127dd7cddfSDavid du Colombier zLZWD(i_ctx_t *i_ctx_p)
2137dd7cddfSDavid du Colombier {
2147dd7cddfSDavid du Colombier os_ptr op = osp;
2157dd7cddfSDavid du Colombier stream_LZW_state lzs;
2167dd7cddfSDavid du Colombier int code = zlz_setup(op, &lzs);
2177dd7cddfSDavid du Colombier
2187dd7cddfSDavid du Colombier if (code < 0)
2197dd7cddfSDavid du Colombier return code;
2207dd7cddfSDavid du Colombier if (LL3_ENABLED && r_has_type(op, t_dictionary)) {
2217dd7cddfSDavid du Colombier int unit_size;
2227dd7cddfSDavid du Colombier
2237dd7cddfSDavid du Colombier if ((code = dict_bool_param(op, "LowBitFirst", lzs.FirstBitLowOrder,
2247dd7cddfSDavid du Colombier &lzs.FirstBitLowOrder)) < 0 ||
2257dd7cddfSDavid du Colombier (code = dict_int_param(op, "UnitSize", 3, 8, 8,
2267dd7cddfSDavid du Colombier &unit_size)) < 0
2277dd7cddfSDavid du Colombier )
2287dd7cddfSDavid du Colombier return code;
2297dd7cddfSDavid du Colombier if (code == 0 /* UnitSize specified */ )
2307dd7cddfSDavid du Colombier lzs.InitialCodeLength = unit_size + 1;
2317dd7cddfSDavid du Colombier }
2327dd7cddfSDavid du Colombier return filter_read_predictor(i_ctx_p, 0, &s_LZWD_template,
2337dd7cddfSDavid du Colombier (stream_state *) & lzs);
2347dd7cddfSDavid du Colombier }
2357dd7cddfSDavid du Colombier
2367dd7cddfSDavid du Colombier /* ------ Color differencing filters ------ */
2377dd7cddfSDavid du Colombier
2387dd7cddfSDavid du Colombier /* We include both encoding and decoding filters here, */
2397dd7cddfSDavid du Colombier /* because it would be a nuisance to separate them. */
2407dd7cddfSDavid du Colombier
2417dd7cddfSDavid du Colombier /* Common setup for encoding and decoding filters. */
2427dd7cddfSDavid du Colombier int
zpd_setup(os_ptr op,stream_PDiff_state * ppds)2437dd7cddfSDavid du Colombier zpd_setup(os_ptr op, stream_PDiff_state * ppds)
2447dd7cddfSDavid du Colombier {
2457dd7cddfSDavid du Colombier int code, bpc;
2467dd7cddfSDavid du Colombier
2477dd7cddfSDavid du Colombier check_type(*op, t_dictionary);
2487dd7cddfSDavid du Colombier check_dict_read(*op);
2497dd7cddfSDavid du Colombier if ((code = dict_int_param(op, "Colors", 1, s_PDiff_max_Colors, 1,
2507dd7cddfSDavid du Colombier &ppds->Colors)) < 0 ||
251*593dc095SDavid du Colombier (code = dict_int_param(op, "BitsPerComponent", 1, 16, 8,
2527dd7cddfSDavid du Colombier &bpc)) < 0 ||
2537dd7cddfSDavid du Colombier (bpc & (bpc - 1)) != 0 ||
2547dd7cddfSDavid du Colombier (code = dict_int_param(op, "Columns", 1, max_int, 1,
2557dd7cddfSDavid du Colombier &ppds->Columns)) < 0
2567dd7cddfSDavid du Colombier )
2577dd7cddfSDavid du Colombier return (code < 0 ? code : gs_note_error(e_rangecheck));
2587dd7cddfSDavid du Colombier ppds->BitsPerComponent = bpc;
2597dd7cddfSDavid du Colombier return 0;
2607dd7cddfSDavid du Colombier }
2617dd7cddfSDavid du Colombier
2627dd7cddfSDavid du Colombier /* <target> <dict> PixelDifferenceEncode/filter <file> */
2637dd7cddfSDavid du Colombier private int
zPDiffE(i_ctx_t * i_ctx_p)2647dd7cddfSDavid du Colombier zPDiffE(i_ctx_t *i_ctx_p)
2657dd7cddfSDavid du Colombier {
2667dd7cddfSDavid du Colombier os_ptr op = osp;
2677dd7cddfSDavid du Colombier stream_PDiff_state pds;
2687dd7cddfSDavid du Colombier int code = zpd_setup(op, &pds);
2697dd7cddfSDavid du Colombier
2707dd7cddfSDavid du Colombier if (code < 0)
2717dd7cddfSDavid du Colombier return code;
2727dd7cddfSDavid du Colombier return filter_write(i_ctx_p, 0, &s_PDiffE_template, (stream_state *) & pds, 0);
2737dd7cddfSDavid du Colombier }
2747dd7cddfSDavid du Colombier
2757dd7cddfSDavid du Colombier /* <source> <dict> PixelDifferenceDecode/filter <file> */
2767dd7cddfSDavid du Colombier private int
zPDiffD(i_ctx_t * i_ctx_p)2777dd7cddfSDavid du Colombier zPDiffD(i_ctx_t *i_ctx_p)
2787dd7cddfSDavid du Colombier {
2797dd7cddfSDavid du Colombier os_ptr op = osp;
2807dd7cddfSDavid du Colombier stream_PDiff_state pds;
2817dd7cddfSDavid du Colombier int code = zpd_setup(op, &pds);
2827dd7cddfSDavid du Colombier
2837dd7cddfSDavid du Colombier if (code < 0)
2847dd7cddfSDavid du Colombier return code;
2857dd7cddfSDavid du Colombier return filter_read(i_ctx_p, 0, &s_PDiffD_template, (stream_state *) & pds, 0);
2867dd7cddfSDavid du Colombier }
2877dd7cddfSDavid du Colombier
2887dd7cddfSDavid du Colombier /* ------ PNG pixel predictor filters ------ */
2897dd7cddfSDavid du Colombier
2907dd7cddfSDavid du Colombier /* Common setup for encoding and decoding filters. */
2917dd7cddfSDavid du Colombier int
zpp_setup(os_ptr op,stream_PNGP_state * ppps)2927dd7cddfSDavid du Colombier zpp_setup(os_ptr op, stream_PNGP_state * ppps)
2937dd7cddfSDavid du Colombier {
2947dd7cddfSDavid du Colombier int code, bpc;
2957dd7cddfSDavid du Colombier
2967dd7cddfSDavid du Colombier check_type(*op, t_dictionary);
2977dd7cddfSDavid du Colombier check_dict_read(*op);
2987dd7cddfSDavid du Colombier if ((code = dict_int_param(op, "Colors", 1, 16, 1,
2997dd7cddfSDavid du Colombier &ppps->Colors)) < 0 ||
3007dd7cddfSDavid du Colombier (code = dict_int_param(op, "BitsPerComponent", 1, 16, 8,
3017dd7cddfSDavid du Colombier &bpc)) < 0 ||
3027dd7cddfSDavid du Colombier (bpc & (bpc - 1)) != 0 ||
3037dd7cddfSDavid du Colombier (code = dict_uint_param(op, "Columns", 1, max_uint, 1,
3047dd7cddfSDavid du Colombier &ppps->Columns)) < 0 ||
3057dd7cddfSDavid du Colombier (code = dict_int_param(op, "Predictor", 10, 15, 15,
3067dd7cddfSDavid du Colombier &ppps->Predictor)) < 0
3077dd7cddfSDavid du Colombier )
3087dd7cddfSDavid du Colombier return (code < 0 ? code : gs_note_error(e_rangecheck));
3097dd7cddfSDavid du Colombier ppps->BitsPerComponent = bpc;
3107dd7cddfSDavid du Colombier return 0;
3117dd7cddfSDavid du Colombier }
3127dd7cddfSDavid du Colombier
3137dd7cddfSDavid du Colombier /* <target> <dict> PNGPredictorEncode/filter <file> */
3147dd7cddfSDavid du Colombier private int
zPNGPE(i_ctx_t * i_ctx_p)3157dd7cddfSDavid du Colombier zPNGPE(i_ctx_t *i_ctx_p)
3167dd7cddfSDavid du Colombier {
3177dd7cddfSDavid du Colombier os_ptr op = osp;
3187dd7cddfSDavid du Colombier stream_PNGP_state pps;
3197dd7cddfSDavid du Colombier int code = zpp_setup(op, &pps);
3207dd7cddfSDavid du Colombier
3217dd7cddfSDavid du Colombier if (code < 0)
3227dd7cddfSDavid du Colombier return code;
3237dd7cddfSDavid du Colombier return filter_write(i_ctx_p, 0, &s_PNGPE_template, (stream_state *) & pps, 0);
3247dd7cddfSDavid du Colombier }
3257dd7cddfSDavid du Colombier
3267dd7cddfSDavid du Colombier /* <source> <dict> PNGPredictorDecode/filter <file> */
3277dd7cddfSDavid du Colombier private int
zPNGPD(i_ctx_t * i_ctx_p)3287dd7cddfSDavid du Colombier zPNGPD(i_ctx_t *i_ctx_p)
3297dd7cddfSDavid du Colombier {
3307dd7cddfSDavid du Colombier os_ptr op = osp;
3317dd7cddfSDavid du Colombier stream_PNGP_state pps;
3327dd7cddfSDavid du Colombier int code = zpp_setup(op, &pps);
3337dd7cddfSDavid du Colombier
3347dd7cddfSDavid du Colombier if (code < 0)
3357dd7cddfSDavid du Colombier return code;
3367dd7cddfSDavid du Colombier return filter_read(i_ctx_p, 0, &s_PNGPD_template, (stream_state *) & pps, 0);
3377dd7cddfSDavid du Colombier }
3387dd7cddfSDavid du Colombier
3397dd7cddfSDavid du Colombier /* ---------------- Initialization procedure ---------------- */
3407dd7cddfSDavid du Colombier
3417dd7cddfSDavid du Colombier const op_def zfdecode_op_defs[] = {
3427dd7cddfSDavid du Colombier op_def_begin_filter(),
3437dd7cddfSDavid du Colombier {"1ASCII85Encode", zA85E},
3447dd7cddfSDavid du Colombier {"1ASCII85Decode", zA85D},
3457dd7cddfSDavid du Colombier {"2CCITTFaxDecode", zCFD},
3467dd7cddfSDavid du Colombier {"1LZWDecode", zLZWD},
3477dd7cddfSDavid du Colombier {"2PixelDifferenceDecode", zPDiffD},
3487dd7cddfSDavid du Colombier {"2PixelDifferenceEncode", zPDiffE},
3497dd7cddfSDavid du Colombier {"2PNGPredictorDecode", zPNGPD},
3507dd7cddfSDavid du Colombier {"2PNGPredictorEncode", zPNGPE},
3517dd7cddfSDavid du Colombier op_def_end(0)
3527dd7cddfSDavid du Colombier };
353