summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c
new file mode 100644
index 00000000000..58405749172
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/otf-reader/otf-reader.c
@@ -0,0 +1,91 @@
+#include "support/util.h"
+#include "otfcc/font.h"
+#include "table/all.h"
+
+#include "unconsolidate.h"
+
+#define OTFCC_CHR(a,b,c,d) ( ((a)<<24) | ((b)<<16) | ((c)<<8) | (d) )
+
+static otfcc_font_subtype decideFontSubtypeOTF(otfcc_SplineFontContainer *sfnt, uint32_t index) {
+ otfcc_Packet packet = sfnt->packets[index];
+ FOR_TABLE_SILENT(OTFCC_CHR('C','F','F',' '), table) {
+ return FONTTYPE_CFF;
+ }
+ return FONTTYPE_TTF;
+}
+
+static otfcc_Font *readOtf(void *_sfnt, uint32_t index, const otfcc_Options *options) {
+ otfcc_SplineFontContainer *sfnt = (otfcc_SplineFontContainer *)_sfnt;
+ if (sfnt->count - 1 < index) {
+ return NULL;
+ } else {
+ otfcc_Font *font = otfcc_iFont.create();
+ otfcc_Packet packet = sfnt->packets[index];
+ font->subtype = decideFontSubtypeOTF(sfnt, index);
+ font->fvar = otfcc_readFvar(packet, options);
+ font->head = otfcc_readHead(packet, options);
+ font->maxp = otfcc_readMaxp(packet, options);
+ font->name = otfcc_readName(packet, options);
+ font->meta = otfcc_readMeta(packet, options);
+ font->OS_2 = otfcc_readOS_2(packet, options);
+ font->post = otfcc_readPost(packet, options);
+ font->hhea = otfcc_readHhea(packet, options);
+ font->cmap = otfcc_readCmap(packet, options);
+ if (font->subtype == FONTTYPE_TTF) {
+ font->hmtx = otfcc_readHmtx(packet, options, font->hhea, font->maxp);
+ font->vhea = otfcc_readVhea(packet, options);
+ if (font->vhea) font->vmtx = otfcc_readVmtx(packet, options, font->vhea, font->maxp);
+ font->fpgm = otfcc_readFpgmPrep(packet, options, OTFCC_CHR('f','p','g','m'));
+ font->prep = otfcc_readFpgmPrep(packet, options, OTFCC_CHR('p','r','e','p'));
+ font->cvt_ = otfcc_readCvt(packet, options, OTFCC_CHR('c','v','t',' '));
+ font->gasp = otfcc_readGasp(packet, options);
+ font->VDMX = otfcc_readVDMX(packet, options);
+ font->LTSH = otfcc_readLTSH(packet, options);
+
+ GlyfIOContext ctx = {.locaIsLong = font->head->indexToLocFormat,
+ .numGlyphs = font->maxp->numGlyphs,
+ .nPhantomPoints = 4, // Since MS rasterizer v1.7,
+ // it would always add 4 phantom points
+ .fvar = font->fvar};
+ font->glyf = otfcc_readGlyf(packet, options, &ctx);
+ } else {
+ table_CFFAndGlyf cffpr = otfcc_readCFFAndGlyfTables(packet, options, font->head);
+ font->CFF_ = cffpr.meta;
+ font->glyf = cffpr.glyphs;
+ font->vhea = otfcc_readVhea(packet, options);
+ if (font->vhea) {
+ font->vmtx = otfcc_readVmtx(packet, options, font->vhea, font->maxp);
+ font->VORG = otfcc_readVORG(packet, options);
+ }
+ }
+ if (font->glyf) {
+ font->GSUB = otfcc_readOtl(packet, options, OTFCC_CHR('G','S','U','B'), font->glyf->length);
+ font->GPOS = otfcc_readOtl(packet, options, OTFCC_CHR('G','P','O','S'), font->glyf->length);
+ font->GDEF = otfcc_readGDEF(packet, options);
+ }
+ font->BASE = otfcc_readBASE(packet, options);
+
+ // Color font
+ font->CPAL = otfcc_readCPAL(packet, options);
+ font->COLR = otfcc_readCOLR(packet, options);
+ font->SVG_ = otfcc_readSVG(packet, options);
+
+ // VTT TSI entries
+ font->TSI_01 = otfcc_readTSI(packet, options, OTFCC_CHR('T','S','I','0'), OTFCC_CHR('T','S','I','1'));
+ font->TSI_23 = otfcc_readTSI(packet, options, OTFCC_CHR('T','S','I','2'), OTFCC_CHR('T','S','I','3'));
+ font->TSI5 = otfcc_readTSI5(packet, options);
+
+ otfcc_unconsolidateFont(font, options);
+ return font;
+ }
+}
+static INLINE void freeReader(otfcc_IFontBuilder *self) {
+ free(self);
+}
+otfcc_IFontBuilder *otfcc_newOTFReader() {
+ otfcc_IFontBuilder *reader;
+ NEW(reader);
+ reader->read = readOtf;
+ reader->free = freeReader;
+ return reader;
+}