17dd7cddfSDavid du Colombier /* Copyright (C) 1991, 1995, 1996, 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: zfont2.c,v 1.7 2004/08/04 19:36:13 stefan Exp $ */
187dd7cddfSDavid du Colombier /* Type 2 font creation operators */
197dd7cddfSDavid du Colombier #include "ghost.h"
207dd7cddfSDavid du Colombier #include "oper.h"
217dd7cddfSDavid du Colombier #include "gxfixed.h"
227dd7cddfSDavid du Colombier #include "gsmatrix.h"
237dd7cddfSDavid du Colombier #include "gxfont.h"
247dd7cddfSDavid du Colombier #include "gxfont1.h"
257dd7cddfSDavid du Colombier #include "bfont.h"
267dd7cddfSDavid du Colombier #include "idict.h"
277dd7cddfSDavid du Colombier #include "idparam.h"
287dd7cddfSDavid du Colombier #include "ifont1.h"
293ff48bf5SDavid du Colombier #include "ifont2.h"
30*593dc095SDavid du Colombier #include "ialloc.h"
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier /* Private utilities */
337dd7cddfSDavid du Colombier private uint
subr_bias(const ref * psubrs)347dd7cddfSDavid du Colombier subr_bias(const ref * psubrs)
357dd7cddfSDavid du Colombier {
367dd7cddfSDavid du Colombier uint size = r_size(psubrs);
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier return (size < 1240 ? 107 : size < 33900 ? 1131 : 32768);
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier
413ff48bf5SDavid du Colombier /*
423ff48bf5SDavid du Colombier * Get the additional parameters for a Type 2 font (or FontType 2 FDArray
433ff48bf5SDavid du Colombier * entry in a CIDFontType 0 font), beyond those common to Type 1 and Type 2
443ff48bf5SDavid du Colombier * fonts.
453ff48bf5SDavid du Colombier */
463ff48bf5SDavid du Colombier int
type2_font_params(const_os_ptr op,charstring_font_refs_t * pfr,gs_type1_data * pdata1)473ff48bf5SDavid du Colombier type2_font_params(const_os_ptr op, charstring_font_refs_t *pfr,
483ff48bf5SDavid du Colombier gs_type1_data *pdata1)
493ff48bf5SDavid du Colombier {
503ff48bf5SDavid du Colombier int code;
513ff48bf5SDavid du Colombier float dwx, nwx;
523ff48bf5SDavid du Colombier ref *temp;
533ff48bf5SDavid du Colombier
543ff48bf5SDavid du Colombier pdata1->interpret = gs_type2_interpret;
553ff48bf5SDavid du Colombier pdata1->lenIV = DEFAULT_LENIV_2;
563ff48bf5SDavid du Colombier pdata1->subroutineNumberBias = subr_bias(pfr->Subrs);
573ff48bf5SDavid du Colombier /* Get information specific to Type 2 fonts. */
583ff48bf5SDavid du Colombier if (dict_find_string(pfr->Private, "GlobalSubrs", &temp) > 0) {
593ff48bf5SDavid du Colombier if (!r_is_array(temp))
603ff48bf5SDavid du Colombier return_error(e_typecheck);
613ff48bf5SDavid du Colombier pfr->GlobalSubrs = temp;
623ff48bf5SDavid du Colombier }
633ff48bf5SDavid du Colombier pdata1->gsubrNumberBias = subr_bias(pfr->GlobalSubrs);
643ff48bf5SDavid du Colombier if ((code = dict_uint_param(pfr->Private, "gsubrNumberBias",
653ff48bf5SDavid du Colombier 0, max_uint, pdata1->gsubrNumberBias,
663ff48bf5SDavid du Colombier &pdata1->gsubrNumberBias)) < 0 ||
673ff48bf5SDavid du Colombier (code = dict_float_param(pfr->Private, "defaultWidthX", 0.0,
683ff48bf5SDavid du Colombier &dwx)) < 0 ||
693ff48bf5SDavid du Colombier (code = dict_float_param(pfr->Private, "nominalWidthX", 0.0,
703ff48bf5SDavid du Colombier &nwx)) < 0
713ff48bf5SDavid du Colombier )
723ff48bf5SDavid du Colombier return code;
733ff48bf5SDavid du Colombier pdata1->defaultWidthX = float2fixed(dwx);
743ff48bf5SDavid du Colombier pdata1->nominalWidthX = float2fixed(nwx);
753ff48bf5SDavid du Colombier {
763ff48bf5SDavid du Colombier ref *pirs;
773ff48bf5SDavid du Colombier
783ff48bf5SDavid du Colombier if (dict_find_string(pfr->Private, "initialRandomSeed", &pirs) <= 0)
793ff48bf5SDavid du Colombier pdata1->initialRandomSeed = 0;
803ff48bf5SDavid du Colombier else if (!r_has_type(pirs, t_integer))
813ff48bf5SDavid du Colombier return_error(e_typecheck);
823ff48bf5SDavid du Colombier else
833ff48bf5SDavid du Colombier pdata1->initialRandomSeed = pirs->value.intval;
843ff48bf5SDavid du Colombier }
853ff48bf5SDavid du Colombier return 0;
863ff48bf5SDavid du Colombier }
873ff48bf5SDavid du Colombier
887dd7cddfSDavid du Colombier /* <string|name> <font_dict> .buildfont2 <string|name> <font> */
897dd7cddfSDavid du Colombier /* Build a type 2 (compact Adobe encrypted) font. */
907dd7cddfSDavid du Colombier private int
zbuildfont2(i_ctx_t * i_ctx_p)917dd7cddfSDavid du Colombier zbuildfont2(i_ctx_t *i_ctx_p)
927dd7cddfSDavid du Colombier {
937dd7cddfSDavid du Colombier os_ptr op = osp;
947dd7cddfSDavid du Colombier charstring_font_refs_t refs;
957dd7cddfSDavid du Colombier build_proc_refs build;
96*593dc095SDavid du Colombier int code = build_proc_name_refs(imemory, &build,
977dd7cddfSDavid du Colombier "%Type2BuildChar", "%Type2BuildGlyph");
987dd7cddfSDavid du Colombier gs_type1_data data1;
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier if (code < 0)
1017dd7cddfSDavid du Colombier return code;
1027dd7cddfSDavid du Colombier code = charstring_font_get_refs(op, &refs);
1037dd7cddfSDavid du Colombier if (code < 0)
1047dd7cddfSDavid du Colombier return code;
1053ff48bf5SDavid du Colombier code = type2_font_params(op, &refs, &data1);
1063ff48bf5SDavid du Colombier if (code < 0)
1077dd7cddfSDavid du Colombier return code;
1087dd7cddfSDavid du Colombier return build_charstring_font(i_ctx_p, op, &build, ft_encrypted2, &refs,
1097dd7cddfSDavid du Colombier &data1, bf_notdef_required);
1107dd7cddfSDavid du Colombier }
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier /* ------ Initialization procedure ------ */
1137dd7cddfSDavid du Colombier
1147dd7cddfSDavid du Colombier const op_def zfont2_op_defs[] =
1157dd7cddfSDavid du Colombier {
1167dd7cddfSDavid du Colombier {"2.buildfont2", zbuildfont2},
1177dd7cddfSDavid du Colombier op_def_end(0)
1187dd7cddfSDavid du Colombier };
119