summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/xsrc/pdffont.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfm-x/xsrc/pdffont.c')
-rw-r--r--Build/source/texk/dvipdfm-x/xsrc/pdffont.c1012
1 files changed, 0 insertions, 1012 deletions
diff --git a/Build/source/texk/dvipdfm-x/xsrc/pdffont.c b/Build/source/texk/dvipdfm-x/xsrc/pdffont.c
deleted file mode 100644
index e9ba84acac5..00000000000
--- a/Build/source/texk/dvipdfm-x/xsrc/pdffont.c
+++ /dev/null
@@ -1,1012 +0,0 @@
-/*
-
- This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
-
- Copyright (C) 2008-2012 by Jin-Hwan Cho, Matthias Franz, and Shunsaku Hirata,
- the dvipdfmx project team.
-
- Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <time.h>
-
-#include "system.h"
-#include "error.h"
-#include "mem.h"
-
-#include "dpxfile.h"
-#include "dpxutil.h"
-
-#include "pdfobj.h"
-
-#include "pdfencoding.h"
-#include "cmap.h"
-#include "unicode.h"
-
-#include "type1.h"
-#include "type1c.h"
-#include "truetype.h"
-
-#include "pkfont.h"
-
-#include "type0.h"
-#include "tt_cmap.h"
-#include "cidtype0.h"
-#include "otl_conf.h"
-
-#include "pdffont.h"
-
-static int __verbose = 0;
-
-#define MREC_HAS_TOUNICODE(m) ((m) && (m)->opt.tounicode)
-
-void
-pdf_font_set_verbose (void)
-{
- __verbose++;
- CMap_set_verbose();
- Type0Font_set_verbose();
- CIDFont_set_verbose ();
- pdf_encoding_set_verbose();
- UC_set_verbose ();
- agl_set_verbose();
- otl_conf_set_verbose();
- otf_cmap_set_verbose ();
-}
-
-int
-pdf_font_get_verbose (void)
-{
- return __verbose;
-}
-
-void
-pdf_font_set_dpi (int font_dpi)
-{
- PKFont_set_dpi(font_dpi);
-}
-
-void
-pdf_font_make_uniqueTag (char *tag)
-{
- int i;
- char ch;
- static char first = 1;
-
- if (first) {
- srand(time(NULL));
- first = 0;
- }
-
- for (i = 0; i < 6; i++) {
- ch = rand() % 26;
- tag[i] = ch + 'A';
- }
- tag[6] = '\0';
-}
-
-
-struct pdf_font
-{
-#ifdef XETEX
- FT_Face ft_face;
- unsigned short *ft_to_gid;
-#endif
-
- char *ident;
- int subtype;
-
- char *map_name;
-
- int encoding_id; /* encoding or CMap */
-
- /*
- * If subtype is Type0, it simply points font_id
- * of Type0 font. Type0 and simple font is not
- * unified yet.
- */
- int font_id;
-
- /* For simple font */
- int index;
- char *fontname;
- char uniqueID[7];
-
- /*
- * PDF font resource objects
- */
- pdf_obj *reference;
- pdf_obj *resource;
- pdf_obj *descriptor;
-
- /*
- * Font format specific data
- */
- char *usedchars;
- int flags;
-
- /* PK font */
- double point_size;
- double design_size;
-};
-
-static void
-pdf_init_font_struct (pdf_font *font)
-{
- ASSERT(font);
-
-#ifdef XETEX
- font->ft_face = NULL;
-#endif
-
- font->ident = NULL;
- font->map_name = NULL;
- font->subtype = -1;
- font->font_id = -1; /* Type0 ID */
- font->fontname = NULL;
- memset(font->uniqueID, 0, 7);
- font->index = 0;
-
- font->encoding_id = -1;
-
- font->reference = NULL;
- font->resource = NULL;
- font->descriptor = NULL;
-
- font->point_size = 0;
- font->design_size = 0;
-
- font->usedchars = NULL;
- font->flags = 0;
-
- return;
-}
-
-static void
-pdf_flush_font (pdf_font *font)
-{
- char *fontname, *uniqueTag;
-
- if (!font) {
- return;
- }
-
- if (font->resource && font->reference) {
- if (font->subtype != PDF_FONT_FONTTYPE_TYPE3) {
- if (pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED)) {
- pdf_add_dict(font->resource,
- pdf_new_name("BaseFont"), pdf_new_name(font->fontname));
- if (font->descriptor) {
- pdf_add_dict(font->descriptor,
- pdf_new_name("FontName"), pdf_new_name(font->fontname));
- }
- } else {
- if (!font->fontname) {
- ERROR("Undefined in fontname... (%s)", font->ident);
- }
- fontname = NEW(7+strlen(font->fontname)+1, char);
- uniqueTag = pdf_font_get_uniqueTag(font);
- sprintf(fontname, "%6s+%s", uniqueTag, font->fontname);
- pdf_add_dict(font->resource,
- pdf_new_name("BaseFont"), pdf_new_name(fontname));
- if (font->descriptor) {
- pdf_add_dict(font->descriptor,
- pdf_new_name("FontName"), pdf_new_name(fontname));
- }
- RELEASE(fontname);
- }
- if (font->descriptor) {
- pdf_add_dict(font->resource,
- pdf_new_name("FontDescriptor"), pdf_ref_obj(font->descriptor));
- }
- }
- }
-
- if (font->resource)
- pdf_release_obj(font->resource);
- if (font->descriptor)
- pdf_release_obj(font->descriptor);
- if (font->reference)
- pdf_release_obj(font->reference);
-
- font->reference = NULL;
- font->resource = NULL;
- font->descriptor = NULL;
-
- return;
-}
-
-static void
-pdf_clean_font_struct (pdf_font *font)
-{
- if (font) {
- if (font->ident)
- RELEASE(font->ident);
- if (font->map_name)
- RELEASE(font->map_name);
- if (font->fontname)
- RELEASE(font->fontname);
- if (font->usedchars)
- RELEASE(font->usedchars);
-
- if (font->reference)
- ERROR("pdf_font>> Object not flushed.");
- if (font->resource)
- ERROR("pdf_font> Object not flushed.");
- if (font->descriptor)
- ERROR("pdf_font>> Object not flushed.");
-
- font->ident = NULL;
- font->map_name = NULL;
- font->fontname = NULL;
- font->usedchars = NULL;
- }
-
- return;
-}
-
-#define CACHE_ALLOC_SIZE 16u
-
-static struct {
- int count;
- int capacity;
- pdf_font *fonts;
-} font_cache = {
- 0, 0, NULL
-};
-
-void
-pdf_init_fonts (void)
-{
- ASSERT(font_cache.fonts == NULL);
-
- agl_init_map();
- otl_init_conf();
-
- CMap_cache_init();
- pdf_init_encodings();
-
- Type0Font_cache_init();
-
- font_cache.count = 0;
- font_cache.capacity = CACHE_ALLOC_SIZE;
- font_cache.fonts = NEW(font_cache.capacity, pdf_font);
-}
-
-#define CHECK_ID(n) do {\
- if ((n) < 0 || (n) >= font_cache.count) {\
- ERROR("Invalid font ID: %d", (n));\
- }\
-} while (0)
-#define GET_FONT(n) (&(font_cache.fonts[(n)]))
-
-
-pdf_obj *
-pdf_get_font_reference (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
- Type0Font *t0font;
-
- t0font = Type0Font_cache_get(font->font_id);
- return Type0Font_get_resource(t0font);
- } else {
- if (!font->reference) {
- font->reference = pdf_ref_obj(pdf_font_get_resource(font));
- }
- }
-
- return pdf_link_obj(font->reference);
-}
-
-char *
-pdf_get_font_usedchars (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
- Type0Font *t0font;
-
- t0font = Type0Font_cache_get(font->font_id);
- return Type0Font_get_usedchars(t0font);
- } else {
- if (!font->usedchars) {
- font->usedchars = NEW(256, char);
- memset(font->usedchars, 0, 256 * sizeof(char));
- }
- return font->usedchars;
- }
-}
-
-int
-pdf_get_font_wmode (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
- Type0Font *t0font;
-
- t0font = Type0Font_cache_get(font->font_id);
- return Type0Font_get_wmode(t0font);
- } else {
- return 0;
- }
-}
-
-int
-pdf_get_font_subtype (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
-
- return font->subtype;
-}
-
-#if 0
-char *
-pdf_get_font_fontname (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
-
- return font->fontname;
-}
-#endif /* 0 */
-
-int
-pdf_get_font_encoding (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
-
- return font->encoding_id;
-}
-
-/* The rule for ToUnicode creation is:
- *
- * If "tounicode" option is specified in fontmap, use that.
- * If there is ToUnicode CMap with same name as TFM, use that.
- * If no "tounicode" option is used and no ToUnicode CMap with
- * same name as TFM is found, create ToUnicode CMap from glyph
- * names and AGL file.
- */
-static int
-try_load_ToUnicode_CMap (pdf_font *font)
-{
- pdf_obj *fontdict;
- pdf_obj *tounicode;
- const char *cmap_name = NULL;
- fontmap_rec *mrec; /* Be sure fontmap is still alive here */
-
- ASSERT(font);
-
- /* We are using different encoding for Type0 font.
- * This feature is unavailable for them.
- */
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0)
- return 0;
-
- ASSERT(font->map_name);
-
- mrec = pdf_lookup_fontmap_record(font->map_name);
- if (MREC_HAS_TOUNICODE(mrec))
- cmap_name = mrec->opt.tounicode;
- else {
- cmap_name = font->map_name;
- }
-
- fontdict = pdf_font_get_resource(font);
- tounicode = pdf_load_ToUnicode_stream(cmap_name);
- if (!tounicode && MREC_HAS_TOUNICODE(mrec))
- WARN("Failed to read ToUnicode mapping \"%s\"...", mrec->opt.tounicode);
- else if (tounicode) {
- if (pdf_obj_typeof(tounicode) != PDF_STREAM)
- ERROR("Object returned by pdf_load_ToUnicode_stream() not stream object! (This must be bug)");
- else if (pdf_stream_length(tounicode) > 0) {
- pdf_add_dict(fontdict,
- pdf_new_name("ToUnicode"),
- pdf_ref_obj (tounicode)); /* _FIXME_ */
- if (__verbose)
- MESG("pdf_font>> ToUnicode CMap \"%s\" attached to font id=\"%s\".\n",
- cmap_name, font->map_name);
- }
- pdf_release_obj(tounicode);
- }
-
- return 0;
-}
-
-void
-pdf_close_fonts (void)
-{
- int font_id;
-
- for (font_id = 0;
- font_id < font_cache.count; font_id++) {
- pdf_font *font;
-
- font = GET_FONT(font_id);
-
- if (__verbose) {
- if (font->subtype != PDF_FONT_FONTTYPE_TYPE0) {
- MESG("(%s", pdf_font_get_ident(font));
- if (__verbose > 2 &&
- !pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED)) {
- MESG("[%s+%s]",
- pdf_font_get_uniqueTag(font),
- pdf_font_get_fontname(font));
- } else if (__verbose > 1) {
- MESG("[%s]",
- pdf_font_get_fontname(font));
- }
- if (__verbose > 1) {
- if (pdf_font_get_encoding(font) >= 0) {
- MESG("[%s]",
- pdf_encoding_get_name(pdf_font_get_encoding(font)));
- } else {
- MESG("[built-in]");
- }
- }
-
- }
- }
-
- /* Must come before load_xxx */
- try_load_ToUnicode_CMap(font);
-
- /* Type 0 is handled separately... */
- switch (font->subtype) {
- case PDF_FONT_FONTTYPE_TYPE1:
- if (__verbose)
- MESG("[Type1]");
- if (!pdf_font_get_flag(font, PDF_FONT_FLAG_BASEFONT))
- pdf_font_load_type1(font);
- break;
- case PDF_FONT_FONTTYPE_TYPE1C:
- if (__verbose)
- MESG("[Type1C]");
- pdf_font_load_type1c(font);
- break;
- case PDF_FONT_FONTTYPE_TRUETYPE:
- if (__verbose)
- MESG("[TrueType]");
- pdf_font_load_truetype(font);
- break;
- case PDF_FONT_FONTTYPE_TYPE3:
- if (__verbose)
- MESG("[Type3/PK]");
- pdf_font_load_pkfont (font);
- break;
- case PDF_FONT_FONTTYPE_TYPE0:
- break;
- default:
- ERROR("Unknown font type: %d", font->subtype);
- break;
- }
-
- if (font->encoding_id >= 0 && font->subtype != PDF_FONT_FONTTYPE_TYPE0)
- pdf_encoding_add_usedchars(font->encoding_id, font->usedchars);
-
- if (__verbose) {
- if (font->subtype != PDF_FONT_FONTTYPE_TYPE0)
- MESG(")");
- }
- }
-
- pdf_encoding_complete();
-
- for (font_id = 0; font_id < font_cache.count; font_id++) {
- pdf_font *font = GET_FONT(font_id);
-
- if (font->encoding_id >= 0 && font->subtype != PDF_FONT_FONTTYPE_TYPE0) {
- pdf_obj *enc_obj = pdf_get_encoding_obj(font->encoding_id);
- pdf_obj *tounicode;
-
- /* Predefined encodings (and those simplified to them) are embedded
- as direct objects, but this is purely a matter of taste. */
- if (enc_obj)
- pdf_add_dict(font->resource,
- pdf_new_name("Encoding"),
- PDF_OBJ_NAMETYPE(enc_obj) ? pdf_link_obj(enc_obj) : pdf_ref_obj(enc_obj));
-
- if (!pdf_lookup_dict(font->resource, "ToUnicode")
- && (tounicode = pdf_encoding_get_tounicode(font->encoding_id)))
- pdf_add_dict(font->resource,
- pdf_new_name("ToUnicode"), pdf_ref_obj(tounicode));
- } else if (font->subtype == PDF_FONT_FONTTYPE_TRUETYPE) {
- /* encoding_id < 0 means MacRoman here (but not really)
- * We use MacRoman as "default" encoding. */
- pdf_add_dict(font->resource,
- pdf_new_name("Encoding"),
- pdf_new_name("MacRomanEncoding"));
- }
-
- pdf_flush_font(font);
- pdf_clean_font_struct(font);
- }
- RELEASE(font_cache.fonts);
- font_cache.fonts = NULL;
- font_cache.count = 0;
- font_cache.capacity = 0;
-
- Type0Font_cache_close();
-
- CMap_cache_close();
- pdf_close_encodings();
-
- otl_close_conf();
- agl_close_map (); /* After encoding */
-
- return;
-}
-
-int
-pdf_font_findresource (const char *tex_name,
- double font_scale, fontmap_rec *mrec)
-{
- int font_id = -1;
- pdf_font *font;
- int encoding_id = -1, cmap_id = -1;
- const char *fontname;
-
- /*
- * Get appropriate info from map file. (PK fonts at two different
- * point sizes would be looked up twice unecessarily.)
- */
- fontname = mrec ? mrec->font_name : tex_name;
- if (mrec && mrec->enc_name) {
-#define MAYBE_CMAP(s) (!strstr((s), ".enc") || strstr((s), ".cmap"))
- if (MAYBE_CMAP(mrec->enc_name)) {
- cmap_id = CMap_cache_find(mrec->enc_name);
- if (cmap_id >= 0) {
- CMap *cmap;
- int cmap_type, minbytes;
-
- cmap = CMap_cache_get(cmap_id);
- cmap_type = CMap_get_type (cmap);
- minbytes = CMap_get_profile(cmap, CMAP_PROF_TYPE_INBYTES_MIN);
- /*
- * Check for output encoding.
- */
- if (cmap_type != CMAP_TYPE_IDENTITY &&
- cmap_type != CMAP_TYPE_CODE_TO_CID &&
- cmap_type != CMAP_TYPE_TO_UNICODE) {
- WARN("Only 16-bit encoding supported for output encoding.");
- }
- /*
- * Turn on map option.
- */
- if (minbytes == 2 && mrec->opt.mapc < 0) {
- if (__verbose) {
- MESG("\n");
- MESG("pdf_font>> Input encoding \"%s\" requires at least 2 bytes.\n",
- CMap_get_name(cmap));
- MESG("pdf_font>> The -m <00> option will be assumed for \"%s\".\n", mrec->font_name);
- }
- mrec->opt.mapc = 0; /* _FIXME_ */
- }
- } else if (!strcmp(mrec->enc_name, "unicode")) {
- cmap_id = otf_load_Unicode_CMap(mrec->font_name,
- mrec->opt.index, mrec->opt.otl_tags,
- ((mrec->opt.flags & FONTMAP_OPT_VERT) ? 1 : 0));
- if (cmap_id < 0) {
- cmap_id = t1_load_UnicodeCMap(mrec->font_name, mrec->opt.otl_tags,
- ((mrec->opt.flags & FONTMAP_OPT_VERT) ? 1 : 0));
- }
- if (cmap_id < 0)
- ERROR("Failed to read UCS2/UCS4 TrueType cmap...");
- }
- }
- if (cmap_id < 0) {
- encoding_id = pdf_encoding_findresource(mrec->enc_name);
- if (encoding_id < 0)
- ERROR("Could not find encoding file \"%s\".", mrec->enc_name);
- }
- }
-
- if (mrec && cmap_id >= 0) {
- /*
- * Composite Font
- */
- int type0_id, found = 0;
-
- type0_id = pdf_font_findfont0(mrec->font_name, cmap_id, &mrec->opt);
- if (type0_id < 0) {
- return -1;
- }
-
- for (font_id = 0;
- font_id < font_cache.count; font_id++) {
- font = GET_FONT(font_id);
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0 &&
- font->font_id == type0_id &&
- font->encoding_id == cmap_id) {
- found = 1;
- if (__verbose) {
- MESG("\npdf_font>> Type0 font \"%s\" (cmap_id=%d) found at font_id=%d.\n",
- mrec->font_name, cmap_id, font_id);
- }
- break;
- }
- }
-
- if (!found) {
- font_id = font_cache.count;
- if (font_cache.count >= font_cache.capacity) {
- font_cache.capacity += CACHE_ALLOC_SIZE;
- font_cache.fonts = RENEW(font_cache.fonts, font_cache.capacity, pdf_font);
- }
- font = GET_FONT(font_id);
- pdf_init_font_struct(font);
-
-#ifdef XETEX
- font->ft_to_gid = Type0Font_get_ft_to_gid(type0_id);
- font->ft_face = mrec->opt.ft_face;
-#endif
-
- font->font_id = type0_id;
- font->subtype = PDF_FONT_FONTTYPE_TYPE0;
- font->encoding_id = cmap_id;
-
- font_cache.count++;
-
- if (__verbose) {
- MESG("\npdf_font>> Type0 font \"%s\"", fontname);
- MESG(" cmap_id=<%s,%d>", mrec->enc_name, font->encoding_id);
- MESG(" opened at font_id=<%s,%d>.\n", tex_name, font_id);
- }
-
- }
- } else {
- /*
- * Simple Font - always embed.
- */
- int found = 0;
-
- for (font_id = 0;
- font_id < font_cache.count; font_id++) {
- font = GET_FONT(font_id);
- switch (font->subtype) {
- case PDF_FONT_FONTTYPE_TYPE1:
- case PDF_FONT_FONTTYPE_TYPE1C:
- case PDF_FONT_FONTTYPE_TRUETYPE:
- /* fontname here is font file name.
- * We must compare both font file name and encoding
- *
- * TODO: Embed a font only once if it is used
- * with two different encodings
- */
- if (!strcmp(fontname, font->ident) &&
- encoding_id == font->encoding_id) {
- if (mrec && mrec->opt.index == font->index)
- found = 1;
- }
- break;
- case PDF_FONT_FONTTYPE_TYPE3:
- /* There shouldn't be any encoding specified for PK font.
- * It must be always font's build-in encoding.
- *
- * TODO: a PK font with two encodings makes no sense. Change?
- */
- if (!strcmp(fontname, font->ident) &&
- font_scale == font->point_size) {
- found = 1;
- }
- break;
- case PDF_FONT_FONTTYPE_TYPE0:
- break;
- default:
- ERROR("Unknown font type: %d", font->subtype);
- break;
- }
-
- if (found) {
- if (__verbose) {
- MESG("\npdf_font>> Simple font \"%s\" (enc_id=%d) found at id=%d.\n",
- fontname, encoding_id, font_id);
- }
- break;
- }
- }
-
-
- if (!found) {
- font_id = font_cache.count;
- if (font_cache.count >= font_cache.capacity) {
- font_cache.capacity += CACHE_ALLOC_SIZE;
- font_cache.fonts = RENEW(font_cache.fonts, font_cache.capacity, pdf_font);
- }
-
- font = GET_FONT(font_id);
-
- pdf_init_font_struct(font);
-
-#ifdef XETEX
- font->ft_face = mrec ? mrec->opt.ft_face : NULL;
-#endif
-
- font->point_size = font_scale;
- font->encoding_id = encoding_id;
- font->ident = NEW(strlen(fontname) + 1, char);
- strcpy(font->ident, fontname);
- font->map_name = NEW(strlen(tex_name) + 1, char);
- strcpy(font->map_name, tex_name);
- font->index = (mrec && mrec->opt.index) ? mrec->opt.index : 0;
-
- if (pdf_font_open_type1(font) >= 0) {
- font->subtype = PDF_FONT_FONTTYPE_TYPE1;
- } else if (pdf_font_open_type1c(font) >= 0) {
- font->subtype = PDF_FONT_FONTTYPE_TYPE1C;
- } else if (pdf_font_open_truetype(font) >= 0) {
- font->subtype = PDF_FONT_FONTTYPE_TRUETYPE;
- } else if (pdf_font_open_pkfont(font) >= 0) {
- font->subtype = PDF_FONT_FONTTYPE_TYPE3;
- } else {
- pdf_clean_font_struct(font);
- return -1;
- }
-
- font_cache.count++;
-
- if (__verbose) {
- MESG("\npdf_font>> Simple font \"%s\"", fontname);
- MESG(" enc_id=<%s,%d>",
- (mrec && mrec->enc_name) ? mrec->enc_name : "builtin", font->encoding_id);
- MESG(" opened at font_id=<%s,%d>.\n", tex_name, font_id);
- }
- }
- }
-
- return font_id;
-}
-
-int
-pdf_font_is_in_use (pdf_font *font)
-{
- ASSERT(font);
-
- return ((font->reference) ? 1 : 0);
-}
-
-#ifdef XETEX
-FT_Face
-pdf_font_get_ft_face (pdf_font *font)
-{
- ASSERT(font);
-
- return font->ft_face;
-}
-
-unsigned short *
-pdf_get_font_ft_to_gid (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
-
- return font->ft_to_gid;
-}
-#endif
-
-int
-pdf_font_get_index (pdf_font *font)
-{
- ASSERT(font);
-
- return font->index;
-}
-
-char *
-pdf_font_get_ident (pdf_font *font)
-{
- ASSERT(font);
-
- return font->ident;
-}
-
-char *
-pdf_font_get_mapname (pdf_font *font)
-{
- ASSERT(font);
-
- return font->map_name;
-}
-
-char *
-pdf_font_get_fontname (pdf_font *font)
-{
- ASSERT(font);
-
- return font->fontname;
-}
-
-pdf_obj *
-pdf_font_get_resource (pdf_font *font)
-{
- ASSERT(font);
-
- if (!font->resource) {
- font->resource = pdf_new_dict();
- pdf_add_dict(font->resource,
- pdf_new_name("Type"), pdf_new_name("Font"));
- switch (font->subtype) {
- case PDF_FONT_FONTTYPE_TYPE1:
- case PDF_FONT_FONTTYPE_TYPE1C:
- pdf_add_dict(font->resource,
- pdf_new_name("Subtype"), pdf_new_name("Type1"));
- break;
- case PDF_FONT_FONTTYPE_TYPE3:
- pdf_add_dict(font->resource,
- pdf_new_name("Subtype"), pdf_new_name("Type3"));
- break;
- case PDF_FONT_FONTTYPE_TRUETYPE:
- pdf_add_dict(font->resource,
- pdf_new_name("Subtype"), pdf_new_name("TrueType"));
- break;
- default:
- break;
- }
- }
-
- return font->resource;
-}
-
-pdf_obj *
-pdf_font_get_descriptor (pdf_font *font)
-{
- ASSERT(font);
-
- if (!font->descriptor) {
- font->descriptor = pdf_new_dict();
- pdf_add_dict(font->descriptor,
- pdf_new_name("Type"), pdf_new_name("FontDescriptor"));
- }
-
- return font->descriptor;
-}
-
-char *
-pdf_font_get_usedchars (pdf_font *font)
-{
- ASSERT(font);
-
- return font->usedchars;
-}
-
-int
-pdf_font_get_encoding (pdf_font *font)
-{
- ASSERT(font);
-
- return font->encoding_id;
-}
-
-int
-pdf_font_get_flag (pdf_font *font, int mask)
-{
- ASSERT(font);
-
- return ((font->flags & mask) ? 1 : 0);
-}
-
-#if 0
-int
-pdf_font_get_flags (pdf_font *font)
-{
- ASSERT(font);
-
- return font->flags;
-}
-#endif /* 0 */
-
-double
-pdf_font_get_param (pdf_font *font, int param_type)
-{
- double param = 0.0;
-
- ASSERT(font);
-
- switch (param_type) {
- case PDF_FONT_PARAM_DESIGN_SIZE:
- param = font->design_size;
- break;
- case PDF_FONT_PARAM_POINT_SIZE:
- param = font->point_size;
- break;
- default:
- break;
- }
-
- return param;
-}
-
-char *
-pdf_font_get_uniqueTag (pdf_font *font)
-{
- ASSERT(font);
-
- if (font->uniqueID[0] == '\0') {
- pdf_font_make_uniqueTag(font->uniqueID);
- }
-
- return font->uniqueID;
-}
-
-int
-pdf_font_set_fontname (pdf_font *font, const char *fontname)
-{
- ASSERT(font && fontname);
-
- if (strlen(fontname) > PDF_NAME_LEN_MAX) {
- ERROR("Unexpected error...");
- return -1;
- }
- if (font->fontname) {
- RELEASE(font->fontname);
- }
- font->fontname = NEW(strlen(fontname)+1, char);
- strcpy(font->fontname, fontname);
-
- return 0;
-}
-
-int
-pdf_font_set_subtype (pdf_font *font, int subtype)
-{
- ASSERT(font);
-
- font->subtype = subtype;
-
- return 0;
-}
-
-int
-pdf_font_set_flags (pdf_font *font, int flags)
-{
- ASSERT(font);
-
- font->flags |= flags;
-
- return 0;
-}
-