13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 1998, 1999 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: gdevpsdp.c,v 1.14 2004/06/30 14:35:37 igor Exp $ */
187dd7cddfSDavid du Colombier /* (Distiller) parameter handling for PostScript and PDF writers */
197dd7cddfSDavid du Colombier #include "string_.h"
207dd7cddfSDavid du Colombier #include "jpeglib_.h" /* for sdct.h */
217dd7cddfSDavid du Colombier #include "gx.h"
227dd7cddfSDavid du Colombier #include "gserrors.h"
237dd7cddfSDavid du Colombier #include "gsutil.h"
247dd7cddfSDavid du Colombier #include "gxdevice.h"
257dd7cddfSDavid du Colombier #include "gsparamx.h"
267dd7cddfSDavid du Colombier #include "gdevpsdf.h"
277dd7cddfSDavid du Colombier #include "strimpl.h" /* for short-sighted compilers */
287dd7cddfSDavid du Colombier #include "scfx.h"
297dd7cddfSDavid du Colombier #include "sdct.h"
307dd7cddfSDavid du Colombier #include "slzwx.h"
317dd7cddfSDavid du Colombier #include "spprint.h"
327dd7cddfSDavid du Colombier #include "srlx.h"
337dd7cddfSDavid du Colombier #include "szlibx.h"
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier /* Define a (bogus) GC descriptor for gs_param_string. */
367dd7cddfSDavid du Colombier /* The only ones we use are GC-able and not persistent. */
377dd7cddfSDavid du Colombier gs_private_st_composite(st_gs_param_string, gs_param_string, "gs_param_string",
387dd7cddfSDavid du Colombier param_string_enum_ptrs, param_string_reloc_ptrs);
397dd7cddfSDavid du Colombier private
407dd7cddfSDavid du Colombier ENUM_PTRS_WITH(param_string_enum_ptrs, gs_param_string *pstr) return 0;
417dd7cddfSDavid du Colombier case 0: return ENUM_CONST_STRING(pstr);
427dd7cddfSDavid du Colombier ENUM_PTRS_END
437dd7cddfSDavid du Colombier private
RELOC_PTRS_WITH(param_string_reloc_ptrs,gs_param_string * pstr)447dd7cddfSDavid du Colombier RELOC_PTRS_WITH(param_string_reloc_ptrs, gs_param_string *pstr)
457dd7cddfSDavid du Colombier {
467dd7cddfSDavid du Colombier gs_const_string str;
477dd7cddfSDavid du Colombier
487dd7cddfSDavid du Colombier str.data = pstr->data, str.size = pstr->size;
497dd7cddfSDavid du Colombier RELOC_CONST_STRING_VAR(str);
507dd7cddfSDavid du Colombier pstr->data = str.data;
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier RELOC_PTRS_END
537dd7cddfSDavid du Colombier gs_private_st_element(st_param_string_element, gs_param_string,
547dd7cddfSDavid du Colombier "gs_param_string[]", param_string_elt_enum_ptrs,
557dd7cddfSDavid du Colombier param_string_elt_reloc_ptrs, st_gs_param_string);
567dd7cddfSDavid du Colombier
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier /* ---------------- Get/put Distiller parameters ---------------- */
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier /*
617dd7cddfSDavid du Colombier * ColorConversionStrategy is supposed to affect output color space
627dd7cddfSDavid du Colombier * according to the following table. ****** NOT IMPLEMENTED YET ******
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier PS Input: LeaveCU UseDIC UseDICFI sRGB
657dd7cddfSDavid du Colombier Gray art Gray CalGray/ICCBased Gray Gray
667dd7cddfSDavid du Colombier Gray image Gray CalGray/ICCBased CalGray/ICCBased Gray
677dd7cddfSDavid du Colombier RGB art RGB CalGray/ICCBased RGB CalRGB/sRGB
687dd7cddfSDavid du Colombier RGB image RGB CalGray/ICCBased CalRGB/ICCBased CalRGB/sRGB
697dd7cddfSDavid du Colombier CMYK art CMYK LAB/ICCBased CMYK CalRGB/sRGB
707dd7cddfSDavid du Colombier CMYK image CMYK LAB/ICCBased LAB/ICCBased CalRGB/sRGB
717dd7cddfSDavid du Colombier CIE art Cal/ICC Cal/ICC Cal/ICC CalRGB/sRGB
727dd7cddfSDavid du Colombier CIE image Cal/ICC Cal/ICC Cal/ICC CalRGB/sRGB
737dd7cddfSDavid du Colombier
747dd7cddfSDavid du Colombier */
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier /*
777dd7cddfSDavid du Colombier * The Always/NeverEmbed parameters are defined as being incremental. Since
787dd7cddfSDavid du Colombier * this isn't compatible with the general property of page devices that if
793ff48bf5SDavid du Colombier * you do a currentpagedevice, doing a setpagedevice later will restore the
803ff48bf5SDavid du Colombier * same state, we actually define the parameters in sets of 3:
817dd7cddfSDavid du Colombier * - AlwaysEmbed is used for incremental additions.
827dd7cddfSDavid du Colombier * - ~AlwaysEmbed is used for incremental deletions.
837dd7cddfSDavid du Colombier * - .AlwaysEmbed is used for the complete list.
847dd7cddfSDavid du Colombier * and analogously for NeverEmbed.
857dd7cddfSDavid du Colombier */
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier typedef struct psdf_image_filter_name_s {
887dd7cddfSDavid du Colombier const char *pname;
897dd7cddfSDavid du Colombier const stream_template *template;
907dd7cddfSDavid du Colombier psdf_version min_version;
917dd7cddfSDavid du Colombier } psdf_image_filter_name;
923ff48bf5SDavid du Colombier
937dd7cddfSDavid du Colombier private const psdf_image_filter_name Poly_filters[] = {
947dd7cddfSDavid du Colombier {"DCTEncode", &s_DCTE_template},
957dd7cddfSDavid du Colombier {"FlateEncode", &s_zlibE_template, psdf_version_ll3},
967dd7cddfSDavid du Colombier {"LZWEncode", &s_LZWE_template},
977dd7cddfSDavid du Colombier {0, 0}
987dd7cddfSDavid du Colombier };
993ff48bf5SDavid du Colombier
1007dd7cddfSDavid du Colombier private const psdf_image_filter_name Mono_filters[] = {
1017dd7cddfSDavid du Colombier {"CCITTFaxEncode", &s_CFE_template},
1027dd7cddfSDavid du Colombier {"FlateEncode", &s_zlibE_template, psdf_version_ll3},
1037dd7cddfSDavid du Colombier {"LZWEncode", &s_LZWE_template},
1047dd7cddfSDavid du Colombier {"RunLengthEncode", &s_RLE_template},
1057dd7cddfSDavid du Colombier {0, 0}
1067dd7cddfSDavid du Colombier };
1073ff48bf5SDavid du Colombier
1083ff48bf5SDavid du Colombier typedef struct psdf_image_param_names_s {
1093ff48bf5SDavid du Colombier const char *ACSDict; /* not used for mono */
1103ff48bf5SDavid du Colombier const char *Dict;
1113ff48bf5SDavid du Colombier const char *DownsampleType;
1123ff48bf5SDavid du Colombier float DownsampleThreshold_default;
1133ff48bf5SDavid du Colombier const psdf_image_filter_name *filter_names;
1143ff48bf5SDavid du Colombier const char *Filter;
1153ff48bf5SDavid du Colombier gs_param_item_t items[8]; /* AutoFilter (not used for mono), */
1163ff48bf5SDavid du Colombier /* AntiAlias, */
1173ff48bf5SDavid du Colombier /* Depth, Downsample, DownsampleThreshold, */
1183ff48bf5SDavid du Colombier /* Encode, Resolution, end marker */
1193ff48bf5SDavid du Colombier } psdf_image_param_names_t;
1203ff48bf5SDavid du Colombier #define pi(key, type, memb) { key, type, offset_of(psdf_image_params, memb) }
1213ff48bf5SDavid du Colombier #define psdf_image_param_names(acs, aa, af, de, di, ds, dt, dst, dstd, e, f, fns, r)\
1223ff48bf5SDavid du Colombier acs, di, dt, dstd, fns, f, {\
1233ff48bf5SDavid du Colombier pi(af, gs_param_type_bool, AutoFilter),\
1243ff48bf5SDavid du Colombier pi(aa, gs_param_type_bool, AntiAlias),\
1253ff48bf5SDavid du Colombier pi(de, gs_param_type_int, Depth),\
1263ff48bf5SDavid du Colombier pi(ds, gs_param_type_bool, Downsample),\
1273ff48bf5SDavid du Colombier pi(dst, gs_param_type_float, DownsampleThreshold),\
1283ff48bf5SDavid du Colombier pi(e, gs_param_type_bool, Encode),\
1293ff48bf5SDavid du Colombier pi(r, gs_param_type_int, Resolution),\
1303ff48bf5SDavid du Colombier gs_param_item_end\
1313ff48bf5SDavid du Colombier }
1323ff48bf5SDavid du Colombier
1333ff48bf5SDavid du Colombier private const psdf_image_param_names_t Color_names = {
1343ff48bf5SDavid du Colombier psdf_image_param_names(
1353ff48bf5SDavid du Colombier "ColorACSImageDict", "AntiAliasColorImages", "AutoFilterColorImages",
1363ff48bf5SDavid du Colombier "ColorImageDepth", "ColorImageDict",
1373ff48bf5SDavid du Colombier "DownsampleColorImages", "ColorImageDownsampleType",
1383ff48bf5SDavid du Colombier "ColorImageDownsampleThreshold", 1.5,
1393ff48bf5SDavid du Colombier "EncodeColorImages", "ColorImageFilter", Poly_filters,
1403ff48bf5SDavid du Colombier "ColorImageResolution"
1413ff48bf5SDavid du Colombier )
1423ff48bf5SDavid du Colombier };
1433ff48bf5SDavid du Colombier private const psdf_image_param_names_t Gray_names = {
1443ff48bf5SDavid du Colombier psdf_image_param_names(
1453ff48bf5SDavid du Colombier "GrayACSImageDict", "AntiAliasGrayImages", "AutoFilterGrayImages",
1463ff48bf5SDavid du Colombier "GrayImageDepth", "GrayImageDict",
1473ff48bf5SDavid du Colombier "DownsampleGrayImages", "GrayImageDownsampleType",
1483ff48bf5SDavid du Colombier "GrayImageDownsampleThreshold", 2.0,
1493ff48bf5SDavid du Colombier "EncodeGrayImages", "GrayImageFilter", Poly_filters,
1503ff48bf5SDavid du Colombier "GrayImageResolution"
1513ff48bf5SDavid du Colombier )
1523ff48bf5SDavid du Colombier };
1533ff48bf5SDavid du Colombier private const psdf_image_param_names_t Mono_names = {
1543ff48bf5SDavid du Colombier psdf_image_param_names(
1553ff48bf5SDavid du Colombier 0, "AntiAliasMonoImages", 0,
1563ff48bf5SDavid du Colombier "MonoImageDepth", "MonoImageDict",
1573ff48bf5SDavid du Colombier "DownsampleMonoImages", "MonoImageDownsampleType",
1583ff48bf5SDavid du Colombier "MonoImageDownsampleThreshold", 2.0,
1593ff48bf5SDavid du Colombier "EncodeMonoImages", "MonoImageFilter", Mono_filters,
1603ff48bf5SDavid du Colombier "MonoImageResolution"
1613ff48bf5SDavid du Colombier )
1623ff48bf5SDavid du Colombier };
1633ff48bf5SDavid du Colombier #undef pi
1647dd7cddfSDavid du Colombier private const char *const AutoRotatePages_names[] = {
1653ff48bf5SDavid du Colombier psdf_arp_names, 0
1667dd7cddfSDavid du Colombier };
1677dd7cddfSDavid du Colombier private const char *const ColorConversionStrategy_names[] = {
1683ff48bf5SDavid du Colombier psdf_ccs_names, 0
1697dd7cddfSDavid du Colombier };
1707dd7cddfSDavid du Colombier private const char *const DownsampleType_names[] = {
1713ff48bf5SDavid du Colombier psdf_ds_names, 0
1727dd7cddfSDavid du Colombier };
1737dd7cddfSDavid du Colombier private const char *const Binding_names[] = {
1743ff48bf5SDavid du Colombier psdf_binding_names, 0
1757dd7cddfSDavid du Colombier };
1767dd7cddfSDavid du Colombier private const char *const DefaultRenderingIntent_names[] = {
1773ff48bf5SDavid du Colombier psdf_ri_names, 0
1787dd7cddfSDavid du Colombier };
1797dd7cddfSDavid du Colombier private const char *const TransferFunctionInfo_names[] = {
1803ff48bf5SDavid du Colombier psdf_tfi_names, 0
1817dd7cddfSDavid du Colombier };
1827dd7cddfSDavid du Colombier private const char *const UCRandBGInfo_names[] = {
1833ff48bf5SDavid du Colombier psdf_ucrbg_names, 0
1847dd7cddfSDavid du Colombier };
1857dd7cddfSDavid du Colombier private const char *const CannotEmbedFontPolicy_names[] = {
1863ff48bf5SDavid du Colombier psdf_cefp_names, 0
1877dd7cddfSDavid du Colombier };
1887dd7cddfSDavid du Colombier
1897dd7cddfSDavid du Colombier private const gs_param_item_t psdf_param_items[] = {
1903ff48bf5SDavid du Colombier #define pi(key, type, memb) { key, type, offset_of(psdf_distiller_params, memb) }
1917dd7cddfSDavid du Colombier
1927dd7cddfSDavid du Colombier /* General parameters */
1937dd7cddfSDavid du Colombier
1947dd7cddfSDavid du Colombier pi("ASCII85EncodePages", gs_param_type_bool, ASCII85EncodePages),
1957dd7cddfSDavid du Colombier /* (AutoRotatePages) */
1967dd7cddfSDavid du Colombier /* (Binding) */
1977dd7cddfSDavid du Colombier pi("CompressPages", gs_param_type_bool, CompressPages),
1987dd7cddfSDavid du Colombier /* (DefaultRenderingIntent) */
1997dd7cddfSDavid du Colombier pi("DetectBlends", gs_param_type_bool, DetectBlends),
2007dd7cddfSDavid du Colombier pi("DoThumbnails", gs_param_type_bool, DoThumbnails),
2017dd7cddfSDavid du Colombier pi("ImageMemory", gs_param_type_long, ImageMemory),
2023ff48bf5SDavid du Colombier /* (LockDistillerParams) */
2037dd7cddfSDavid du Colombier pi("LZWEncodePages", gs_param_type_bool, LZWEncodePages),
2047dd7cddfSDavid du Colombier pi("OPM", gs_param_type_int, OPM),
2057dd7cddfSDavid du Colombier pi("PreserveHalftoneInfo", gs_param_type_bool, PreserveHalftoneInfo),
2067dd7cddfSDavid du Colombier pi("PreserveOPIComments", gs_param_type_bool, PreserveOPIComments),
2077dd7cddfSDavid du Colombier pi("PreserveOverprintSettings", gs_param_type_bool, PreserveOverprintSettings),
2087dd7cddfSDavid du Colombier /* (TransferFunctionInfo) */
2097dd7cddfSDavid du Colombier /* (UCRandBGInfo) */
2107dd7cddfSDavid du Colombier pi("UseFlateCompression", gs_param_type_bool, UseFlateCompression),
2117dd7cddfSDavid du Colombier
2127dd7cddfSDavid du Colombier /* Color image processing parameters */
2137dd7cddfSDavid du Colombier
2147dd7cddfSDavid du Colombier pi("ConvertCMYKImagesToRGB", gs_param_type_bool, ConvertCMYKImagesToRGB),
2157dd7cddfSDavid du Colombier pi("ConvertImagesToIndexed", gs_param_type_bool, ConvertImagesToIndexed),
2167dd7cddfSDavid du Colombier
2177dd7cddfSDavid du Colombier /* Font embedding parameters */
2187dd7cddfSDavid du Colombier
2193ff48bf5SDavid du Colombier /* (CannotEmbedFontPolicy) */
2207dd7cddfSDavid du Colombier pi("EmbedAllFonts", gs_param_type_bool, EmbedAllFonts),
2217dd7cddfSDavid du Colombier pi("MaxSubsetPct", gs_param_type_int, MaxSubsetPct),
2223ff48bf5SDavid du Colombier pi("SubsetFonts", gs_param_type_bool, SubsetFonts),
2237dd7cddfSDavid du Colombier
2247dd7cddfSDavid du Colombier #undef pi
2257dd7cddfSDavid du Colombier gs_param_item_end
2267dd7cddfSDavid du Colombier };
2277dd7cddfSDavid du Colombier
2287dd7cddfSDavid du Colombier /* -------- Get parameters -------- */
2297dd7cddfSDavid du Colombier
2307dd7cddfSDavid du Colombier private int
psdf_write_name(gs_param_list * plist,const char * key,const char * str)2317dd7cddfSDavid du Colombier psdf_write_name(gs_param_list *plist, const char *key, const char *str)
2327dd7cddfSDavid du Colombier {
2337dd7cddfSDavid du Colombier gs_param_string pstr;
2347dd7cddfSDavid du Colombier
2357dd7cddfSDavid du Colombier param_string_from_string(pstr, str);
2367dd7cddfSDavid du Colombier return param_write_name(plist, key, &pstr);
2377dd7cddfSDavid du Colombier }
2387dd7cddfSDavid du Colombier
2397dd7cddfSDavid du Colombier private int
psdf_write_string_param(gs_param_list * plist,const char * key,const gs_const_string * pstr)2403ff48bf5SDavid du Colombier psdf_write_string_param(gs_param_list *plist, const char *key,
2413ff48bf5SDavid du Colombier const gs_const_string *pstr)
2427dd7cddfSDavid du Colombier {
2433ff48bf5SDavid du Colombier gs_param_string ps;
2447dd7cddfSDavid du Colombier
2453ff48bf5SDavid du Colombier ps.data = pstr->data;
2463ff48bf5SDavid du Colombier ps.size = pstr->size;
2473ff48bf5SDavid du Colombier ps.persistent = false;
2483ff48bf5SDavid du Colombier return param_write_string(plist, key, &ps);
2497dd7cddfSDavid du Colombier }
2507dd7cddfSDavid du Colombier
2517dd7cddfSDavid du Colombier /*
2523ff48bf5SDavid du Colombier * Get an image Dict parameter. Note that we return a default (empty)
2533ff48bf5SDavid du Colombier * dictionary if the parameter has never been set.
2547dd7cddfSDavid du Colombier */
2557dd7cddfSDavid du Colombier private int
psdf_get_image_dict_param(gs_param_list * plist,const gs_param_name pname,gs_c_param_list * plvalue)2567dd7cddfSDavid du Colombier psdf_get_image_dict_param(gs_param_list * plist, const gs_param_name pname,
2573ff48bf5SDavid du Colombier gs_c_param_list *plvalue)
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier gs_param_dict dict;
2607dd7cddfSDavid du Colombier int code;
2617dd7cddfSDavid du Colombier
2627dd7cddfSDavid du Colombier if (pname == 0)
2637dd7cddfSDavid du Colombier return 0;
2647dd7cddfSDavid du Colombier dict.size = 12; /* enough for all param dicts we know about */
2657dd7cddfSDavid du Colombier if ((code = param_begin_write_dict(plist, pname, &dict, false)) < 0)
2667dd7cddfSDavid du Colombier return code;
2673ff48bf5SDavid du Colombier if (plvalue != 0) {
2683ff48bf5SDavid du Colombier gs_c_param_list_read(plvalue);
2693ff48bf5SDavid du Colombier code = param_list_copy(dict.list, (gs_param_list *)plvalue);
2703ff48bf5SDavid du Colombier }
2717dd7cddfSDavid du Colombier param_end_write_dict(plist, pname, &dict);
2727dd7cddfSDavid du Colombier return code;
2737dd7cddfSDavid du Colombier }
2747dd7cddfSDavid du Colombier
2757dd7cddfSDavid du Colombier /* Get a set of image-related parameters. */
2767dd7cddfSDavid du Colombier private int
psdf_get_image_params(gs_param_list * plist,const psdf_image_param_names_t * pnames,psdf_image_params * params)2777dd7cddfSDavid du Colombier psdf_get_image_params(gs_param_list * plist,
2783ff48bf5SDavid du Colombier const psdf_image_param_names_t * pnames, psdf_image_params * params)
2797dd7cddfSDavid du Colombier {
2803ff48bf5SDavid du Colombier /* Skip AutoFilter for mono images. */
2813ff48bf5SDavid du Colombier const gs_param_item_t *items =
2823ff48bf5SDavid du Colombier (pnames->items[0].key == 0 ? pnames->items + 1 : pnames->items);
2837dd7cddfSDavid du Colombier int code;
2847dd7cddfSDavid du Colombier
2853ff48bf5SDavid du Colombier /*
2863ff48bf5SDavid du Colombier * We must actually return a value for every parameter, so that
2873ff48bf5SDavid du Colombier * all parameter names will be recognized as settable by -d or -s
2883ff48bf5SDavid du Colombier * from the command line.
2893ff48bf5SDavid du Colombier */
2907dd7cddfSDavid du Colombier if (
2913ff48bf5SDavid du Colombier (code = gs_param_write_items(plist, params, NULL, items)) < 0 ||
2927dd7cddfSDavid du Colombier (code = psdf_get_image_dict_param(plist, pnames->ACSDict,
2933ff48bf5SDavid du Colombier params->ACSDict)) < 0 ||
2943ff48bf5SDavid du Colombier /* (AntiAlias) */
2953ff48bf5SDavid du Colombier /* (AutoFilter) */
2963ff48bf5SDavid du Colombier /* (Depth) */
2977dd7cddfSDavid du Colombier (code = psdf_get_image_dict_param(plist, pnames->Dict,
2983ff48bf5SDavid du Colombier params->Dict)) < 0 ||
2993ff48bf5SDavid du Colombier /* (Downsample) */
3003ff48bf5SDavid du Colombier (code = psdf_write_name(plist, pnames->DownsampleType,
3013ff48bf5SDavid du Colombier DownsampleType_names[params->DownsampleType])) < 0 ||
3023ff48bf5SDavid du Colombier /* (DownsampleThreshold) */
3033ff48bf5SDavid du Colombier /* (Encode) */
3043ff48bf5SDavid du Colombier (code = psdf_write_name(plist, pnames->Filter,
3053ff48bf5SDavid du Colombier (params->Filter == 0 ?
3063ff48bf5SDavid du Colombier pnames->filter_names[0].pname :
3073ff48bf5SDavid du Colombier params->Filter))) < 0
3083ff48bf5SDavid du Colombier /* (Resolution) */
3097dd7cddfSDavid du Colombier )
3107dd7cddfSDavid du Colombier DO_NOTHING;
3117dd7cddfSDavid du Colombier return code;
3127dd7cddfSDavid du Colombier }
3137dd7cddfSDavid du Colombier
3147dd7cddfSDavid du Colombier /* Get a font embedding parameter. */
3157dd7cddfSDavid du Colombier private int
psdf_get_embed_param(gs_param_list * plist,gs_param_name allpname,const gs_param_string_array * psa)3167dd7cddfSDavid du Colombier psdf_get_embed_param(gs_param_list *plist, gs_param_name allpname,
3177dd7cddfSDavid du Colombier const gs_param_string_array *psa)
3187dd7cddfSDavid du Colombier {
3197dd7cddfSDavid du Colombier int code = param_write_name_array(plist, allpname, psa);
3207dd7cddfSDavid du Colombier
3217dd7cddfSDavid du Colombier if (code >= 0)
3227dd7cddfSDavid du Colombier code = param_write_name_array(plist, allpname + 1, psa);
3237dd7cddfSDavid du Colombier return code;
3247dd7cddfSDavid du Colombier }
3257dd7cddfSDavid du Colombier
3267dd7cddfSDavid du Colombier /* Get parameters. */
3277dd7cddfSDavid du Colombier int
gdev_psdf_get_params(gx_device * dev,gs_param_list * plist)3287dd7cddfSDavid du Colombier gdev_psdf_get_params(gx_device * dev, gs_param_list * plist)
3297dd7cddfSDavid du Colombier {
3307dd7cddfSDavid du Colombier gx_device_psdf *pdev = (gx_device_psdf *) dev;
3317dd7cddfSDavid du Colombier int code = gdev_vector_get_params(dev, plist);
3327dd7cddfSDavid du Colombier
3337dd7cddfSDavid du Colombier if (
3343ff48bf5SDavid du Colombier code < 0 ||
3353ff48bf5SDavid du Colombier (code = gs_param_write_items(plist, &pdev->params, NULL, psdf_param_items)) < 0 ||
3367dd7cddfSDavid du Colombier
3377dd7cddfSDavid du Colombier /* General parameters */
3387dd7cddfSDavid du Colombier
3393ff48bf5SDavid du Colombier (code = psdf_write_name(plist, "AutoRotatePages",
3403ff48bf5SDavid du Colombier AutoRotatePages_names[(int)pdev->params.AutoRotatePages])) < 0 ||
3417dd7cddfSDavid du Colombier (code = psdf_write_name(plist, "Binding",
3427dd7cddfSDavid du Colombier Binding_names[(int)pdev->params.Binding])) < 0 ||
3437dd7cddfSDavid du Colombier (code = psdf_write_name(plist, "DefaultRenderingIntent",
3447dd7cddfSDavid du Colombier DefaultRenderingIntent_names[(int)pdev->params.DefaultRenderingIntent])) < 0 ||
3453ff48bf5SDavid du Colombier (code = psdf_write_name(plist, "TransferFunctionInfo",
3463ff48bf5SDavid du Colombier TransferFunctionInfo_names[(int)pdev->params.TransferFunctionInfo])) < 0 ||
3473ff48bf5SDavid du Colombier (code = psdf_write_name(plist, "UCRandBGInfo",
3483ff48bf5SDavid du Colombier UCRandBGInfo_names[(int)pdev->params.UCRandBGInfo])) < 0 ||
3497dd7cddfSDavid du Colombier
3507dd7cddfSDavid du Colombier /* Color sampled image parameters */
3517dd7cddfSDavid du Colombier
3527dd7cddfSDavid du Colombier (code = psdf_get_image_params(plist, &Color_names, &pdev->params.ColorImage)) < 0 ||
3533ff48bf5SDavid du Colombier (code = psdf_write_name(plist, "ColorConversionStrategy",
3543ff48bf5SDavid du Colombier ColorConversionStrategy_names[(int)pdev->params.ColorConversionStrategy])) < 0 ||
3553ff48bf5SDavid du Colombier (code = psdf_write_string_param(plist, "CalCMYKProfile",
3563ff48bf5SDavid du Colombier &pdev->params.CalCMYKProfile)) < 0 ||
3573ff48bf5SDavid du Colombier (code = psdf_write_string_param(plist, "CalGrayProfile",
3583ff48bf5SDavid du Colombier &pdev->params.CalGrayProfile)) < 0 ||
3593ff48bf5SDavid du Colombier (code = psdf_write_string_param(plist, "CalRGBProfile",
3603ff48bf5SDavid du Colombier &pdev->params.CalRGBProfile)) < 0 ||
3613ff48bf5SDavid du Colombier (code = psdf_write_string_param(plist, "sRGBProfile",
3623ff48bf5SDavid du Colombier &pdev->params.sRGBProfile)) < 0 ||
3637dd7cddfSDavid du Colombier
3647dd7cddfSDavid du Colombier /* Gray sampled image parameters */
3657dd7cddfSDavid du Colombier
3667dd7cddfSDavid du Colombier (code = psdf_get_image_params(plist, &Gray_names, &pdev->params.GrayImage)) < 0 ||
3677dd7cddfSDavid du Colombier
3687dd7cddfSDavid du Colombier /* Mono sampled image parameters */
3697dd7cddfSDavid du Colombier
3707dd7cddfSDavid du Colombier (code = psdf_get_image_params(plist, &Mono_names, &pdev->params.MonoImage)) < 0 ||
3717dd7cddfSDavid du Colombier
3727dd7cddfSDavid du Colombier /* Font embedding parameters */
3737dd7cddfSDavid du Colombier
3747dd7cddfSDavid du Colombier (code = psdf_get_embed_param(plist, ".AlwaysEmbed", &pdev->params.AlwaysEmbed)) < 0 ||
3757dd7cddfSDavid du Colombier (code = psdf_get_embed_param(plist, ".NeverEmbed", &pdev->params.NeverEmbed)) < 0 ||
3767dd7cddfSDavid du Colombier (code = psdf_write_name(plist, "CannotEmbedFontPolicy",
3777dd7cddfSDavid du Colombier CannotEmbedFontPolicy_names[(int)pdev->params.CannotEmbedFontPolicy])) < 0
3783ff48bf5SDavid du Colombier )
3793ff48bf5SDavid du Colombier DO_NOTHING;
3807dd7cddfSDavid du Colombier return code;
3817dd7cddfSDavid du Colombier }
3827dd7cddfSDavid du Colombier
3837dd7cddfSDavid du Colombier /* -------- Put parameters -------- */
3847dd7cddfSDavid du Colombier
3859a747e4fSDavid du Colombier extern stream_state_proc_put_params(s_CF_put_params, stream_CF_state);
3863ff48bf5SDavid du Colombier extern stream_state_proc_put_params(s_DCTE_put_params, stream_DCT_state);
3877dd7cddfSDavid du Colombier typedef stream_state_proc_put_params((*ss_put_params_t), stream_state);
3887dd7cddfSDavid du Colombier
3897dd7cddfSDavid du Colombier private int
psdf_read_string_param(gs_param_list * plist,const char * key,gs_const_string * pstr,gs_memory_t * mem,int ecode)3903ff48bf5SDavid du Colombier psdf_read_string_param(gs_param_list *plist, const char *key,
3913ff48bf5SDavid du Colombier gs_const_string *pstr, gs_memory_t *mem, int ecode)
3923ff48bf5SDavid du Colombier {
3933ff48bf5SDavid du Colombier gs_param_string ps;
3943ff48bf5SDavid du Colombier int code;
3953ff48bf5SDavid du Colombier
3963ff48bf5SDavid du Colombier switch (code = param_read_string(plist, key, &ps)) {
3973ff48bf5SDavid du Colombier case 0: {
3983ff48bf5SDavid du Colombier uint size = ps.size;
399*593dc095SDavid du Colombier byte *data = gs_alloc_string(mem, size, "psdf_read_string_param");
4003ff48bf5SDavid du Colombier
4013ff48bf5SDavid du Colombier if (data == 0)
4023ff48bf5SDavid du Colombier return_error(gs_error_VMerror);
4033ff48bf5SDavid du Colombier memcpy(data, ps.data, size);
4043ff48bf5SDavid du Colombier pstr->data = data;
4053ff48bf5SDavid du Colombier pstr->size = size;
4063ff48bf5SDavid du Colombier break;
4073ff48bf5SDavid du Colombier }
4083ff48bf5SDavid du Colombier default:
4093ff48bf5SDavid du Colombier ecode = code;
4103ff48bf5SDavid du Colombier case 1:
4113ff48bf5SDavid du Colombier break;
4123ff48bf5SDavid du Colombier }
4133ff48bf5SDavid du Colombier return ecode;
4143ff48bf5SDavid du Colombier }
4153ff48bf5SDavid du Colombier
4163ff48bf5SDavid du Colombier /*
4173ff48bf5SDavid du Colombier * The arguments and return value for psdf_put_enum are different because
4183ff48bf5SDavid du Colombier * we must cast the value both going in and coming out.
4193ff48bf5SDavid du Colombier */
4203ff48bf5SDavid du Colombier private int
psdf_put_enum(gs_param_list * plist,const char * key,int value,const char * const pnames[],int * pecode)4213ff48bf5SDavid du Colombier psdf_put_enum(gs_param_list *plist, const char *key, int value,
4223ff48bf5SDavid du Colombier const char *const pnames[], int *pecode)
4233ff48bf5SDavid du Colombier {
4243ff48bf5SDavid du Colombier *pecode = param_put_enum(plist, key, &value, pnames, *pecode);
4253ff48bf5SDavid du Colombier return value;
4263ff48bf5SDavid du Colombier }
4273ff48bf5SDavid du Colombier
4283ff48bf5SDavid du Colombier private int
psdf_CF_put_params(gs_param_list * plist,stream_state * st)4297dd7cddfSDavid du Colombier psdf_CF_put_params(gs_param_list * plist, stream_state * st)
4307dd7cddfSDavid du Colombier {
4317dd7cddfSDavid du Colombier stream_CFE_state *const ss = (stream_CFE_state *) st;
4327dd7cddfSDavid du Colombier
4337dd7cddfSDavid du Colombier (*s_CFE_template.set_defaults) (st);
4347dd7cddfSDavid du Colombier ss->K = -1;
4357dd7cddfSDavid du Colombier ss->BlackIs1 = true;
4367dd7cddfSDavid du Colombier return s_CF_put_params(plist, (stream_CF_state *) ss);
4377dd7cddfSDavid du Colombier }
4383ff48bf5SDavid du Colombier
4397dd7cddfSDavid du Colombier private int
psdf_DCT_put_params(gs_param_list * plist,stream_state * st)4403ff48bf5SDavid du Colombier psdf_DCT_put_params(gs_param_list * plist, stream_state * st)
4417dd7cddfSDavid du Colombier {
4423ff48bf5SDavid du Colombier return psdf_DCT_filter(plist, st, 8 /*nominal*/, 8 /*ibid.*/, 3 /*ibid.*/,
4433ff48bf5SDavid du Colombier NULL);
4447dd7cddfSDavid du Colombier }
4457dd7cddfSDavid du Colombier
4467dd7cddfSDavid du Colombier /* Put [~](Always|Never)Embed parameters. */
4477dd7cddfSDavid du Colombier private int
param_read_embed_array(gs_param_list * plist,gs_param_name pname,gs_param_string_array * psa,int ecode)4487dd7cddfSDavid du Colombier param_read_embed_array(gs_param_list * plist, gs_param_name pname,
4497dd7cddfSDavid du Colombier gs_param_string_array * psa, int ecode)
4507dd7cddfSDavid du Colombier {
4517dd7cddfSDavid du Colombier int code;
4527dd7cddfSDavid du Colombier
4537dd7cddfSDavid du Colombier psa->data = 0, psa->size = 0;
4547dd7cddfSDavid du Colombier switch (code = param_read_name_array(plist, pname, psa)) {
4557dd7cddfSDavid du Colombier default:
4567dd7cddfSDavid du Colombier ecode = code;
4577dd7cddfSDavid du Colombier param_signal_error(plist, pname, ecode);
4587dd7cddfSDavid du Colombier case 0:
4597dd7cddfSDavid du Colombier case 1:
4607dd7cddfSDavid du Colombier break;
4617dd7cddfSDavid du Colombier }
4627dd7cddfSDavid du Colombier return ecode;
4637dd7cddfSDavid du Colombier }
4647dd7cddfSDavid du Colombier private bool
param_string_eq(const gs_param_string * ps1,const gs_param_string * ps2)4657dd7cddfSDavid du Colombier param_string_eq(const gs_param_string *ps1, const gs_param_string *ps2)
4667dd7cddfSDavid du Colombier {
4677dd7cddfSDavid du Colombier return !bytes_compare(ps1->data, ps1->size, ps2->data, ps2->size);
4687dd7cddfSDavid du Colombier }
4697dd7cddfSDavid du Colombier private int
add_embed(gs_param_string_array * prsa,const gs_param_string_array * psa,gs_memory_t * mem)4707dd7cddfSDavid du Colombier add_embed(gs_param_string_array *prsa, const gs_param_string_array *psa,
4717dd7cddfSDavid du Colombier gs_memory_t *mem)
4727dd7cddfSDavid du Colombier {
4737dd7cddfSDavid du Colombier uint i;
4747dd7cddfSDavid du Colombier gs_param_string *const rdata =
4757dd7cddfSDavid du Colombier (gs_param_string *)prsa->data; /* break const */
4767dd7cddfSDavid du Colombier uint count = prsa->size;
4777dd7cddfSDavid du Colombier
4787dd7cddfSDavid du Colombier for (i = 0; i < psa->size; ++i) {
4797dd7cddfSDavid du Colombier uint j;
4807dd7cddfSDavid du Colombier
4817dd7cddfSDavid du Colombier for (j = 0; j < count; ++j)
4827dd7cddfSDavid du Colombier if (param_string_eq(&psa->data[i], &rdata[j]))
4837dd7cddfSDavid du Colombier break;
4847dd7cddfSDavid du Colombier if (j == count) {
4857dd7cddfSDavid du Colombier uint size = psa->data[i].size;
4867dd7cddfSDavid du Colombier byte *data = gs_alloc_string(mem, size, "add_embed");
4877dd7cddfSDavid du Colombier
4887dd7cddfSDavid du Colombier if (data == 0)
4897dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
4907dd7cddfSDavid du Colombier memcpy(data, psa->data[i].data, size);
4917dd7cddfSDavid du Colombier rdata[count].data = data;
4927dd7cddfSDavid du Colombier rdata[count].size = size;
4937dd7cddfSDavid du Colombier rdata[count].persistent = false;
4947dd7cddfSDavid du Colombier count++;
4957dd7cddfSDavid du Colombier }
4967dd7cddfSDavid du Colombier }
4977dd7cddfSDavid du Colombier prsa->size = count;
4987dd7cddfSDavid du Colombier return 0;
4997dd7cddfSDavid du Colombier }
5007dd7cddfSDavid du Colombier private void
delete_embed(gs_param_string_array * prsa,const gs_param_string_array * pnsa,gs_memory_t * mem)5017dd7cddfSDavid du Colombier delete_embed(gs_param_string_array *prsa, const gs_param_string_array *pnsa,
5027dd7cddfSDavid du Colombier gs_memory_t *mem)
5037dd7cddfSDavid du Colombier {
5047dd7cddfSDavid du Colombier uint i;
5057dd7cddfSDavid du Colombier gs_param_string *const rdata =
5067dd7cddfSDavid du Colombier (gs_param_string *)prsa->data; /* break const */
5077dd7cddfSDavid du Colombier uint count = prsa->size;
5087dd7cddfSDavid du Colombier
5097dd7cddfSDavid du Colombier for (i = pnsa->size; i-- > 0;) {
5107dd7cddfSDavid du Colombier uint j;
5117dd7cddfSDavid du Colombier
5127dd7cddfSDavid du Colombier for (j = count; j-- > 0;)
5137dd7cddfSDavid du Colombier if (param_string_eq(&pnsa->data[i], &rdata[j]))
5147dd7cddfSDavid du Colombier break;
5157dd7cddfSDavid du Colombier if (j + 1 != 0) {
5167dd7cddfSDavid du Colombier gs_free_const_string(mem, rdata[j].data, rdata[j].size,
5177dd7cddfSDavid du Colombier "delete_embed");
5187dd7cddfSDavid du Colombier rdata[j] = rdata[--count];
5197dd7cddfSDavid du Colombier }
5207dd7cddfSDavid du Colombier }
5217dd7cddfSDavid du Colombier prsa->size = count;
5227dd7cddfSDavid du Colombier }
5237dd7cddfSDavid du Colombier private int
psdf_put_embed_param(gs_param_list * plist,gs_param_name notpname,gs_param_name allpname,gs_param_string_array * psa,gs_memory_t * mem,int ecode)5247dd7cddfSDavid du Colombier psdf_put_embed_param(gs_param_list * plist, gs_param_name notpname,
5257dd7cddfSDavid du Colombier gs_param_name allpname, gs_param_string_array * psa,
5267dd7cddfSDavid du Colombier gs_memory_t *mem, int ecode)
5277dd7cddfSDavid du Colombier {
5287dd7cddfSDavid du Colombier gs_param_name pname = notpname + 1;
5297dd7cddfSDavid du Colombier gs_param_string_array sa, nsa, asa;
5307dd7cddfSDavid du Colombier bool replace;
5317dd7cddfSDavid du Colombier gs_param_string *rdata;
5327dd7cddfSDavid du Colombier gs_param_string_array rsa;
5337dd7cddfSDavid du Colombier int code = 0;
5347dd7cddfSDavid du Colombier
5357dd7cddfSDavid du Colombier mem = gs_memory_stable(mem);
5367dd7cddfSDavid du Colombier ecode = param_read_embed_array(plist, pname, &sa, ecode);
5377dd7cddfSDavid du Colombier ecode = param_read_embed_array(plist, notpname, &nsa, ecode);
5387dd7cddfSDavid du Colombier ecode = param_read_embed_array(plist, allpname, &asa, ecode);
5397dd7cddfSDavid du Colombier if (ecode < 0)
5407dd7cddfSDavid du Colombier return ecode;
5417dd7cddfSDavid du Colombier /*
5427dd7cddfSDavid du Colombier * Figure out whether we're replacing (sa == asa or asa and no sa,
5437dd7cddfSDavid du Colombier * no nsa) or updating (all other cases).
5447dd7cddfSDavid du Colombier */
5457dd7cddfSDavid du Colombier if (asa.data == 0 || nsa.data != 0)
5467dd7cddfSDavid du Colombier replace = false;
5477dd7cddfSDavid du Colombier else if (sa.data == 0)
5487dd7cddfSDavid du Colombier replace = true;
5497dd7cddfSDavid du Colombier else if (sa.size != asa.size)
5507dd7cddfSDavid du Colombier replace = false;
5517dd7cddfSDavid du Colombier else {
5527dd7cddfSDavid du Colombier /* Test whether sa == asa. */
5537dd7cddfSDavid du Colombier uint i;
5547dd7cddfSDavid du Colombier
5557dd7cddfSDavid du Colombier replace = true;
5567dd7cddfSDavid du Colombier for (i = 0; i < sa.size; ++i)
5577dd7cddfSDavid du Colombier if (!param_string_eq(&sa.data[i], &asa.data[i])) {
5587dd7cddfSDavid du Colombier replace = false;
5597dd7cddfSDavid du Colombier break;
5607dd7cddfSDavid du Colombier }
5617dd7cddfSDavid du Colombier if (replace)
5627dd7cddfSDavid du Colombier return 0; /* no-op */
5637dd7cddfSDavid du Colombier }
5647dd7cddfSDavid du Colombier if (replace) {
5657dd7cddfSDavid du Colombier /* Wholesale replacement, only asa is relevant. */
5667dd7cddfSDavid du Colombier rdata = gs_alloc_struct_array(mem, asa.size, gs_param_string,
5677dd7cddfSDavid du Colombier &st_param_string_element,
5687dd7cddfSDavid du Colombier "psdf_put_embed_param(replace)");
5697dd7cddfSDavid du Colombier if (rdata == 0)
5707dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
5717dd7cddfSDavid du Colombier rsa.data = rdata;
5727dd7cddfSDavid du Colombier rsa.size = 0;
5737dd7cddfSDavid du Colombier if ((code = add_embed(&rsa, &asa, mem)) < 0) {
5747dd7cddfSDavid du Colombier gs_free_object(mem, rdata, "psdf_put_embed_param(replace)");
5757dd7cddfSDavid du Colombier ecode = code;
5767dd7cddfSDavid du Colombier } else
5777dd7cddfSDavid du Colombier delete_embed(psa, psa, mem);
5787dd7cddfSDavid du Colombier } else if (sa.data || nsa.data) {
5797dd7cddfSDavid du Colombier /* Incremental update, sa and nsa are relevant, asa is not. */
5807dd7cddfSDavid du Colombier rdata = gs_alloc_struct_array(mem, psa->size + sa.size,
5817dd7cddfSDavid du Colombier gs_param_string,
5827dd7cddfSDavid du Colombier &st_param_string_element,
5837dd7cddfSDavid du Colombier "psdf_put_embed_param(update)");
5847dd7cddfSDavid du Colombier if (rdata == 0)
5857dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
5867dd7cddfSDavid du Colombier memcpy(rdata, psa->data, psa->size * sizeof(*psa->data));
5877dd7cddfSDavid du Colombier rsa.data = rdata;
5887dd7cddfSDavid du Colombier rsa.size = psa->size;
5897dd7cddfSDavid du Colombier if ((code = add_embed(&rsa, &sa, mem)) < 0) {
5907dd7cddfSDavid du Colombier gs_free_object(mem, rdata, "psdf_put_embed_param(update)");
5917dd7cddfSDavid du Colombier ecode = code;
5927dd7cddfSDavid du Colombier } else {
5937dd7cddfSDavid du Colombier delete_embed(&rsa, &nsa, mem);
5947dd7cddfSDavid du Colombier rsa.data = gs_resize_object(mem, rdata, rsa.size,
5957dd7cddfSDavid du Colombier "psdf_put_embed_param(resize)");
5967dd7cddfSDavid du Colombier }
5977dd7cddfSDavid du Colombier } else
5987dd7cddfSDavid du Colombier return 0; /* no-op */
5997dd7cddfSDavid du Colombier if (code >= 0) {
6007dd7cddfSDavid du Colombier gs_free_const_object(mem, psa->data, "psdf_put_embed_param(free)");
6017dd7cddfSDavid du Colombier rsa.persistent = false;
6027dd7cddfSDavid du Colombier *psa = rsa;
6037dd7cddfSDavid du Colombier }
6047dd7cddfSDavid du Colombier return ecode;
6057dd7cddfSDavid du Colombier }
6067dd7cddfSDavid du Colombier
6077dd7cddfSDavid du Colombier /* Put an image Dict parameter. */
6087dd7cddfSDavid du Colombier private int
psdf_put_image_dict_param(gs_param_list * plist,const gs_param_name pname,gs_c_param_list ** pplvalue,const stream_template * template,ss_put_params_t put_params,gs_memory_t * mem)6097dd7cddfSDavid du Colombier psdf_put_image_dict_param(gs_param_list * plist, const gs_param_name pname,
6103ff48bf5SDavid du Colombier gs_c_param_list **pplvalue,
6113ff48bf5SDavid du Colombier const stream_template * template,
6127dd7cddfSDavid du Colombier ss_put_params_t put_params, gs_memory_t * mem)
6137dd7cddfSDavid du Colombier {
6147dd7cddfSDavid du Colombier gs_param_dict dict;
6153ff48bf5SDavid du Colombier gs_c_param_list *plvalue = *pplvalue;
6167dd7cddfSDavid du Colombier int code;
6177dd7cddfSDavid du Colombier
6183ff48bf5SDavid du Colombier mem = gs_memory_stable(mem);
6197dd7cddfSDavid du Colombier switch (code = param_begin_read_dict(plist, pname, &dict, false)) {
6207dd7cddfSDavid du Colombier default:
6217dd7cddfSDavid du Colombier param_signal_error(plist, pname, code);
6227dd7cddfSDavid du Colombier return code;
6237dd7cddfSDavid du Colombier case 1:
6243ff48bf5SDavid du Colombier return 0;
6257dd7cddfSDavid du Colombier case 0: {
6263ff48bf5SDavid du Colombier /* Check the parameter values now. */
6273ff48bf5SDavid du Colombier stream_state *ss = s_alloc_state(mem, template->stype, pname);
6287dd7cddfSDavid du Colombier
6293ff48bf5SDavid du Colombier if (ss == 0)
6307dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
6313ff48bf5SDavid du Colombier ss->template = template;
6327dd7cddfSDavid du Colombier if (template->set_defaults)
6333ff48bf5SDavid du Colombier template->set_defaults(ss);
6343ff48bf5SDavid du Colombier code = put_params(dict.list, ss);
6353ff48bf5SDavid du Colombier if (template->release)
6363ff48bf5SDavid du Colombier template->release(ss);
6373ff48bf5SDavid du Colombier gs_free_object(mem, ss, pname);
6387dd7cddfSDavid du Colombier if (code < 0) {
6397dd7cddfSDavid du Colombier param_signal_error(plist, pname, code);
6403ff48bf5SDavid du Colombier } else {
6413ff48bf5SDavid du Colombier plvalue = gs_c_param_list_alloc(mem, pname);
6423ff48bf5SDavid du Colombier if (plvalue == 0)
6433ff48bf5SDavid du Colombier return_error(gs_error_VMerror);
6443ff48bf5SDavid du Colombier gs_c_param_list_write(plvalue, mem);
6453ff48bf5SDavid du Colombier code = param_list_copy((gs_param_list *)plvalue,
6463ff48bf5SDavid du Colombier dict.list);
6473ff48bf5SDavid du Colombier if (code < 0) {
6483ff48bf5SDavid du Colombier gs_c_param_list_release(plvalue);
6493ff48bf5SDavid du Colombier gs_free_object(mem, plvalue, pname);
6503ff48bf5SDavid du Colombier plvalue = *pplvalue;
6513ff48bf5SDavid du Colombier }
6527dd7cddfSDavid du Colombier }
6537dd7cddfSDavid du Colombier }
6547dd7cddfSDavid du Colombier param_end_read_dict(plist, pname, &dict);
6553ff48bf5SDavid du Colombier break;
6567dd7cddfSDavid du Colombier }
6573ff48bf5SDavid du Colombier if (plvalue != *pplvalue) {
6583ff48bf5SDavid du Colombier if (*pplvalue)
6593ff48bf5SDavid du Colombier gs_c_param_list_release(*pplvalue);
6603ff48bf5SDavid du Colombier *pplvalue = plvalue;
6617dd7cddfSDavid du Colombier }
6627dd7cddfSDavid du Colombier return code;
6637dd7cddfSDavid du Colombier }
6647dd7cddfSDavid du Colombier
6657dd7cddfSDavid du Colombier /* Put a set of image-related parameters. */
6667dd7cddfSDavid du Colombier private int
psdf_put_image_params(const gx_device_psdf * pdev,gs_param_list * plist,const psdf_image_param_names_t * pnames,psdf_image_params * params,int ecode)6677dd7cddfSDavid du Colombier psdf_put_image_params(const gx_device_psdf * pdev, gs_param_list * plist,
6683ff48bf5SDavid du Colombier const psdf_image_param_names_t * pnames,
6697dd7cddfSDavid du Colombier psdf_image_params * params, int ecode)
6707dd7cddfSDavid du Colombier {
6717dd7cddfSDavid du Colombier gs_param_string fs;
6727dd7cddfSDavid du Colombier /*
6737dd7cddfSDavid du Colombier * Since this procedure can be called before the device is open,
6747dd7cddfSDavid du Colombier * we must use pdev->memory rather than pdev->v_memory.
6757dd7cddfSDavid du Colombier */
6767dd7cddfSDavid du Colombier gs_memory_t *mem = pdev->memory;
6777dd7cddfSDavid du Colombier gs_param_name pname;
6783ff48bf5SDavid du Colombier /* Skip AutoFilter for mono images. */
6793ff48bf5SDavid du Colombier const gs_param_item_t *items =
6803ff48bf5SDavid du Colombier (pnames->items[0].key == 0 ? pnames->items + 1 : pnames->items);
6813ff48bf5SDavid du Colombier int code = gs_param_read_items(plist, params, items);
6827dd7cddfSDavid du Colombier
6837dd7cddfSDavid du Colombier if ((pname = pnames->ACSDict) != 0) {
6847dd7cddfSDavid du Colombier code = psdf_put_image_dict_param(plist, pname, ¶ms->ACSDict,
6857dd7cddfSDavid du Colombier &s_DCTE_template,
6867dd7cddfSDavid du Colombier psdf_DCT_put_params, mem);
6877dd7cddfSDavid du Colombier if (code < 0)
6887dd7cddfSDavid du Colombier ecode = code;
6897dd7cddfSDavid du Colombier }
6903ff48bf5SDavid du Colombier /* (AntiAlias) */
6913ff48bf5SDavid du Colombier /* (AutoFilter) */
6923ff48bf5SDavid du Colombier /* (Depth) */
6937dd7cddfSDavid du Colombier if ((pname = pnames->Dict) != 0) {
6947dd7cddfSDavid du Colombier const stream_template *template;
6957dd7cddfSDavid du Colombier ss_put_params_t put_params;
6967dd7cddfSDavid du Colombier
6977dd7cddfSDavid du Colombier /* Hack to determine what kind of a Dict we want: */
6987dd7cddfSDavid du Colombier if (pnames->Dict[0] == 'M')
6997dd7cddfSDavid du Colombier template = &s_CFE_template,
7007dd7cddfSDavid du Colombier put_params = psdf_CF_put_params;
7017dd7cddfSDavid du Colombier else
7027dd7cddfSDavid du Colombier template = &s_DCTE_template,
7037dd7cddfSDavid du Colombier put_params = psdf_DCT_put_params;
7047dd7cddfSDavid du Colombier code = psdf_put_image_dict_param(plist, pname, ¶ms->Dict,
7057dd7cddfSDavid du Colombier template, put_params, mem);
7067dd7cddfSDavid du Colombier if (code < 0)
7077dd7cddfSDavid du Colombier ecode = code;
7087dd7cddfSDavid du Colombier }
7093ff48bf5SDavid du Colombier /* (Downsample) */
7103ff48bf5SDavid du Colombier params->DownsampleType = (enum psdf_downsample_type)
7113ff48bf5SDavid du Colombier psdf_put_enum(plist, pnames->DownsampleType,
7123ff48bf5SDavid du Colombier (int)params->DownsampleType, DownsampleType_names,
7133ff48bf5SDavid du Colombier &ecode);
7143ff48bf5SDavid du Colombier /* (DownsampleThreshold) */
7153ff48bf5SDavid du Colombier /* (Encode) */
7167dd7cddfSDavid du Colombier switch (code = param_read_string(plist, pnames->Filter, &fs)) {
7177dd7cddfSDavid du Colombier case 0:
7187dd7cddfSDavid du Colombier {
7193ff48bf5SDavid du Colombier const psdf_image_filter_name *pn = pnames->filter_names;
7207dd7cddfSDavid du Colombier
7217dd7cddfSDavid du Colombier while (pn->pname != 0 && !gs_param_string_eq(&fs, pn->pname))
7227dd7cddfSDavid du Colombier pn++;
7237dd7cddfSDavid du Colombier if (pn->pname == 0 || pn->min_version > pdev->version) {
7247dd7cddfSDavid du Colombier ecode = gs_error_rangecheck;
7257dd7cddfSDavid du Colombier goto ipe;
7267dd7cddfSDavid du Colombier }
7277dd7cddfSDavid du Colombier params->Filter = pn->pname;
7287dd7cddfSDavid du Colombier params->filter_template = pn->template;
7297dd7cddfSDavid du Colombier break;
7307dd7cddfSDavid du Colombier }
7317dd7cddfSDavid du Colombier default:
7327dd7cddfSDavid du Colombier ecode = code;
7337dd7cddfSDavid du Colombier ipe:param_signal_error(plist, pnames->Filter, ecode);
7347dd7cddfSDavid du Colombier case 1:
7357dd7cddfSDavid du Colombier break;
7367dd7cddfSDavid du Colombier }
7373ff48bf5SDavid du Colombier /* (Resolution) */
7387dd7cddfSDavid du Colombier if (ecode >= 0) { /* Force parameters to acceptable values. */
7397dd7cddfSDavid du Colombier if (params->Resolution < 1)
7407dd7cddfSDavid du Colombier params->Resolution = 1;
7413ff48bf5SDavid du Colombier if (params->DownsampleThreshold < 1 ||
7423ff48bf5SDavid du Colombier params->DownsampleThreshold > 10)
7433ff48bf5SDavid du Colombier params->DownsampleThreshold = pnames->DownsampleThreshold_default;
7447dd7cddfSDavid du Colombier switch (params->Depth) {
7457dd7cddfSDavid du Colombier default:
7467dd7cddfSDavid du Colombier params->Depth = -1;
7477dd7cddfSDavid du Colombier case 1:
7487dd7cddfSDavid du Colombier case 2:
7497dd7cddfSDavid du Colombier case 4:
7507dd7cddfSDavid du Colombier case 8:
7517dd7cddfSDavid du Colombier case -1:
7527dd7cddfSDavid du Colombier break;
7537dd7cddfSDavid du Colombier }
7547dd7cddfSDavid du Colombier }
7557dd7cddfSDavid du Colombier return ecode;
7567dd7cddfSDavid du Colombier }
7577dd7cddfSDavid du Colombier
7587dd7cddfSDavid du Colombier /* Put parameters. */
7597dd7cddfSDavid du Colombier int
gdev_psdf_put_params(gx_device * dev,gs_param_list * plist)7607dd7cddfSDavid du Colombier gdev_psdf_put_params(gx_device * dev, gs_param_list * plist)
7617dd7cddfSDavid du Colombier {
7627dd7cddfSDavid du Colombier gx_device_psdf *pdev = (gx_device_psdf *) dev;
7637dd7cddfSDavid du Colombier gs_memory_t *mem =
7647dd7cddfSDavid du Colombier (pdev->v_memory ? pdev->v_memory : dev->memory);
7653ff48bf5SDavid du Colombier int ecode, code;
7667dd7cddfSDavid du Colombier psdf_distiller_params params;
7677dd7cddfSDavid du Colombier
7689a747e4fSDavid du Colombier params = pdev->params;
7699a747e4fSDavid du Colombier
7703ff48bf5SDavid du Colombier /*
7713ff48bf5SDavid du Colombier * If LockDistillerParams was true and isn't being set to false,
772*593dc095SDavid du Colombier * ignore all other psdf parameters. However, do not ignore the
773*593dc095SDavid du Colombier * standard device parameters.
7743ff48bf5SDavid du Colombier */
7753ff48bf5SDavid du Colombier ecode = code = param_read_bool(plist, "LockDistillerParams",
7763ff48bf5SDavid du Colombier ¶ms.LockDistillerParams);
777*593dc095SDavid du Colombier if (!(pdev->params.LockDistillerParams && params.LockDistillerParams)) {
7789a747e4fSDavid du Colombier
7793ff48bf5SDavid du Colombier /* General parameters. */
7803ff48bf5SDavid du Colombier
7813ff48bf5SDavid du Colombier code = gs_param_read_items(plist, ¶ms, psdf_param_items);
7823ff48bf5SDavid du Colombier if (code < 0)
7837dd7cddfSDavid du Colombier ecode = code;
7843ff48bf5SDavid du Colombier params.AutoRotatePages = (enum psdf_auto_rotate_pages)
7853ff48bf5SDavid du Colombier psdf_put_enum(plist, "AutoRotatePages", (int)params.AutoRotatePages,
7863ff48bf5SDavid du Colombier AutoRotatePages_names, &ecode);
7873ff48bf5SDavid du Colombier params.Binding = (enum psdf_binding)
7883ff48bf5SDavid du Colombier psdf_put_enum(plist, "Binding", (int)params.Binding,
7893ff48bf5SDavid du Colombier Binding_names, &ecode);
7903ff48bf5SDavid du Colombier params.DefaultRenderingIntent = (enum psdf_default_rendering_intent)
7913ff48bf5SDavid du Colombier psdf_put_enum(plist, "DefaultRenderingIntent",
7923ff48bf5SDavid du Colombier (int)params.DefaultRenderingIntent,
7933ff48bf5SDavid du Colombier DefaultRenderingIntent_names, &ecode);
7943ff48bf5SDavid du Colombier params.TransferFunctionInfo = (enum psdf_transfer_function_info)
7953ff48bf5SDavid du Colombier psdf_put_enum(plist, "TransferFunctionInfo",
7963ff48bf5SDavid du Colombier (int)params.TransferFunctionInfo,
7973ff48bf5SDavid du Colombier TransferFunctionInfo_names, &ecode);
7983ff48bf5SDavid du Colombier params.UCRandBGInfo = (enum psdf_ucr_and_bg_info)
7993ff48bf5SDavid du Colombier psdf_put_enum(plist, "UCRandBGInfo", (int)params.UCRandBGInfo,
8003ff48bf5SDavid du Colombier UCRandBGInfo_names, &ecode);
8017dd7cddfSDavid du Colombier ecode = param_put_bool(plist, "UseFlateCompression",
8027dd7cddfSDavid du Colombier ¶ms.UseFlateCompression, ecode);
8037dd7cddfSDavid du Colombier
8047dd7cddfSDavid du Colombier /* Color sampled image parameters */
8057dd7cddfSDavid du Colombier
8063ff48bf5SDavid du Colombier ecode = psdf_put_image_params(pdev, plist, &Color_names,
8077dd7cddfSDavid du Colombier ¶ms.ColorImage, ecode);
8083ff48bf5SDavid du Colombier params.ColorConversionStrategy = (enum psdf_color_conversion_strategy)
8093ff48bf5SDavid du Colombier psdf_put_enum(plist, "ColorConversionStrategy",
8103ff48bf5SDavid du Colombier (int)params.ColorConversionStrategy,
8113ff48bf5SDavid du Colombier ColorConversionStrategy_names, &ecode);
8123ff48bf5SDavid du Colombier ecode = psdf_read_string_param(plist, "CalCMYKProfile",
8133ff48bf5SDavid du Colombier ¶ms.CalCMYKProfile, mem, ecode);
8143ff48bf5SDavid du Colombier ecode = psdf_read_string_param(plist, "CalGrayProfile",
8153ff48bf5SDavid du Colombier ¶ms.CalGrayProfile, mem, ecode);
8163ff48bf5SDavid du Colombier ecode = psdf_read_string_param(plist, "CalRGBProfile",
8173ff48bf5SDavid du Colombier ¶ms.CalRGBProfile, mem, ecode);
8183ff48bf5SDavid du Colombier ecode = psdf_read_string_param(plist, "sRGBProfile",
8193ff48bf5SDavid du Colombier ¶ms.sRGBProfile, mem, ecode);
8207dd7cddfSDavid du Colombier
8217dd7cddfSDavid du Colombier /* Gray sampled image parameters */
8227dd7cddfSDavid du Colombier
8233ff48bf5SDavid du Colombier ecode = psdf_put_image_params(pdev, plist, &Gray_names,
8247dd7cddfSDavid du Colombier ¶ms.GrayImage, ecode);
8257dd7cddfSDavid du Colombier
8267dd7cddfSDavid du Colombier /* Mono sampled image parameters */
8277dd7cddfSDavid du Colombier
8283ff48bf5SDavid du Colombier ecode = psdf_put_image_params(pdev, plist, &Mono_names,
8297dd7cddfSDavid du Colombier ¶ms.MonoImage, ecode);
8307dd7cddfSDavid du Colombier
8317dd7cddfSDavid du Colombier /* Font embedding parameters */
8327dd7cddfSDavid du Colombier
8337dd7cddfSDavid du Colombier ecode = psdf_put_embed_param(plist, "~AlwaysEmbed", ".AlwaysEmbed",
8347dd7cddfSDavid du Colombier ¶ms.AlwaysEmbed, mem, ecode);
8357dd7cddfSDavid du Colombier ecode = psdf_put_embed_param(plist, "~NeverEmbed", ".NeverEmbed",
8367dd7cddfSDavid du Colombier ¶ms.NeverEmbed, mem, ecode);
8373ff48bf5SDavid du Colombier params.CannotEmbedFontPolicy = (enum psdf_cannot_embed_font_policy)
8383ff48bf5SDavid du Colombier psdf_put_enum(plist, "CannotEmbedFontPolicy",
8393ff48bf5SDavid du Colombier (int)params.CannotEmbedFontPolicy,
8403ff48bf5SDavid du Colombier CannotEmbedFontPolicy_names, &ecode);
841*593dc095SDavid du Colombier }
8427dd7cddfSDavid du Colombier if (ecode < 0)
8437dd7cddfSDavid du Colombier return ecode;
8447dd7cddfSDavid du Colombier code = gdev_vector_put_params(dev, plist);
8457dd7cddfSDavid du Colombier if (code < 0)
8467dd7cddfSDavid du Colombier return code;
8477dd7cddfSDavid du Colombier
8487dd7cddfSDavid du Colombier pdev->params = params; /* OK to update now */
8497dd7cddfSDavid du Colombier return 0;
8507dd7cddfSDavid du Colombier }
851