diff options
Diffstat (limited to 'gs/psi/zfcid.c')
-rw-r--r-- | gs/psi/zfcid.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/gs/psi/zfcid.c b/gs/psi/zfcid.c new file mode 100644 index 000000000..5517bf40f --- /dev/null +++ b/gs/psi/zfcid.c @@ -0,0 +1,71 @@ +/* Copyright (C) 2001-2006 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* $Id$ */ +/* CID-keyed font utilities */ +#include "ghost.h" +#include "oper.h" +#include "gsmatrix.h" +#include "gxfcid.h" +#include "bfont.h" +#include "icid.h" +#include "idict.h" +#include "idparam.h" +#include "ifcid.h" +#include "store.h" + +/* Get the CIDSystemInfo of a CIDFont. */ +int +cid_font_system_info_param(gs_cid_system_info_t *pcidsi, const ref *prfont) +{ + ref *prcidsi; + + if (dict_find_string(prfont, "CIDSystemInfo", &prcidsi) <= 0) + return_error(e_rangecheck); + return cid_system_info_param(pcidsi, prcidsi); +} + +/* Get the additional information for a CIDFontType 0 or 2 CIDFont. */ +int +cid_font_data_param(os_ptr op, gs_font_cid_data *pdata, ref *pGlyphDirectory) +{ + int code; + ref *pgdir; + + check_type(*op, t_dictionary); + if ((code = cid_font_system_info_param(&pdata->CIDSystemInfo, op)) < 0 || + (code = dict_int_param(op, "CIDCount", 0, max_int, -1, + &pdata->CIDCount)) < 0 + ) + return code; + /* + * If the font doesn't have a GlyphDirectory, GDBytes is required. + * If it does have a GlyphDirectory, GDBytes may still be needed for + * CIDMap: it's up to the client to check this. + */ + if (dict_find_string(op, "GlyphDirectory", &pgdir) <= 0) { + /* Standard CIDFont, require GDBytes. */ + make_null(pGlyphDirectory); + return dict_int_param(op, "GDBytes", 1, MAX_GDBytes, 0, + &pdata->GDBytes); + } + if (r_has_type(pgdir, t_dictionary) || r_is_array(pgdir)) { + /* GlyphDirectory, GDBytes is optional. */ + *pGlyphDirectory = *pgdir; + code = dict_int_param(op, "GDBytes", 0, MAX_GDBytes, 0, + &pdata->GDBytes); + return code; + } else { + return_error(e_typecheck); + } +} |