1*593dc095SDavid du Colombier /* Copyright (C) 2002 Aladdin Enterprises. All rights reserved. 2*593dc095SDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 5*593dc095SDavid 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. 9*593dc095SDavid 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. 15*593dc095SDavid du Colombier */ 16*593dc095SDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gdevpdtf.h,v 1.28 2005/04/05 09:48:46 igor Exp $ */ 18*593dc095SDavid du Colombier /* Font and CMap resource structure and API for pdfwrite */ 19*593dc095SDavid du Colombier 20*593dc095SDavid du Colombier #ifndef gdevpdtf_INCLUDED 21*593dc095SDavid du Colombier # define gdevpdtf_INCLUDED 22*593dc095SDavid du Colombier 23*593dc095SDavid du Colombier #include "gdevpdtx.h" 24*593dc095SDavid du Colombier 25*593dc095SDavid du Colombier /* ================ Types and structures ================ */ 26*593dc095SDavid du Colombier 27*593dc095SDavid du Colombier /* ---------------- Font resources ---------------- */ 28*593dc095SDavid du Colombier 29*593dc095SDavid du Colombier /* 30*593dc095SDavid du Colombier * pdfwrite manages several different flavors of font resources: 31*593dc095SDavid du Colombier * 32*593dc095SDavid du Colombier * Those that have neither a FontDescriptor nor a base_font: 33*593dc095SDavid du Colombier * Type 0 (composite) fonts 34*593dc095SDavid du Colombier * Those that have no FontDescriptor, but do have a base_font: 35*593dc095SDavid du Colombier * Standard 14 fonts 36*593dc095SDavid du Colombier * Those that have a FontDescriptor but no base_font: 37*593dc095SDavid du Colombier * Type 3 bitmap fonts 38*593dc095SDavid du Colombier * Those that have a FontDescriptor with a base_font: 39*593dc095SDavid du Colombier * Type 1 / Type 2 fonts 40*593dc095SDavid du Colombier * Type 42 (TrueType) fonts 41*593dc095SDavid du Colombier * CIDFontType 0 (Type 1/2) CIDFonts 42*593dc095SDavid du Colombier * CIDFontType 2 (TrueType) CIDFonts 43*593dc095SDavid du Colombier */ 44*593dc095SDavid du Colombier /* 45*593dc095SDavid du Colombier * Font names in PDF files have caused an enormous amount of trouble, so we 46*593dc095SDavid du Colombier * document specifically how they are handled in each structure. 47*593dc095SDavid du Colombier * 48*593dc095SDavid du Colombier * The PDF Reference specifies the BaseFont of a font resource as follows, 49*593dc095SDavid du Colombier * depending on the font type: 50*593dc095SDavid du Colombier * 51*593dc095SDavid du Colombier * Type 0 - if the descendant font is CIDFontType 0, the descendant font 52*593dc095SDavid du Colombier * name followed by a hyphen and the CMap name (the value of Encoding, 53*593dc095SDavid du Colombier * if a name, otherwise the CMapName from the CMap); if the descendant 54*593dc095SDavid du Colombier * font is CIDFontType 2, the descendant font name. 55*593dc095SDavid du Colombier * 56*593dc095SDavid du Colombier * Type 1 - "usually" the same as the FontName in the base font. 57*593dc095SDavid du Colombier * 58*593dc095SDavid du Colombier * MM Type 1 - if embedded, the same as Type 1; if not embedded, spaces 59*593dc095SDavid du Colombier * in the font name are replaced with underscores. 60*593dc095SDavid du Colombier * 61*593dc095SDavid du Colombier * Type 3 - not used. 62*593dc095SDavid du Colombier * 63*593dc095SDavid du Colombier * TrueType - initially, the PostScript name from the 'name' table in 64*593dc095SDavid du Colombier * the font; if none, the "name by which the font is known in the host 65*593dc095SDavid du Colombier * operating system". Spaces are removed. Then, under circumstances 66*593dc095SDavid du Colombier * not defined, the string ",Bold", ",Italic", or ",BoldItalic" is 67*593dc095SDavid du Colombier * appended if the font has the corresponding style properties. 68*593dc095SDavid du Colombier * [We do not do this: we simply use the key_name or font_name.] 69*593dc095SDavid du Colombier * 70*593dc095SDavid du Colombier * CIDFontType 0 - "usually" the same as the CIDFontName in the base font. 71*593dc095SDavid du Colombier * 72*593dc095SDavid du Colombier * CIDFontType 2 - the same as TrueType. 73*593dc095SDavid du Colombier * 74*593dc095SDavid du Colombier * In addition, the BaseFont has a XXXXXX+ prefix if the font is a subset 75*593dc095SDavid du Colombier * (whether embedded or not). 76*593dc095SDavid du Colombier * 77*593dc095SDavid du Colombier * We would like to compute the BaseFont at the time that we create the font 78*593dc095SDavid du Colombier * resource object. The font descriptor (which is needed to provide 79*593dc095SDavid du Colombier * information about embedding) and the base font are both available at that 80*593dc095SDavid du Colombier * time. Unfortunately, the information as to whether the font will be 81*593dc095SDavid du Colombier * subsetted is not available. Therefore, we do compute the BaseFont from 82*593dc095SDavid du Colombier * the base font name when the font resource is created, to allow checking 83*593dc095SDavid du Colombier * for duplicate names and for standard font names, but we compute it again 84*593dc095SDavid du Colombier * after writing out the base font. 85*593dc095SDavid du Colombier */ 86*593dc095SDavid du Colombier 87*593dc095SDavid du Colombier #ifndef gs_cmap_DEFINED 88*593dc095SDavid du Colombier # define gs_cmap_DEFINED 89*593dc095SDavid du Colombier typedef struct gs_cmap_s gs_cmap_t; 90*593dc095SDavid du Colombier #endif 91*593dc095SDavid du Colombier 92*593dc095SDavid du Colombier #ifndef gs_font_type0_DEFINED 93*593dc095SDavid du Colombier # define gs_font_type0_DEFINED 94*593dc095SDavid du Colombier typedef struct gs_font_type0_s gs_font_type0; 95*593dc095SDavid du Colombier #endif 96*593dc095SDavid du Colombier 97*593dc095SDavid du Colombier #ifndef pdf_base_font_DEFINED 98*593dc095SDavid du Colombier # define pdf_base_font_DEFINED 99*593dc095SDavid du Colombier typedef struct pdf_base_font_s pdf_base_font_t; 100*593dc095SDavid du Colombier #endif 101*593dc095SDavid du Colombier 102*593dc095SDavid du Colombier #ifndef pdf_font_descriptor_DEFINED 103*593dc095SDavid du Colombier # define pdf_font_descriptor_DEFINED 104*593dc095SDavid du Colombier typedef struct pdf_font_descriptor_s pdf_font_descriptor_t; 105*593dc095SDavid du Colombier #endif 106*593dc095SDavid du Colombier 107*593dc095SDavid du Colombier #ifndef pdf_char_glyph_pair_DEFINED 108*593dc095SDavid du Colombier # define pdf_char_glyph_pair_DEFINED 109*593dc095SDavid du Colombier typedef struct pdf_char_glyph_pair_s pdf_char_glyph_pair_t; 110*593dc095SDavid du Colombier #endif 111*593dc095SDavid du Colombier 112*593dc095SDavid du Colombier struct pdf_char_glyph_pair_s { 113*593dc095SDavid du Colombier gs_char chr; 114*593dc095SDavid du Colombier gs_glyph glyph; 115*593dc095SDavid du Colombier }; 116*593dc095SDavid du Colombier 117*593dc095SDavid du Colombier /* 118*593dc095SDavid du Colombier * The write_contents procedure is set by the implementation when the 119*593dc095SDavid du Colombier * font resource is created. It is called after generic code has opened 120*593dc095SDavid du Colombier * the resource object and written the Type, BaseFont (if any), 121*593dc095SDavid du Colombier * FontDescriptor reference (if any), ToUnicode CMap reference (if any), 122*593dc095SDavid du Colombier * and additional dictionary entries (if any). 123*593dc095SDavid du Colombier * The write_contents procedure must write any remaining entries specific 124*593dc095SDavid du Colombier * to the FontType, followed by the closing ">>", and then call 125*593dc095SDavid du Colombier * pdf_end_separate. The reason for this division of function is to allow 126*593dc095SDavid du Colombier * the write_contents procedure to write additional objects that the 127*593dc095SDavid du Colombier * resource object references, after closing the resource object. 128*593dc095SDavid du Colombier */ 129*593dc095SDavid du Colombier typedef int (*pdf_font_write_contents_proc_t) 130*593dc095SDavid du Colombier (gx_device_pdf *, pdf_font_resource_t *); 131*593dc095SDavid du Colombier 132*593dc095SDavid du Colombier /* 133*593dc095SDavid du Colombier * Define an element of an Encoding. The element is unused if glyph == 134*593dc095SDavid du Colombier * GS_NO_GLYPH. 135*593dc095SDavid du Colombier */ 136*593dc095SDavid du Colombier typedef struct pdf_encoding_element_s { 137*593dc095SDavid du Colombier gs_glyph glyph; 138*593dc095SDavid du Colombier gs_const_string str; 139*593dc095SDavid du Colombier bool is_difference; /* true if must be written in Differences */ 140*593dc095SDavid du Colombier } pdf_encoding_element_t; 141*593dc095SDavid du Colombier #define private_st_pdf_encoding1() /* gdevpdtf.c */\ 142*593dc095SDavid du Colombier gs_private_st_const_strings1(st_pdf_encoding1,\ 143*593dc095SDavid du Colombier pdf_encoding_element_t, "pdf_encoding_element_t",\ 144*593dc095SDavid du Colombier pdf_encoding1_enum_ptrs, pdf_encoding1_reloc_ptrs, str) 145*593dc095SDavid du Colombier #define private_st_pdf_encoding_element() /* gdevpdtf.c */\ 146*593dc095SDavid du Colombier gs_private_st_element(st_pdf_encoding_element, pdf_encoding_element_t,\ 147*593dc095SDavid du Colombier "pdf_encoding_element_t[]", pdf_encoding_elt_enum_ptrs,\ 148*593dc095SDavid du Colombier pdf_encoding_elt_reloc_ptrs, st_pdf_encoding1) 149*593dc095SDavid du Colombier 150*593dc095SDavid du Colombier typedef struct { 151*593dc095SDavid du Colombier gs_id id; 152*593dc095SDavid du Colombier pdf_resource_type_t type; 153*593dc095SDavid du Colombier } pdf_resource_ref_t; 154*593dc095SDavid du Colombier 155*593dc095SDavid du Colombier /* 156*593dc095SDavid du Colombier * Widths are the widths in the outlines: this is what PDF interpreters 157*593dc095SDavid du Colombier * use, and what will be written in the PDF file. real_widths are the 158*593dc095SDavid du Colombier * widths possibly modified by Metrics[2] and CDevProc: these define the 159*593dc095SDavid du Colombier * actual advance widths of the characters in the PostScript text. 160*593dc095SDavid du Colombier */ 161*593dc095SDavid du Colombier struct pdf_font_resource_s { 162*593dc095SDavid du Colombier pdf_resource_common(pdf_font_resource_t); 163*593dc095SDavid du Colombier font_type FontType; /* copied from font, if any */ 164*593dc095SDavid du Colombier pdf_font_write_contents_proc_t write_contents; 165*593dc095SDavid du Colombier gs_string BaseFont; /* (not used for Type 3) */ 166*593dc095SDavid du Colombier pdf_font_descriptor_t *FontDescriptor; /* (not used for Type 0, Type 3, */ 167*593dc095SDavid du Colombier /* or standard 14 fonts) */ 168*593dc095SDavid du Colombier /* 169*593dc095SDavid du Colombier * The base_font member is only used for 170*593dc095SDavid du Colombier * the standard 14 fonts, which do not have a FontDescriptor. 171*593dc095SDavid du Colombier */ 172*593dc095SDavid du Colombier pdf_base_font_t *base_font; /* == FontDescriptor->base_font */ 173*593dc095SDavid du Colombier uint count; /* # of chars/CIDs */ 174*593dc095SDavid du Colombier double *Widths; /* [count] (not used for Type 0) */ 175*593dc095SDavid du Colombier byte *used; /* [ceil(count/8)] bitmap of chars/CIDs used */ 176*593dc095SDavid du Colombier /* (not used for Type 0 or Type 3) */ 177*593dc095SDavid du Colombier pdf_resource_t *res_ToUnicode; /* CMap (not used for CIDFonts) */ 178*593dc095SDavid du Colombier gs_cmap_t *cmap_ToUnicode; /* CMap (not used for CIDFonts) */ 179*593dc095SDavid du Colombier union { 180*593dc095SDavid du Colombier 181*593dc095SDavid du Colombier struct /*type0*/ { 182*593dc095SDavid du Colombier 183*593dc095SDavid du Colombier pdf_font_resource_t *DescendantFont; /* CIDFont */ 184*593dc095SDavid du Colombier /* 185*593dc095SDavid du Colombier * The Encoding_name must be long enough to hold either the 186*593dc095SDavid du Colombier * longest standard CMap name defined in the PDF Reference, 187*593dc095SDavid du Colombier * or the longest reference to an embedded CMap (# 0 R). 188*593dc095SDavid du Colombier */ 189*593dc095SDavid du Colombier char Encoding_name[max( /* standard name or <id> 0 R */ 190*593dc095SDavid du Colombier 17, /* /UniJIS-UCS2-HW-H */ 191*593dc095SDavid du Colombier sizeof(long) * 8 / 3 + 1 + 4 /* <id> 0 R */ 192*593dc095SDavid du Colombier ) + 1 /* \0 terminator */ 193*593dc095SDavid du Colombier ]; 194*593dc095SDavid du Colombier gs_const_string CMapName; /* copied from the original CMap, */ 195*593dc095SDavid du Colombier /* or references the table of standard names */ 196*593dc095SDavid du Colombier bool cmap_is_standard; 197*593dc095SDavid du Colombier int WMode; /* of CMap */ 198*593dc095SDavid du Colombier 199*593dc095SDavid du Colombier } type0; 200*593dc095SDavid du Colombier 201*593dc095SDavid du Colombier struct /*cidfont*/ { 202*593dc095SDavid du Colombier 203*593dc095SDavid du Colombier /* [D]W[2] is Widths. */ 204*593dc095SDavid du Colombier long CIDSystemInfo_id; /* (written when font is allocated) */ 205*593dc095SDavid du Colombier ushort *CIDToGIDMap; /* (CIDFontType 2 only) [count] */ 206*593dc095SDavid du Colombier gs_id glyphshow_font_id; 207*593dc095SDavid du Colombier double *Widths2; /* [count * 2] (x, y) */ 208*593dc095SDavid du Colombier double *v; /* [count] */ 209*593dc095SDavid du Colombier byte *used2; /* [(count + 7) / 8] */ 210*593dc095SDavid du Colombier pdf_font_resource_t *parent; 211*593dc095SDavid du Colombier 212*593dc095SDavid du Colombier } cidfont; 213*593dc095SDavid du Colombier 214*593dc095SDavid du Colombier struct /*simple*/ { 215*593dc095SDavid du Colombier 216*593dc095SDavid du Colombier int FirstChar, LastChar; /* 0 <= FirstChar <= LastChar <= 255 */ 217*593dc095SDavid du Colombier /* 218*593dc095SDavid du Colombier * The BaseEncoding can only be ENCODING_INDEX_WINANSI, 219*593dc095SDavid du Colombier * ENCODING_INDEX_MACROMAN, ENCODING_INDEX_MACEXPERT, or -1. 220*593dc095SDavid du Colombier */ 221*593dc095SDavid du Colombier gs_encoding_index_t BaseEncoding; 222*593dc095SDavid du Colombier pdf_encoding_element_t *Encoding; /* [256], not for Type 3 */ 223*593dc095SDavid du Colombier gs_point *v; /* [256], glyph origin for WMode 1 */ 224*593dc095SDavid du Colombier 225*593dc095SDavid du Colombier union { 226*593dc095SDavid du Colombier 227*593dc095SDavid du Colombier struct /*type1*/ { 228*593dc095SDavid du Colombier bool is_MM_instance; 229*593dc095SDavid du Colombier } type1; 230*593dc095SDavid du Colombier 231*593dc095SDavid du Colombier struct /*truetype*/ { 232*593dc095SDavid du Colombier /* 233*593dc095SDavid du Colombier * No extra info needed, but the ANSI standard doesn't 234*593dc095SDavid du Colombier * allow empty structs. 235*593dc095SDavid du Colombier */ 236*593dc095SDavid du Colombier int _dummy; 237*593dc095SDavid du Colombier } truetype; 238*593dc095SDavid du Colombier 239*593dc095SDavid du Colombier struct /*type3*/ { 240*593dc095SDavid du Colombier gs_int_rect FontBBox; 241*593dc095SDavid du Colombier gs_matrix FontMatrix; 242*593dc095SDavid du Colombier pdf_char_proc_t *char_procs; 243*593dc095SDavid du Colombier int max_y_offset; 244*593dc095SDavid du Colombier bool bitmap_font; 245*593dc095SDavid du Colombier pdf_resource_ref_t *used_resources; 246*593dc095SDavid du Colombier int used_resources_count; 247*593dc095SDavid du Colombier int used_resources_max; 248*593dc095SDavid du Colombier byte *cached; 249*593dc095SDavid du Colombier } type3; 250*593dc095SDavid du Colombier 251*593dc095SDavid du Colombier } s; 252*593dc095SDavid du Colombier 253*593dc095SDavid du Colombier } simple; 254*593dc095SDavid du Colombier 255*593dc095SDavid du Colombier } u; 256*593dc095SDavid du Colombier }; 257*593dc095SDavid du Colombier /* The GC descriptor for resource types must be public. */ 258*593dc095SDavid du Colombier #define public_st_pdf_font_resource() /* gdevpdtf.c */\ 259*593dc095SDavid du Colombier gs_public_st_composite(st_pdf_font_resource, pdf_font_resource_t,\ 260*593dc095SDavid du Colombier "pdf_font_resource_t", pdf_font_resource_enum_ptrs,\ 261*593dc095SDavid du Colombier pdf_font_resource_reloc_ptrs) 262*593dc095SDavid du Colombier 263*593dc095SDavid du Colombier /* 264*593dc095SDavid du Colombier * Define the possible embedding statuses of a font. 265*593dc095SDavid du Colombier */ 266*593dc095SDavid du Colombier typedef enum { 267*593dc095SDavid du Colombier FONT_EMBED_STANDARD, /* 14 standard fonts */ 268*593dc095SDavid du Colombier FONT_EMBED_NO, 269*593dc095SDavid du Colombier FONT_EMBED_YES 270*593dc095SDavid du Colombier } pdf_font_embed_t; 271*593dc095SDavid du Colombier 272*593dc095SDavid du Colombier /* ---------------- Global structures ---------------- */ 273*593dc095SDavid du Colombier 274*593dc095SDavid du Colombier /* 275*593dc095SDavid du Colombier * Define a structure for keeping track of the (unique) resource for 276*593dc095SDavid du Colombier * each standard font. Note that standard fonts do not have descriptors: 277*593dc095SDavid du Colombier * the base_font and copied_font members of the font resource provide the 278*593dc095SDavid du Colombier * necessary information. 279*593dc095SDavid du Colombier */ 280*593dc095SDavid du Colombier typedef struct pdf_standard_font_s { 281*593dc095SDavid du Colombier pdf_font_resource_t *pdfont; 282*593dc095SDavid du Colombier gs_matrix orig_matrix; /* ****** do we need this? */ 283*593dc095SDavid du Colombier } pdf_standard_font_t; 284*593dc095SDavid du Colombier #define private_st_pdf_standard_font() /* gdevpdtf.c */\ 285*593dc095SDavid du Colombier gs_private_st_ptrs1(st_pdf_standard_font, pdf_standard_font_t,\ 286*593dc095SDavid du Colombier "pdf_standard_font_t", pdf_std_font_enum_ptrs, pdf_std_font_reloc_ptrs,\ 287*593dc095SDavid du Colombier pdfont) 288*593dc095SDavid du Colombier #define private_st_pdf_standard_font_element() /* gdevpdtf.c */\ 289*593dc095SDavid du Colombier gs_private_st_element(st_pdf_standard_font_element, pdf_standard_font_t,\ 290*593dc095SDavid du Colombier "pdf_standard_font_t[]", pdf_std_font_elt_enum_ptrs,\ 291*593dc095SDavid du Colombier pdf_std_font_elt_reloc_ptrs, st_pdf_standard_font) 292*593dc095SDavid du Colombier 293*593dc095SDavid du Colombier /* 294*593dc095SDavid du Colombier * There is a single instance (per device) of a structure that tracks global 295*593dc095SDavid du Colombier * information about outline fonts. It is defined here, rather than 296*593dc095SDavid du Colombier * opaquely in the implementation file, because the text processing code 297*593dc095SDavid du Colombier * needs access to it. 298*593dc095SDavid du Colombier */ 299*593dc095SDavid du Colombier 300*593dc095SDavid du Colombier /*typedef struct pdf_outline_fonts_s pdf_outline_fonts_t;*/ /* gdevpdtx.h */ 301*593dc095SDavid du Colombier struct pdf_outline_fonts_s { 302*593dc095SDavid du Colombier pdf_standard_font_t *standard_fonts; /* [PDF_NUM_STANDARD_FONTS] */ 303*593dc095SDavid du Colombier }; 304*593dc095SDavid du Colombier #define private_st_pdf_outline_fonts() /* gdevpdtf.c */\ 305*593dc095SDavid du Colombier gs_private_st_ptrs1(st_pdf_outline_fonts, pdf_outline_fonts_t,\ 306*593dc095SDavid du Colombier "pdf_outline_fonts_t", pdf_outline_fonts_enum_ptrs,\ 307*593dc095SDavid du Colombier pdf_outline_fonts_reloc_ptrs, standard_fonts) 308*593dc095SDavid du Colombier 309*593dc095SDavid du Colombier /* ================ Procedures ================ */ 310*593dc095SDavid du Colombier 311*593dc095SDavid du Colombier /* ---------------- Font resources ---------------- */ 312*593dc095SDavid du Colombier 313*593dc095SDavid du Colombier /* 314*593dc095SDavid du Colombier * Allocate and initialize bookkeeping for outline fonts. 315*593dc095SDavid du Colombier */ 316*593dc095SDavid du Colombier pdf_outline_fonts_t *pdf_outline_fonts_alloc(gs_memory_t *mem); 317*593dc095SDavid du Colombier 318*593dc095SDavid du Colombier /* 319*593dc095SDavid du Colombier * Return the standard fonts array. 320*593dc095SDavid du Colombier */ 321*593dc095SDavid du Colombier pdf_standard_font_t *pdf_standard_fonts(const gx_device_pdf *pdev); 322*593dc095SDavid du Colombier 323*593dc095SDavid du Colombier /* 324*593dc095SDavid du Colombier * Clean the standard fonts array. 325*593dc095SDavid du Colombier */ 326*593dc095SDavid du Colombier void pdf_clean_standard_fonts(const gx_device_pdf *pdev); 327*593dc095SDavid du Colombier 328*593dc095SDavid du Colombier /* Free font cache. */ 329*593dc095SDavid du Colombier int pdf_free_font_cache(gx_device_pdf *pdev); 330*593dc095SDavid du Colombier 331*593dc095SDavid du Colombier /* 332*593dc095SDavid du Colombier * Allocate specific types of font resource. 333*593dc095SDavid du Colombier */ 334*593dc095SDavid du Colombier int pdf_font_type0_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 335*593dc095SDavid du Colombier gs_id rid, pdf_font_resource_t *DescendantFont, 336*593dc095SDavid du Colombier const gs_const_string *CMapName); 337*593dc095SDavid du Colombier int pdf_font_type3_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 338*593dc095SDavid du Colombier pdf_font_write_contents_proc_t write_contents); 339*593dc095SDavid du Colombier int pdf_font_std_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 340*593dc095SDavid du Colombier bool is_original, gs_id rid, gs_font_base *pfont, int index); 341*593dc095SDavid du Colombier int pdf_font_simple_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 342*593dc095SDavid du Colombier gs_id rid, pdf_font_descriptor_t *pfd); 343*593dc095SDavid du Colombier int pdf_font_cidfont_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 344*593dc095SDavid du Colombier gs_id rid, pdf_font_descriptor_t *pfd); 345*593dc095SDavid du Colombier int pdf_obtain_cidfont_widths_arrays(gx_device_pdf *pdev, pdf_font_resource_t *pdfont, 346*593dc095SDavid du Colombier int wmode, double **w, double **w0, double **v); 347*593dc095SDavid du Colombier int font_resource_encoded_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres, 348*593dc095SDavid du Colombier gs_id rid, font_type ftype, 349*593dc095SDavid du Colombier pdf_font_write_contents_proc_t write_contents); 350*593dc095SDavid du Colombier 351*593dc095SDavid du Colombier /* Resize font resource arrays. */ 352*593dc095SDavid du Colombier int pdf_resize_resource_arrays(gx_device_pdf *pdev, pdf_font_resource_t *pfres, 353*593dc095SDavid du Colombier int chars_count); 354*593dc095SDavid du Colombier 355*593dc095SDavid du Colombier /* 356*593dc095SDavid du Colombier * Return the (copied, subset or complete) font associated with a font resource. 357*593dc095SDavid du Colombier * If this font resource doesn't have a descriptor (Type 0, Type 3, or 358*593dc095SDavid du Colombier * standard 14), return 0. 359*593dc095SDavid du Colombier */ 360*593dc095SDavid du Colombier gs_font_base *pdf_font_resource_font(const pdf_font_resource_t *pdfont, bool complete); 361*593dc095SDavid du Colombier 362*593dc095SDavid du Colombier /* 363*593dc095SDavid du Colombier * Determine the embedding status of a font. If the font is in the base 364*593dc095SDavid du Colombier * 14, store its index (0..13) in *pindex and its similarity to the base 365*593dc095SDavid du Colombier * font (as determined by the font's same_font procedure) in *psame. 366*593dc095SDavid du Colombier * (pindex and/or psame may be NULL.) 367*593dc095SDavid du Colombier */ 368*593dc095SDavid du Colombier pdf_font_embed_t pdf_font_embed_status(gx_device_pdf *pdev, gs_font *font, 369*593dc095SDavid du Colombier int *pindex, 370*593dc095SDavid du Colombier pdf_char_glyph_pair_t *pairs, int num_glyphs); 371*593dc095SDavid du Colombier 372*593dc095SDavid du Colombier /* 373*593dc095SDavid du Colombier * Compute the BaseFont of a font according to the algorithm described 374*593dc095SDavid du Colombier * above. 375*593dc095SDavid du Colombier */ 376*593dc095SDavid du Colombier int pdf_compute_BaseFont(gx_device_pdf *pdev, pdf_font_resource_t *pdfont, bool finish); 377*593dc095SDavid du Colombier 378*593dc095SDavid du Colombier /* 379*593dc095SDavid du Colombier * Close the text-related parts of a document, including writing out font 380*593dc095SDavid du Colombier * and related resources. 381*593dc095SDavid du Colombier */ 382*593dc095SDavid du Colombier int pdf_close_text_document(gx_device_pdf *pdev); /* in gdevpdtw.c */ 383*593dc095SDavid du Colombier 384*593dc095SDavid du Colombier /* 385*593dc095SDavid du Colombier * Choose a name for embedded font. 386*593dc095SDavid du Colombier */ 387*593dc095SDavid du Colombier const gs_font_name *pdf_choose_font_name(gs_font *font, bool key_name); 388*593dc095SDavid du Colombier 389*593dc095SDavid du Colombier /* ---------------- CMap resources ---------------- */ 390*593dc095SDavid du Colombier 391*593dc095SDavid du Colombier /* 392*593dc095SDavid du Colombier * Allocate a CMap resource. 393*593dc095SDavid du Colombier */ 394*593dc095SDavid du Colombier int pdf_cmap_alloc(gx_device_pdf *pdev, const gs_cmap_t *pcmap, 395*593dc095SDavid du Colombier pdf_resource_t **ppres /* CMap */, int font_index_only); 396*593dc095SDavid du Colombier 397*593dc095SDavid du Colombier /* 398*593dc095SDavid du Colombier * Add a CID-to-GID mapping to a CIDFontType 2 font resource. 399*593dc095SDavid du Colombier */ 400*593dc095SDavid du Colombier int pdf_font_add_cid_to_gid(pdf_font_resource_t *pdfont, uint cid, uint gid); 401*593dc095SDavid du Colombier 402*593dc095SDavid du Colombier #endif /* gdevpdtf_INCLUDED */ 403