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: gdevpdtd.h,v 1.5 2005/04/05 15:44:44 igor Exp $ */ 18*593dc095SDavid du Colombier /* FontDescriptor structure and API for pdfwrite */ 19*593dc095SDavid du Colombier 20*593dc095SDavid du Colombier #ifndef gdevpdtd_INCLUDED 21*593dc095SDavid du Colombier # define gdevpdtd_INCLUDED 22*593dc095SDavid du Colombier 23*593dc095SDavid du Colombier #include "gdevpdtx.h" 24*593dc095SDavid du Colombier #include "gdevpdtb.h" 25*593dc095SDavid du Colombier 26*593dc095SDavid du Colombier /* ================ Types and structures ================ */ 27*593dc095SDavid du Colombier 28*593dc095SDavid du Colombier /* 29*593dc095SDavid du Colombier * FontDescriptors are handled as pseudo-resources. Multiple Font resources 30*593dc095SDavid du Colombier * may share a descriptor. We don't need to use reference counting to keep 31*593dc095SDavid du Colombier * track of this, since all descriptors persist until the device is closed. 32*593dc095SDavid du Colombier * The CharSet entry in the FontDescriptor for a Type 1 subset font lists 33*593dc095SDavid du Colombier * the glyphs that are included in the subset, so the FontDescriptor cannot 34*593dc095SDavid du Colombier * be written until the font has been written, but we could use an indirect 35*593dc095SDavid du Colombier * object for the CharSet and write the FontDescriptor itself early. 36*593dc095SDavid du Colombier * However, we don't think that is worthwhile, since FontDescriptors are 37*593dc095SDavid du Colombier * small objects compared to the fonts themselves, and it's simpler to keep 38*593dc095SDavid du Colombier * all the FontDescriptors until the end. 39*593dc095SDavid du Colombier * 40*593dc095SDavid du Colombier * Note that FontDescriptors and BaseFonts correspond 1-to-1. While the PDF 41*593dc095SDavid du Colombier * specification allows multiple FontDescriptors for a single BaseFont, this 42*593dc095SDavid du Colombier * has no value: all the information in the FontDescriptor is derived from 43*593dc095SDavid du Colombier * the BaseFont, so all the FontDescriptors for the same BaseFont must be 44*593dc095SDavid du Colombier * the same. 45*593dc095SDavid du Colombier */ 46*593dc095SDavid du Colombier /* 47*593dc095SDavid du Colombier * Font names in PDF files have caused an enormous amount of trouble, so we 48*593dc095SDavid du Colombier * document specifically how they are handled in each structure. 49*593dc095SDavid du Colombier * 50*593dc095SDavid du Colombier * The PDF Reference says that the FontName in a font descriptor must be 51*593dc095SDavid du Colombier * the same as the BaseFont in the font or CIDFont resource(s) that 52*593dc095SDavid du Colombier * reference(s) it. 53*593dc095SDavid du Colombier * 54*593dc095SDavid du Colombier * We never create a font descriptor without also creating a font resource 55*593dc095SDavid du Colombier * that references it, so we set the FontName at the same time as the 56*593dc095SDavid du Colombier * BaseFont of the font resource. For more information, see gdevpdtf.h. 57*593dc095SDavid du Colombier */ 58*593dc095SDavid du Colombier 59*593dc095SDavid du Colombier #ifndef pdf_font_descriptor_DEFINED 60*593dc095SDavid du Colombier # define pdf_font_descriptor_DEFINED 61*593dc095SDavid du Colombier typedef struct pdf_font_descriptor_s pdf_font_descriptor_t; 62*593dc095SDavid du Colombier #endif 63*593dc095SDavid du Colombier 64*593dc095SDavid du Colombier /* ================ Procedures ================ */ 65*593dc095SDavid du Colombier 66*593dc095SDavid du Colombier /* 67*593dc095SDavid du Colombier * Allocate a FontDescriptor, initializing the FontType and rid from the 68*593dc095SDavid du Colombier * gs_font. 69*593dc095SDavid du Colombier */ 70*593dc095SDavid du Colombier int pdf_font_descriptor_alloc(gx_device_pdf *pdev, 71*593dc095SDavid du Colombier pdf_font_descriptor_t **ppfd, 72*593dc095SDavid du Colombier gs_font_base *font, bool embed); 73*593dc095SDavid du Colombier 74*593dc095SDavid du Colombier /* 75*593dc095SDavid du Colombier * Get the object ID of a FontDescriptor. 76*593dc095SDavid du Colombier */ 77*593dc095SDavid du Colombier long pdf_font_descriptor_id(const pdf_font_descriptor_t *pfd); 78*593dc095SDavid du Colombier 79*593dc095SDavid du Colombier /* 80*593dc095SDavid du Colombier * Get the FontType of a FontDescriptor. 81*593dc095SDavid du Colombier */ 82*593dc095SDavid du Colombier font_type pdf_font_descriptor_FontType(const pdf_font_descriptor_t *pfd); 83*593dc095SDavid du Colombier 84*593dc095SDavid du Colombier /* 85*593dc095SDavid du Colombier * Get the embedding status of a FontDescriptor. 86*593dc095SDavid du Colombier */ 87*593dc095SDavid du Colombier bool pdf_font_descriptor_embedding(const pdf_font_descriptor_t *pfd); 88*593dc095SDavid du Colombier 89*593dc095SDavid du Colombier /* 90*593dc095SDavid du Colombier * Check for subset font. 91*593dc095SDavid du Colombier */ 92*593dc095SDavid du Colombier bool pdf_font_descriptor_is_subset(const pdf_font_descriptor_t *pfd); 93*593dc095SDavid du Colombier 94*593dc095SDavid du Colombier /* 95*593dc095SDavid du Colombier * Return a reference to the FontName of a FontDescriptor, similar to 96*593dc095SDavid du Colombier * pdf_base_font_name. 97*593dc095SDavid du Colombier */ 98*593dc095SDavid du Colombier gs_string *pdf_font_descriptor_name(pdf_font_descriptor_t *pfd); 99*593dc095SDavid du Colombier 100*593dc095SDavid du Colombier /* 101*593dc095SDavid du Colombier * Return the (copied, subset or complete) font associated with a FontDescriptor. 102*593dc095SDavid du Colombier * This procedure probably shouldn't exist.... 103*593dc095SDavid du Colombier */ 104*593dc095SDavid du Colombier gs_font_base *pdf_font_descriptor_font(const pdf_font_descriptor_t *pfd, bool complete); 105*593dc095SDavid du Colombier 106*593dc095SDavid du Colombier /* 107*593dc095SDavid du Colombier * Drop the copied complete font associated with a FontDescriptor. 108*593dc095SDavid du Colombier */ 109*593dc095SDavid du Colombier void pdf_font_descriptor_drop_complete_font(const pdf_font_descriptor_t *pfd); 110*593dc095SDavid du Colombier 111*593dc095SDavid du Colombier /* 112*593dc095SDavid du Colombier * Return a reference to the name of a FontDescriptor's base font, per 113*593dc095SDavid du Colombier * pdf_base_font_name. 114*593dc095SDavid du Colombier */ 115*593dc095SDavid du Colombier gs_string *pdf_font_descriptor_base_name(const pdf_font_descriptor_t *pfd); 116*593dc095SDavid du Colombier 117*593dc095SDavid du Colombier /* 118*593dc095SDavid du Colombier * Copy a glyph from a font to the stable copy. Return 0 if this is a 119*593dc095SDavid du Colombier * new glyph, 1 if it was already copied. 120*593dc095SDavid du Colombier */ 121*593dc095SDavid du Colombier int pdf_font_used_glyph(pdf_font_descriptor_t *pfd, gs_glyph glyph, 122*593dc095SDavid du Colombier gs_font_base *font); 123*593dc095SDavid du Colombier 124*593dc095SDavid du Colombier /* 125*593dc095SDavid du Colombier * Compute the FontDescriptor metrics for a font. 126*593dc095SDavid du Colombier */ 127*593dc095SDavid du Colombier int pdf_compute_font_descriptor(pdf_font_descriptor_t *pfd); 128*593dc095SDavid du Colombier 129*593dc095SDavid du Colombier /* 130*593dc095SDavid du Colombier * Finish a FontDescriptor by computing the metric values, and then 131*593dc095SDavid du Colombier * writing the associated embedded font if any. 132*593dc095SDavid du Colombier */ 133*593dc095SDavid du Colombier int pdf_finish_FontDescriptor(gx_device_pdf *pdev, 134*593dc095SDavid du Colombier pdf_font_descriptor_t *pfd); 135*593dc095SDavid du Colombier 136*593dc095SDavid du Colombier int pdf_finish_font_descriptors(gx_device_pdf *pdev, 137*593dc095SDavid du Colombier int (*finish_proc)(gx_device_pdf *, 138*593dc095SDavid du Colombier pdf_font_descriptor_t *)); 139*593dc095SDavid du Colombier /* 140*593dc095SDavid du Colombier * Write a FontDescriptor. 141*593dc095SDavid du Colombier */ 142*593dc095SDavid du Colombier int pdf_write_FontDescriptor(gx_device_pdf *pdev, 143*593dc095SDavid du Colombier pdf_font_descriptor_t *pfd); 144*593dc095SDavid du Colombier 145*593dc095SDavid du Colombier /* 146*593dc095SDavid du Colombier * Release a FontDescriptor components. 147*593dc095SDavid du Colombier */ 148*593dc095SDavid du Colombier int pdf_release_FontDescriptor_components(gx_device_pdf *pdev, pdf_font_descriptor_t *pfd); 149*593dc095SDavid du Colombier 150*593dc095SDavid du Colombier #endif /* gdevpdtd_INCLUDED */ 151