summaryrefslogtreecommitdiff
path: root/Build/source/texk/ttf2pk/ttfaux.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/ttf2pk/ttfaux.c')
-rw-r--r--Build/source/texk/ttf2pk/ttfaux.c724
1 files changed, 0 insertions, 724 deletions
diff --git a/Build/source/texk/ttf2pk/ttfaux.c b/Build/source/texk/ttf2pk/ttfaux.c
deleted file mode 100644
index 1e0108b4b26..00000000000
--- a/Build/source/texk/ttf2pk/ttfaux.c
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- * ttfaux.c
- *
- * This file is part of the ttf2pk package.
- *
- * Copyright 1997-1999, 2000, 2002, 2003 by
- * Frederic Loyer <loyer@ensta.fr>
- * Werner Lemberg <wl@gnu.org>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "freetype.h"
-#include "ftxkern.h" /* we use installed FreeType package headers */
-#include "ftxpost.h"
-#include "ftxopen.h"
-
-#include "ttf2tfm.h"
-#include "newobj.h"
-#include "ligkern.h"
-#include "ttfenc.h"
-#include "tfmaux.h"
-#include "errormsg.h"
-#include "ttfaux.h"
-#include "filesrch.h"
-
-
-#define Macintosh_platform 1
-#define Macintosh_encoding 0
-
-#define Microsoft_platform 3
-#define Microsoft_Unicode_encoding 1
-
-#define SCRIPT_kana MAKE_TT_TAG('k', 'a', 'n', 'a')
-#define SCRIPT_hani MAKE_TT_TAG('h', 'a', 'n', 'i')
-#define SCRIPT_hang MAKE_TT_TAG('h', 'a', 'n', 'g')
-
-#define LANGUAGE_JAN MAKE_TT_TAG('J', 'A', 'N', ' ')
-#define LANGUAGE_CHN MAKE_TT_TAG('C', 'H', 'N', ' ')
-#define LANGUAGE_KOR MAKE_TT_TAG('K', 'O', 'R', ' ')
-
-#define FEATURE_vert MAKE_TT_TAG('v', 'e', 'r', 't')
-
-
-char *real_ttfname;
-
-TT_Engine engine;
-TT_Face face;
-TT_Instance instance;
-TT_Glyph glyph;
-TT_Outline outline;
-TT_CharMap char_map;
-TT_Matrix matrix1, matrix2;
-
-TT_Big_Glyph_Metrics metrics;
-TT_Face_Properties properties;
-TT_BBox bbox;
-
-TT_Kerning directory;
-TT_Post post;
-
-TTO_GSUBHeader gsub_;
-TTO_GSUBHeader *gsub;
-
-Boolean has_gsub;
-
-
-
-static void
-readttf_kern(Font *fnt)
-{
- register kern *nk;
- register ttfinfo *ti_l, *ti_r;
- TT_Kern_0_Pair* pairs0;
- TT_Error error;
- unsigned int i, j;
-
-
- if ((error = TT_Get_Kerning_Directory(face, &directory)))
- oops("Cannot get kerning directory (error code = 0x%x).", error);
-
- if (directory.nTables == 0)
- return;
-
- for (i = 0; i < directory.nTables; i++)
- {
- if ((error = TT_Load_Kerning_Table(face, i)))
- oops("Cannot load kerning table (error code = 0x%x).", error);
-
- switch (directory.tables[i].format)
- {
- case 0:
- pairs0 = directory.tables[i].t.kern0.pairs;
- for (j = 0; j < directory.tables[i].t.kern0.nPairs; j++, pairs0++)
- {
- ti_l = findglyph(pairs0->left, fnt->charlist);
- if (ti_l == NULL)
- continue;
- ti_r = findglyph(pairs0->right, fnt->charlist);
- if (ti_r == NULL)
- continue;
- nk = newkern();
- nk->succ = ti_r->adobename;
- nk->delta = transform(pairs0->value * 1000 / fnt->units_per_em, 0,
- fnt->efactor, fnt->slant);
- nk->next = ti_l->kerns;
- ti_l->kerns = nk;
- }
- return; /* we stop after the first format 0 kerning table */
-
- default:
- break;
- }
- }
- return;
-}
-
-
-void
-readttf(Font *fnt, Boolean quiet, Boolean only_range)
-{
- TT_Error error;
- ttfinfo *ti, *Ti;
- long Num, index;
- unsigned int i, j;
- long k, max_k;
- unsigned short num_cmap;
- unsigned short cmap_plat, cmap_enc;
- int index_array[257];
-
- static Boolean initialized = False;
-
- TT_UShort in_string[2];
- TTO_GSUB_String in, out;
-
- TT_UShort script_index, language_index, feature_index;
- TT_UShort req_feature_index = 0xFFFF;
-
-
- /*
- * We allocate a placeholder boundary and the `.notdef' character.
- */
-
- if (!only_range)
- {
- ti = newchar(fnt);
- ti->charcode = -1;
- ti->adobename = ".notdef";
-
- ti = newchar(fnt);
- ti->charcode = -1;
- ti->adobename = "||"; /* boundary character name */
- }
-
- /*
- * Initialize FreeType engine.
- */
-
- if (!initialized)
- {
- if ((error = TT_Init_FreeType(&engine)))
- oops("Cannot initialize engine (error code = 0x%x).", error);
-
- if ((error = TT_Init_Kerning_Extension(engine)))
- oops("Cannot initialize kerning (error code = 0x%x).", error);
-
- if (fnt->PSnames)
- if ((error = TT_Init_Post_Extension(engine)))
- oops("Cannot initialize PS name support (error code = 0x%x).", error);
-
- if (fnt->rotate)
- if ((error = TT_Init_GSUB_Extension(engine)))
- oops("Cannot initialize GSUB support (error code = 0x%x).", error);
-
- /*
- * Load face.
- */
-
- real_ttfname = TeX_search_ttf_file(&(fnt->ttfname));
- if (!real_ttfname)
- oops("Cannot find `%s'.", fnt->ttfname);
-
- if ((error = TT_Open_Face(engine, real_ttfname, &face)))
- oops("Cannot open `%s'.", real_ttfname);
-
- /*
- * Get face properties and allocate preload arrays.
- */
-
- TT_Get_Face_Properties(face, &properties);
-
- /*
- * Now we try to open the proper font in a collection.
- */
-
- if (fnt->fontindex != 0)
- {
- if (properties.num_Faces == 1)
- {
- warning("This isn't a TrueType collection.\n"
- "Parameter `-f' is ignored.");
- fnt->fontindex = 0;
- fnt->fontindexparam = NULL;
- }
- else
- {
- TT_Close_Face(face);
- if ((error = TT_Open_Collection(engine, real_ttfname,
- fnt->fontindex, &face)))
- oops("Cannot open font %lu in TrueType Collection `%s'.",
- fnt->fontindex, real_ttfname);
- }
- }
-
- /*
- * Create instance.
- */
-
- if ((error = TT_New_Instance(face, &instance)))
- oops("Cannot create instance for `%s' (error code = 0x%x).",
- real_ttfname, error);
-
- /*
- * We use a dummy glyph size of 10pt.
- */
-
- if ((error = TT_Set_Instance_CharSize(instance, 10 * 64)))
- oops("Cannot set character size (error code = 0x%x).", error);
-
- matrix1.xx = (TT_Fixed)(floor(fnt->efactor * 1024) * (1L<<16)/1024);
- matrix1.xy = (TT_Fixed)(floor(fnt->slant * 1024) * (1L<<16)/1024);
- matrix1.yx = (TT_Fixed)0;
- matrix1.yy = (TT_Fixed)(1L<<16);
-
- if (fnt->rotate)
- {
- matrix2.xx = 0;
- matrix2.yx = 1L << 16;
- matrix2.xy = -matrix2.yx;
- matrix2.yy = matrix2.xx;
- }
-
- if ((error = TT_Set_Instance_Transform_Flags(
- instance,
- fnt->rotate ? 1 : 0,
- fnt->efactor != 1.0 ? 1 : 0)))
- oops("Cannot set transform flags (error code = 0x%x).", error);
-
- /*
- * Create glyph container.
- */
-
- if ((error = TT_New_Glyph(face, &glyph)))
- oops("Cannot create glyph container (error code = 0x%x).", error);
-
- fnt->units_per_em = properties.header->Units_Per_EM;
- fnt->fixedpitch = properties.postscript->isFixedPitch;
- fnt->italicangle = properties.postscript->italicAngle / 65536.0;
-#if TT_FREETYPE_MINOR >= 5
- fnt->xheight = properties.os2->sxHeight * 1000 / fnt->units_per_em;
-#endif
-
- if (fnt->PSnames != Only)
- {
- num_cmap = properties.num_CharMaps;
- for (i = 0; i < num_cmap; i++)
- {
- if ((error = TT_Get_CharMap_ID(face, i, &cmap_plat, &cmap_enc)))
- oops("Cannot query cmap (error code = 0x%x).", error);
- if (cmap_plat == fnt->pid && cmap_enc == fnt->eid)
- break;
- }
- if (i == num_cmap)
- {
- fprintf(stderr, "%s: ERROR: Invalid platform and/or encoding ID.\n",
- progname);
- if (num_cmap == 1)
- fprintf(stderr, " The only valid PID/EID pair is");
- else
- fprintf(stderr, " Valid PID/EID pairs are:\n");
- for (i = 0; i < num_cmap; i++)
- {
- TT_Get_CharMap_ID(face, i, &cmap_plat, &cmap_enc);
- fprintf(stderr, " (%i,%i)\n", cmap_plat, cmap_enc);
- }
- fprintf(stderr, "\n");
- exit(1);
- }
-
- if ((error = TT_Get_CharMap(face, i, &char_map)))
- oops("Cannot load cmap (error code = 0x%x).", error);
- }
-
- if (fnt->PSnames)
- {
- if ((error = TT_Load_PS_Names(face, &post)))
- oops("Cannot load TrueType PS names (error code = 0x%x).", error);
- }
- else if (cmap_plat == Microsoft_platform &&
- cmap_enc == Microsoft_Unicode_encoding)
- set_encoding_scheme(encUnicode, fnt);
- else if (cmap_plat == Macintosh_platform &&
- cmap_enc == Macintosh_encoding)
- set_encoding_scheme(encMac, fnt);
- else
- set_encoding_scheme(encFontSpecific, fnt);
-
- if (fnt->rotate)
- {
- gsub = &gsub_;
-
- error = TT_Load_GSUB_Table(face, gsub, NULL);
- if (!error)
- has_gsub = True;
- else if (error != TT_Err_Table_Missing)
- warning("Cannot load GSUB table (error code = 0x%x).", error);
- else
- warning("No GSUB data available "
- "for vertical glyph presentation forms.");
-
- /* we check for the `vert' feature in Chinese, Japanese, and Korean */
-
- error = TT_GSUB_Select_Script(gsub,
- SCRIPT_kana,
- &script_index);
- if (error)
- goto check_hani;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- 0xFFFF,
- &feature_index);
- if (error)
- {
- error = TT_GSUB_Select_Language(gsub,
- LANGUAGE_JAN,
- script_index,
- &language_index,
- &req_feature_index);
- if (error)
- goto check_hani;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- language_index,
- &feature_index);
- if (error)
- goto check_hani;
- else
- goto Done;
- }
- else
- goto Done;
-
- check_hani:
- error = TT_GSUB_Select_Script(gsub,
- SCRIPT_hani,
- &script_index);
- if (error)
- goto check_hang;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- 0xFFFF,
- &feature_index);
- if (error)
- {
- error = TT_GSUB_Select_Language(gsub,
- LANGUAGE_CHN,
- script_index,
- &language_index,
- &req_feature_index);
- if (error)
- goto check_hang;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- language_index,
- &feature_index);
- if (error)
- goto check_hang;
- else
- goto Done;
- }
- else
- goto Done;
-
- check_hang:
- error = TT_GSUB_Select_Script(gsub,
- SCRIPT_hang,
- &script_index);
- if (error)
- goto Done;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- 0xFFFF,
- &feature_index);
- if (error)
- {
- error = TT_GSUB_Select_Language(gsub,
- LANGUAGE_KOR,
- script_index,
- &language_index,
- &req_feature_index);
- if (error)
- goto Done;
- error = TT_GSUB_Select_Feature(gsub,
- FEATURE_vert,
- script_index,
- language_index,
- &feature_index);
- }
-
- Done:
- if (error)
- {
- warning("There is no data for vertical typesetting in GSUB table.");
- has_gsub = False;
- }
-
- if (req_feature_index != 0xFFFF)
- TT_GSUB_Add_Feature(gsub, req_feature_index, ALL_GLYPHS);
- TT_GSUB_Add_Feature(gsub, feature_index, ALL_GLYPHS);
-
- in.length = 1;
- in.pos = 0;
- in.string = in_string;
- in.properties = NULL;
-
- out.pos = 0;
- out.allocated = 0;
- out.string = NULL;
- out.properties = NULL;
- }
-
- initialized = True;
- }
-
- if (!quiet)
- {
- if (only_range)
- printf("\n\n%s:\n", fnt->fullname);
- printf("\n");
- printf("Glyph Code Glyph Name ");
- printf("Width llx lly urx ury\n");
- printf("----------------------------------------");
- printf("---------------------------------\n");
- }
-
- /*
- * We load only glyphs with a valid cmap entry. Nevertheless, for
- * the default mapping, we use the first 256 glyphs addressed by
- * ascending code points, followed by glyphs not in the cmap.
- *
- * If we compute a range, we take the character codes given in
- * the fnt->sf_code array.
- *
- * If the -N flag is set, no cmap is used at all. Instead, the
- * first 256 glyphs (with a valid PS name) are used for the default
- * mapping.
- */
-
- if (!only_range)
- for (i = 0; i < 257; i++)
- index_array[i] = 0;
- else
- for (i = 0; i < 256; i++)
- fnt->inencptrs[i] = 0;
-
- j = 0;
- if (fnt->PSnames == Only)
- max_k = properties.num_Glyphs - 1;
- else
- max_k = only_range ? 0xFF : 0x16FFFF;
-
- for (k = 0; k <= max_k; k++)
- {
- const char *an;
-
-
- if (fnt->PSnames != Only)
- {
- if (only_range)
- {
- index = fnt->sf_code[k];
- if (index < 0)
- continue;
- j = k;
- }
- else
- index = k;
-
- Num = TT_Char_Index(char_map, index);
-
- /* now we try to get a vertical glyph form */
-
- if (has_gsub)
- {
- in_string[0] = Num;
- error = TT_GSUB_Apply_String(gsub, &in, &out);
- if (error && error != TTO_Err_Not_Covered)
- warning("Cannot get the vertical glyph form for glyph index %d.",
- Num);
- else
- Num = out.string[0];
- }
-
- if (Num < 0)
- oops("Failure on cmap mapping from %s.", fnt->ttfname);
- if (Num == 0)
- continue;
- if (!only_range)
- if (Num <= 256)
- index_array[Num] = 1;
- }
- else
- {
- Num = k;
- index = 0;
- }
-
- error = TT_Load_Glyph(instance, glyph, Num, 0);
- if (!error)
- error = TT_Get_Glyph_Big_Metrics(glyph, &metrics);
- if (!error)
- error = TT_Get_Glyph_Outline(glyph, &outline);
- if (!error)
- {
- if (fnt->efactor != 1.0 || fnt->slant != 0.0 )
- TT_Transform_Outline(&outline, &matrix1);
- if (fnt->rotate)
- TT_Transform_Outline(&outline, &matrix2);
- }
- if (!error)
- error = TT_Get_Outline_BBox(&outline, &bbox); /* we need the non-
- grid-fitted bbox */
- if (!error)
- {
- if (fnt->PSnames) {
- char *tn;
- (void)TT_Get_PS_Name(face, Num, &tn);
- an = tn;
- }
- else
- an = code_to_adobename(index);
-
- /* ignore characters not usable for typesetting with TeX */
-
- if (strcmp(an, ".notdef") == 0)
- continue;
- if (strcmp(an, ".null") == 0)
- continue;
- if (strcmp(an, "nonmarkingreturn") == 0)
- continue;
-
- ti = newchar(fnt);
- ti->charcode = index;
- ti->glyphindex = Num;
- ti->adobename = an;
- ti->llx = bbox.xMin * 1000 / fnt->units_per_em;
- ti->lly = bbox.yMin * 1000 / fnt->units_per_em;
- ti->urx = bbox.xMax * 1000 / fnt->units_per_em;
- ti->ury = bbox.yMax * 1000 / fnt->units_per_em;
-
- ti->fntnum = fnt->subfont_num;
-
- /*
- * We must now shift the rotated character both horizontally
- * and vertically. The vertical amount is 25% by default.
- */
-
- if (fnt->rotate)
- {
- ti->llx += (metrics.vertBearingY - bbox.xMin) *
- 1000 / fnt->units_per_em;
- ti->lly -= 1000 * fnt->y_offset;
- ti->urx += (metrics.vertBearingY - bbox.xMin) *
- 1000 / fnt->units_per_em;
- ti->ury -= 1000 * fnt->y_offset;
- }
-
- /*
- * We need to avoid negative heights or depths. They break accents
- * in math mode, among other things.
- */
-
- if (ti->lly > 0)
- ti->lly = 0;
- if (ti->ury < 0)
- ti->ury = 0;
- if (fnt->rotate)
- ti->width = metrics.vertAdvance * 1000 / fnt->units_per_em;
- else
- ti->width = transform(metrics.horiAdvance * 1000 / fnt->units_per_em,
- 0, fnt->efactor, fnt->slant);
-
- if (!quiet)
- printf("%5ld %05lx %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
- Num, index, ti->adobename,
- ti->width,
- ti->llx, ti->lly, ti->urx, ti->ury);
-
- if (j < 256)
- {
- fnt->inencptrs[j] = ti;
- ti->incode = j;
- }
- j++;
- }
- }
-
- /*
- * Now we load glyphs without a cmap entry, provided some slots are
- * still free -- we skip this if we have to compute a range or use
- * PS names.
- */
-
- if (!only_range && !fnt->PSnames)
- {
- for (i = 1; i <= properties.num_Glyphs; i++)
- {
- const char *an;
-
-
- if (index_array[i] == 0)
- {
- error = TT_Load_Glyph(instance, glyph, i, 0);
- if (!error)
- error = TT_Get_Glyph_Big_Metrics(glyph, &metrics);
- if (!error)
- error = TT_Get_Glyph_Outline(glyph, &outline);
- if (!error)
- error = TT_Get_Outline_BBox(&outline, &bbox);
- if (!error)
- {
- an = code_to_adobename(i | 0x1000000);
-
- ti = newchar(fnt);
- ti->charcode = i | 0x1000000;
- ti->glyphindex = i;
- ti->adobename = an;
- ti->llx = bbox.xMin * 1000 / fnt->units_per_em;
- ti->lly = bbox.yMin * 1000 / fnt->units_per_em;
- ti->urx = bbox.xMax * 1000 / fnt->units_per_em;
- ti->ury = bbox.yMax * 1000 / fnt->units_per_em;
-
- if (ti->lly > 0)
- ti->lly = 0;
- if (ti->ury < 0)
- ti->ury = 0;
- ti->width = transform(metrics.horiAdvance*1000 / fnt->units_per_em,
- 0, fnt->efactor, fnt->slant);
-
- if (!quiet)
- printf("%5d %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
- i, ti->adobename,
- ti->width,
- ti->llx, ti->lly, ti->urx, ti->ury);
-
- if (j < 256)
- {
- fnt->inencptrs[j] = ti;
- ti->incode = j;
- }
- else
- break;
- j++;
- }
- }
- }
- }
-
- /* Finally, we construct a `Germandbls' glyph if necessary */
-
- if (!only_range)
- {
- if (NULL == findadobe("Germandbls", fnt->charlist) &&
- NULL != (Ti = findadobe("S", fnt->charlist)))
- {
- pcc *np, *nq;
-
-
- ti = newchar(fnt);
- ti->charcode = properties.num_Glyphs | 0x1000000;
- ti->glyphindex = properties.num_Glyphs;
- ti->adobename = "Germandbls";
- ti->width = Ti->width << 1;
- ti->llx = Ti->llx;
- ti->lly = Ti->lly;
- ti->urx = Ti->width + Ti->urx;
- ti->ury = Ti->ury;
- ti->kerns = Ti->kerns;
-
- np = newpcc();
- np->partname = "S";
- nq = newpcc();
- nq->partname = "S";
- nq->xoffset = Ti->width;
- np->next = nq;
- ti->pccs = np;
- ti->constructed = True;
-
- if (!quiet)
- printf("* %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
- ti->adobename,
- ti->width,
- ti->llx, ti->lly, ti->urx, ti->ury);
- }
- }
-
- /* kerning between subfonts isn't available */
- if (!only_range)
- readttf_kern(fnt);
-}
-
-
-/* end */