summaryrefslogtreecommitdiff
path: root/Build/source/texk/ttf2pk2/ftlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/ttf2pk2/ftlib.c')
-rw-r--r--Build/source/texk/ttf2pk2/ftlib.c859
1 files changed, 0 insertions, 859 deletions
diff --git a/Build/source/texk/ttf2pk2/ftlib.c b/Build/source/texk/ttf2pk2/ftlib.c
deleted file mode 100644
index a0c5aaad065..00000000000
--- a/Build/source/texk/ttf2pk2/ftlib.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/*
- * ftlib.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>
- *
- * Copyright (C) 2012, 2013 by
- * Peter Breitenlohner <tex-live@tug.org>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TRUETYPE_TABLES_H
-#include FT_OPENTYPE_VALIDATE_H
-
-#include "ttf2tfm.h"
-#include "ttfenc.h"
-#include "errormsg.h"
-#include "newobj.h"
-#include "ftlib.h"
-
-#define Macintosh_platform 1
-#define Macintosh_encoding 0
-
-#define Microsoft_platform 3
-#define Microsoft_Symbol_encoding 0
-#define Microsoft_Unicode_encoding 1
-
-FT_Library engine;
-FT_Face face;
-
-FT_Matrix matrix1, matrix2;
-
-int dpi, ptsize;
-
-Boolean has_gsub;
-
-TT_OS2 *os2;
-TT_Postscript *postscript;
-
-FT_Byte *GSUB_table;
-FT_ULong GSUB_length;
-FT_ULong GSUB_ptr;
-
-static inline void
-need (FT_ULong needed)
-{
- if (GSUB_ptr + needed > GSUB_length)
- oops("GSUB: Unexpected end of table.");
-}
-
-static inline FT_Byte
-get_Byte(void)
-{
- return GSUB_table[GSUB_ptr++];
-}
-
-static inline signed char
-get_SByte(void)
-{
- return (signed char) GSUB_table[GSUB_ptr++];
-}
-
-static FT_UShort
-get_UShort(void)
-{
- unsigned int cc;
- cc = get_Byte() << 8;
- cc |= get_Byte();
- return (FT_UShort) cc;
-}
-
-static FT_Short
-get_Short(void)
-{
- int cc;
- cc = get_SByte() << 8;
- cc |= get_Byte();
- return (FT_Short) cc;
-}
-
-static FT_ULong
-get_ULong(void)
-{
- unsigned int cc;
- cc = get_Byte() << 24;
- cc |= get_Byte() << 16;
- cc |= get_Byte() << 8;
- cc |= get_Byte();
- return (FT_ULong) cc;
-}
-
-#if 0 /* unused */
-static FT_Long
-get_Long(void)
-{
- int cc;
- cc = get_SByte() << 24;
- cc |= get_Byte() << 16;
- cc |= get_Byte() << 8;
- cc |= get_Byte();
- return (FT_Long) cc;
-}
-#endif
-
-typedef struct {
- FT_UShort start;
- FT_UShort end;
- FT_UShort start_Index;
-} Range_Record;
-
-typedef struct {
- FT_ULong ptr;
- FT_UShort format;
- FT_UShort count;
- union {
- FT_UShort *glyphs; /* format = 1 */
- Range_Record *ranges; /* format = 2 */
- } data;
-} Coverage_Item;
-
-static inline void
-fetch_Glyphs (FT_UShort count, FT_UShort *glyphs)
-{
- int i;
-
- need(2 * count);
- for (i = 0; i < count; i++)
- glyphs[i] = get_UShort();
- for (i = 1; i < count; i++)
- if (glyphs[i] <= glyphs[i - 1])
- oops("Glyph[%d]=%d and Glyph[%d]=%d: out of order.", i - 1, glyphs[i - 1], i, glyphs[i]);
-}
-
-static inline FT_UShort
-fetch_Ranges (FT_UShort count, Range_Record *ranges)
-{
- int i;
- FT_UShort ndx = 0;
-
- need(6 * count);
- for (i = 0; i < count; i++)
- {
- ranges[i].start = get_UShort();
- ranges[i].end = get_UShort();
- if (ranges[i].start > ranges[i].end)
- oops("Range[%d]: bad range=%d..%d.", i, ranges[i].start, ranges[i].end);
- ranges[i].start_Index = get_UShort();
- if (ranges[i].start_Index != ndx)
- oops("Range[%d]: bad start_Index=%d (should be %d).", i, ranges[i].start_Index, ndx);
- ndx += (ranges[i].end - ranges[i].start) + 1;
- }
- for (i = 1; i < count; i++)
- if (ranges[i].start <= ranges[i-1].end)
- oops("Range[%d]=%d..%d and Range[%d]=%d..%d: out of order.",
- i - 1, ranges[i - 1].start, ranges[i - 1].end, i, ranges[i].start, ranges[i].end);
- return ndx;
-}
-
-static inline FT_UShort
-fetch_Coverage (Coverage_Item *coverage)
-{
- FT_UShort res = 0;
- GSUB_ptr = coverage->ptr;
- need(4);
- coverage->format = get_UShort();
- coverage->count = res = get_UShort();
- switch (coverage->format)
- {
- case 1:
- coverage->data.glyphs = mymalloc (res * sizeof(FT_UShort));
-#ifdef DEBUG
- warning("Coverage Format=1 with %d Glyphs at 0x%04x.", res, coverage->ptr);
-#endif
- fetch_Glyphs (res, coverage->data.glyphs);
- break;
- case 2:
- coverage->data.ranges = mymalloc (res * sizeof(Range_Record));
-#ifdef DEBUG
- warning("Coverage Format=1 with %d Ranges at 0x%04x.", res, coverage->ptr);
-#endif
- res = fetch_Ranges (res, coverage->data.ranges);
- break;
- default:
- oops("Coverage at 0x%04x: bad Format=%d.", coverage->ptr, coverage->format);
- }
- return res;
-}
-
-/*
- * We only accept Single Substitutions (and Extensions)
- */
-
-typedef struct {
- FT_UShort count;
- FT_UShort *glyphs;
-} Glyph_Array;
-
-typedef struct {
- FT_ULong ptr;
- FT_UShort format;
- Coverage_Item *coverage;
- union {
- FT_Short *delta; /* format = 1 */
- Glyph_Array *array; /* format = 2 */
- } data;
-} Single_Item;
-
-typedef struct _Subst_Item {
- Single_Item *item;
- struct _Subst_Item *next;
-} Subst_Item;
-
-Subst_Item *Subst_list, *Subst_last;
-
-static inline void
-add_Single (Single_Item *item)
-{
- Subst_Item *entry = mycalloc (1, sizeof(Subst_Item));
- entry->item = item;
- if (Subst_last)
- Subst_last->next = entry;
- else
- Subst_list = entry;
- Subst_last = entry;
- has_gsub = True;
-}
-
-static inline void
-fetch_Single (Single_Item *item)
-{
- int i;
- FT_UShort val;
-
- item->coverage = mycalloc (1, sizeof(Coverage_Item));
- GSUB_ptr = item->ptr;
- need(6);
- item->format = get_UShort();
- item->coverage->ptr = item->ptr + get_UShort();
- switch (item->format)
- {
- case 1:
- val = get_Short();
- item->data.delta = mycalloc (1, sizeof(FT_UShort));
- *item->data.delta = val;
-#ifdef DEBUG
- warning("Single Substitution Format=1 with Delta=%d at 0x%04x.", val, item->ptr);
-#endif
- fetch_Coverage (item->coverage);
- break;
- case 2:
- val = get_UShort();
- need(2 * val);
- item->data.array = mycalloc (1, sizeof(Glyph_Array));
- item->data.array->count = val;
- item->data.array->glyphs = mycalloc (val, sizeof(FT_UShort));
- for (i = 0; i < val; i++)
- item->data.array->glyphs[i] = get_UShort();
-#ifdef DEBUG
- warning("Single Substitution Format=2 with %d Glyphs at 0x%04x.", val, item->ptr);
-#endif
- val = fetch_Coverage (item->coverage);
- if (val != item->data.array->count)
- oops("Coverage at 0x%04x: covers %d glyphs (should be %d).", item->ptr, val, item->data.array->count);
- break;
- default:
- oops("Single Substitution at 0x%04x: bad Format=%d.", item->ptr, item->format);
- }
-
- add_Single (item);
-}
-
-typedef struct {
- FT_UShort count;
- Single_Item *list;
-} Lookup_Item;
-
-typedef struct {
- FT_ULong ptr;
- Lookup_Item *entry;
-} Lookup_Record;
-
-Lookup_Record *Lookup_List;
-FT_UShort Lookup_Count;
-
-static inline void
-fetch_Lookup (int i)
-{
- FT_ULong Lookup_ptr = Lookup_List[i].ptr;
-
- if (Lookup_ptr && !Lookup_List[i].entry)
- {
- Lookup_Item *entry = Lookup_List[i].entry = mycalloc (1, sizeof(Lookup_Item));
- Boolean is_ext = False;
- FT_UShort val;
- int j;
-
-#ifdef DEBUG
- warning("Lookup[%d] at 0x%04x.", i, Lookup_ptr);
-#endif
- GSUB_ptr = Lookup_ptr;
-
- /*
- * Read Lookup Item
- */
- need(6);
- val = get_UShort();
- if (val == 7)
- is_ext = True;
- else if (val != 1)
- oops("Lookup[%d] at 0x%04x: bad Type=%d.", i, Lookup_ptr, val);
- get_UShort(); /* Ignore Lookup Flag */
- entry->count = get_UShort();
- entry->list = mycalloc (entry->count, sizeof(Single_Item));
-
- need(2 * entry->count);
- for (j = 0; j < entry->count; j++)
- entry->list[j].ptr = Lookup_ptr + get_UShort();
-
- if (is_ext)
- for (j = 0; j < entry->count; j++)
- {
- GSUB_ptr = entry->list[j].ptr;
- need(8);
- val = get_UShort();
- if (val != 1)
- oops("Lookup[%d] Extension[%d] at 0x%04x: bad Format=%d.", i, j, entry->list[j].ptr, val);
- val = get_UShort();
- if (val != 1)
- oops("Lookup[%d] Extension[%d] at 0x%04x: bad Type=%d.", i, j, entry->list[j].ptr, val);
- entry->list[j].ptr += get_ULong();
- }
-
- for (j = 0; j < entry->count; j++)
- fetch_Single (&entry->list[j]);
- }
-}
-
-typedef struct {
- FT_UShort count;
- FT_UShort *list;
-} Feature_Item;
-
-typedef struct {
- FT_Tag tag;
- FT_ULong ptr;
- Feature_Item *entry;
-} Feature_Record;
-
-Feature_Record *Feature_List;
-FT_UShort Feature_Count;
-
-/*
- * We check for the `vert' or `vrt2' feature in Chinese, Japanese, and Korean
- */
-#define FEATURE_vert FT_MAKE_TAG('v', 'e', 'r', 't')
-#define FEATURE_vrt2 FT_MAKE_TAG('v', 'r', 't', '2')
-
-#define print_Tag(t) t >> 24, (t >> 16) & 0xff, (t >> 8) & 0xff, t & 0xff
-
-static inline void
-fetch_Feature (int i)
-{
- FT_ULong Feature_ptr = Feature_List[i].ptr;
-
- if (Feature_ptr && !Feature_List[i].entry)
- {
- Feature_Item *entry = Feature_List[i].entry = mycalloc (1, sizeof(Feature_Item));
- FT_UShort val;
- int j;
-
-#ifdef DEBUG
- warning("Feature[%d] '%c%c%c%c' at 0x%04x.", i, print_Tag(Feature_List[i].tag), Feature_ptr);
-#endif
- GSUB_ptr = Feature_ptr;
-
- /*
- * Read Feature Item
- */
- need(4);
- val = get_UShort();
- if (val)
- oops("Feature[%d] at 0x%04x: bad FeaturParams 0x%04x.", Feature_ptr, i, val);
- entry->count = get_UShort();
- entry->list = mycalloc (entry->count, sizeof(FT_UShort));
-
- need(2*entry->count);
- for (j = 0; j < entry->count; j++) {
- entry->list[j] = get_UShort();
- if (entry->list[j] >= Lookup_Count)
- oops("Feature[%d] at 0x%04x: bad Lookup Index[%d]=%d.", i, Feature_ptr, j, entry->list[j]);
- }
-
- for (j = 0; j < entry->count; j++)
- fetch_Lookup (entry->list[j]);
- }
-}
-
-#define SCRIPT_kana FT_MAKE_TAG('k', 'a', 'n', 'a')
-#define SCRIPT_hani FT_MAKE_TAG('h', 'a', 'n', 'i')
-#define SCRIPT_hang FT_MAKE_TAG('h', 'a', 'n', 'g')
-
-#define LANGUAGE_JAN FT_MAKE_TAG('J', 'A', 'N', ' ')
-#define LANGUAGE_CHN FT_MAKE_TAG('C', 'H', 'N', ' ')
-#define LANGUAGE_KOR FT_MAKE_TAG('K', 'O', 'R', ' ')
-
-struct _Script_Lang
-{
- FT_Tag script;
- FT_Tag language;
-};
-
-static const struct _Script_Lang Script_Lang[] = {
- { SCRIPT_kana, LANGUAGE_JAN },
- { SCRIPT_hani, LANGUAGE_CHN },
- { SCRIPT_hang, LANGUAGE_KOR }
-};
-#define num_Script_Lang (sizeof(Script_Lang) / sizeof(Script_Lang[0]))
-
-typedef struct {
- FT_UShort req;
- FT_UShort count;
- FT_UShort *list;
-} LangSys_Item;
-
-typedef struct {
- FT_Tag tag;
- FT_ULong ptr;
- LangSys_Item *entry;
-} LangSys_Record;
-
-typedef struct {
- FT_ULong ptr;
- LangSys_Item *entry;
- FT_UShort count;
- LangSys_Record *list;
-} Script_Item;
-
-typedef struct {
- FT_Tag tag, ltag;
- FT_ULong ptr;
- Script_Item *entry;
-} Script_Record;
-
-Script_Record *Script_List;
-FT_UShort Script_Count;
-
-static inline void
-fetch_LangSys (FT_ULong ptr, LangSys_Item **entry)
-{
- LangSys_Item * item;
- FT_UShort val;
- int i;
-
- *entry = item = mycalloc (1, sizeof(LangSys_Item));
- GSUB_ptr = ptr;
-
- /*
- * Read LangSys Item
- */
- need(6);
- val = get_UShort();
- if (val)
- oops("LangSys at 0x%04x: bad LookupOrder 0x%04x.", ptr, val);
- item->req = get_UShort();
- if (item->req != 0xffff && item->req >= Feature_Count)
- oops("LangSys at 0x%04x: bad required Feature Index=%d.", ptr, item->req);
- item->count = get_UShort();
- item->list = mycalloc (item->count, sizeof(FT_UShort));
-
- need(2 * item->count);
- for (i = 0; i < item->count; i++) {
- item->list[i] = get_UShort();
- if (item->list[i] >= Feature_Count)
- oops("LangSys at 0x%04x: bad Feature Index[%d]=%d.", ptr, i, item->list[i]);
- }
-
- if (item->req != 0xffff)
- fetch_Feature (item->req);
- for (i = 0; i < item->count; i++)
- fetch_Feature (item->list[i]);
-}
-
-static inline void
-fetch_Script (int i)
-{
- FT_ULong Script_ptr = Script_List[i].ptr;
-
- if (Script_ptr)
- {
- Script_Item *entry = Script_List[i].entry = mycalloc (1, sizeof(Script_Item));
- int j;
-
-#ifdef DEBUG
- warning("Script[%d] '%c%c%c%c' at 0x%04x.", i, print_Tag(Script_List[i].tag), Script_ptr);
-#endif
- GSUB_ptr = Script_ptr;
-
- /*
- * Read Script Item
- */
- need(4);
- if ((entry->ptr = get_UShort()))
- entry->ptr += Script_ptr;
- entry->count = get_UShort();
- entry->list = mycalloc (entry->count, sizeof(LangSys_Record));
-
- need(6 * entry->count);
- for (j = 0; j < entry->count; j++) {
- FT_Tag tag = Script_List[i].tag;
- FT_ULong ptr = Script_ptr + get_UShort();
-
- entry->list[j].tag = tag;
- if (tag == Script_List[i].ltag)
- entry->list[j].ptr = ptr;
- }
-
- /*
- * Read Default LangSys entriy
- */
- if (entry->ptr) {
-#ifdef DEBUG
- warning("Script[%d] Default LangSys at 0x%04x.", i, entry->ptr);
-#endif
- fetch_LangSys (entry->ptr, &entry->entry);
- }
-
- /*
- * Read language LangSys entries
- */
- for (j = 0; j < entry->count; j++)
- if (entry->list[j].ptr) {
-#ifdef DEBUG
- warning("Script[%d] LangSys[%d] '%c%c%c%c' at 0x%04x.", i, j,
- print_Tag(entry->list[j].tag), entry->list[j].ptr);
-#endif
- fetch_LangSys (entry->list[j].ptr, &entry->list[j].entry);
- }
- }
-}
-
-#define TTAG_GSUB FT_MAKE_TAG('G', 'S', 'U', 'B')
-
-static inline void
-fetch_GSUB (void)
-{
- FT_Error error;
- int i, j;
-
- FT_ULong Script_List_ptr, Feature_List_ptr, Lookup_List_ptr;
-
- /*
- * Fetch GSUB table
- */
- if ((error = FT_Load_Sfnt_Table(face, TTAG_GSUB, 0, NULL, &GSUB_length)))
- {
-#ifdef DEBUG
- warning("No GSUB data available for vertical glyph presentation forms.");
-#endif
- return;
- }
- GSUB_table = mymalloc(GSUB_length);
- if ((error = FT_Load_Sfnt_Table(face, TTAG_GSUB, 0, GSUB_table, &GSUB_length)))
- {
- warning("Cannot load GSUB table (error code = 0x%x).", error);
- return;
- }
-
- /*
- * Read GSUB header
- */
- need(10);
- if (get_ULong() != 0x00010000)
- oops("GSUB: Bad version.");
- Script_List_ptr = get_UShort();
- Feature_List_ptr = get_UShort();
- Lookup_List_ptr = get_UShort();
-
- /*
- * Read Script_List
- */
- GSUB_ptr = Script_List_ptr;
- need(2);
- Script_Count = get_UShort();
-#ifdef DEBUG
- warning("GSUB: Script List with %d entries at 0x%04x.", Script_Count, Script_List_ptr);
-#endif
- Script_List = mycalloc (Script_Count, sizeof(Script_Record));
-
- need (6 * Script_Count);
- for (i = 0; i < Script_Count; i++)
- {
- FT_Tag tag = get_ULong();
- FT_ULong ptr = Script_List_ptr + get_UShort();
- for (j = 0; j < num_Script_Lang; j++)
- if (tag == Script_Lang[j].script)
- {
- Script_List[i].tag = tag;
- Script_List[i].ltag = Script_Lang[j].language;
- Script_List[i].ptr = ptr;
- }
- }
-
- /*
- * Read Feature_List
- */
- GSUB_ptr = Feature_List_ptr;
- need(2);
- Feature_Count = get_UShort();
-#ifdef DEBUG
- warning("GSUB: Feature List with %d entries at 0x%04x.", Feature_Count, Feature_List_ptr);
-#endif
- Feature_List = mycalloc (Feature_Count, sizeof(Feature_Record));
-
- need (6 * Feature_Count);
- for (i = 0; i < Feature_Count; i++)
- {
- FT_Tag tag = get_ULong();
- FT_ULong ptr = Feature_List_ptr + get_UShort();
- if (tag == FEATURE_vert || tag == FEATURE_vrt2)
- {
- Feature_List[i].tag = tag;
- Feature_List[i].ptr = ptr;
- }
- }
-
- /*
- * Read Lookup_List
- */
- GSUB_ptr = Lookup_List_ptr;
- need(2);
- Lookup_Count = get_UShort();
-#ifdef DEBUG
- warning("GSUB: Lookup List with %d entries at 0x%04x.", Lookup_Count, Lookup_List_ptr);
-#endif
- Lookup_List = mycalloc (Lookup_Count, sizeof(Lookup_Record));
-
- need (2 * Lookup_Count);
- for (i = 0; i < Lookup_Count; i++)
- Lookup_List[i].ptr = Lookup_List_ptr + get_UShort();
-
- /*
- * Read Script_List entries
- */
- for (i = 0; i < Script_Count && !has_gsub; i++)
- fetch_Script (i);
-}
-
-void
-FTopen (char *filename, Font *fnt, Boolean do_tfm, Boolean quiet)
-{
- FT_Error error;
- int i;
- unsigned short num_cmap, cmap_plat=0, cmap_enc=0;
-
- if ((error = FT_Init_FreeType(&engine)))
- oops("Cannot initialize FreeType engine (error code = 0x%x).", error);
-
- /*
- * Load face.
- */
- if ((error = FT_New_Face(engine, filename, 0, &face)))
- oops("Cannot open `%s'.", filename);
-
- if (face->num_faces == 1)
- {
- if (fnt->fontindex != 0)
- {
- warning("This isn't a TrueType collection.\n"
- "Parameter `%s' is ignored.", do_tfm ? "-f" : "Fontindex");
- fnt->fontindex = 0;
- }
- fnt->fontindexparam = NULL;
- }
- else
- {
- if (fnt->fontindex != 0)
- {
- /*
- * Now we try to open the proper font in a collection.
- */
- FT_Done_Face(face);
- if ((error = FT_New_Face(engine, filename, (FT_Long)fnt->fontindex, &face)))
- oops("Cannot open font %lu in TrueType Collection `%s'.",
- fnt->fontindex, filename);
- }
- }
-
- if (do_tfm)
- {
- /*
- * Get the OS/2 table.
- */
- if ((os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2)) == NULL)
- oops("Cannot find OS/2 table for `%s'.", filename);
-
- /*
- * Get the Postscript table.
- */
- if ((postscript = FT_Get_Sfnt_Table(face, ft_sfnt_post)) == NULL)
- oops("Cannot find Postscript table for `%s'.", filename);
- }
-
- if ((error = FT_Set_Char_Size(face, ptsize * 64, ptsize * 64, dpi, dpi)))
- oops("Cannot set character size (error code = 0x%x).", error);
-
- matrix1.xx = (FT_Fixed)(floor(fnt->efactor * 1024) * (1<<16)/1024);
- matrix1.xy = (FT_Fixed)(floor(fnt->slant * 1024) * (1<<16)/1024);
- matrix1.yx = (FT_Fixed)0;
- matrix1.yy = (FT_Fixed)(1<<16);
-
- if (fnt->rotate)
- {
- matrix2.xx = 0;
- matrix2.yx = 1L << 16;
- matrix2.xy = -matrix2.yx;
- matrix2.yy = matrix2.xx;
- }
-
- if (do_tfm)
- {
- fnt->units_per_em = face->units_per_EM;
- fnt->fixedpitch = postscript->isFixedPitch;
- fnt->italicangle = postscript->italicAngle / 65536.0;
- fnt->xheight = os2->sxHeight * 1000 / fnt->units_per_em;
- }
-
- if (fnt->PSnames != Only)
- {
- num_cmap = face->num_charmaps;
- for (i = 0; i < num_cmap; i++)
- {
- cmap_plat=face->charmaps[i]->platform_id;
- cmap_enc=face->charmaps[i]->encoding_id;
- 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++)
- {
- cmap_plat=face->charmaps[i]->platform_id;
- cmap_enc=face->charmaps[i]->encoding_id;
- fprintf(stderr, " (%i,%i)\n", cmap_plat, cmap_enc);
- }
- fprintf(stderr, "\n");
- exit(1);
- }
-
- if ((error = FT_Set_Charmap(face, face->charmaps[i])))
- oops("Cannot load cmap (error code = 0x%x).", error);
- }
-
- if (fnt->PSnames)
- {
- if (!FT_HAS_GLYPH_NAMES(face))
- oops("This font does not support PS names.");
- }
- 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)
- fetch_GSUB();
-}
-
-static inline int
-find_ndx (int Num, Coverage_Item *coverage)
-{
- int i;
-
- switch (coverage->format)
- {
- case 1:
- for (i = 0; i < coverage->count; i++)
- {
- FT_UShort glyph = coverage->data.glyphs[i];
- if (Num < glyph)
- break;
- else if (Num == glyph)
- return i;
- }
- break;
- case 2:
- for (i = 0; i < coverage->count; i++)
- {
- Range_Record *range = &coverage->data.ranges[i];
-
- if (Num < range->start)
- break;
- else if (Num <= range->end)
- return (Num - range->start) + range->start_Index;
- }
- break;
- default:
- oops("Internal error: Invalid Coverage Format=%d.", coverage->format);
- }
- return -1;
-}
-
-int
-Get_Vert (int Num)
-{
- Subst_Item *entry;
-
-#ifdef DEBUG
- warning("GSUB: Looking for vertical form of glyph %d.", Num);
-#endif
- for (entry = Subst_list; entry; entry = entry->next)
- {
- Single_Item *item = entry->item;
- int ndx = find_ndx (Num, item->coverage);
-
- if (ndx >= 0)
- {
-#ifdef DEBUG
- warning("Covered at position %d.", ndx);
-#endif
- switch (item->format)
- {
- case 1:
- Num += *item->data.delta;
- break;
- case 2:
- Num = item->data.array->glyphs[ndx];
- break;
- default:
- oops("Internal error: Invalid Single Format=%d.", item->format);
- }
-#ifdef DEBUG
- warning("Substituted by glyph %d.", Num);
-#endif
- }
- }
- return Num;
-}