@flighthq/font-formats 0.3.1-next.209.43ef1bc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/cffCharstring.d.ts +13 -0
  2. package/dist/cffCharstring.d.ts.map +1 -0
  3. package/dist/cffCharstring.js +336 -0
  4. package/dist/cffCharstring.js.map +1 -0
  5. package/dist/cffDict.d.ts +8 -0
  6. package/dist/cffDict.d.ts.map +1 -0
  7. package/dist/cffDict.js +118 -0
  8. package/dist/cffDict.js.map +1 -0
  9. package/dist/cffFdSelect.d.ts +2 -0
  10. package/dist/cffFdSelect.d.ts.map +1 -0
  11. package/dist/cffFdSelect.js +60 -0
  12. package/dist/cffFdSelect.js.map +1 -0
  13. package/dist/cffIndex.d.ts +3 -0
  14. package/dist/cffIndex.d.ts.map +1 -0
  15. package/dist/cffIndex.js +52 -0
  16. package/dist/cffIndex.js.map +1 -0
  17. package/dist/cffTable.d.ts +3 -0
  18. package/dist/cffTable.d.ts.map +1 -0
  19. package/dist/cffTable.js +134 -0
  20. package/dist/cffTable.js.map +1 -0
  21. package/dist/contract.d.ts +15 -0
  22. package/dist/contract.d.ts.map +1 -0
  23. package/dist/contract.js +15 -0
  24. package/dist/contract.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/openTypeCmap.d.ts +5 -0
  30. package/dist/openTypeCmap.d.ts.map +1 -0
  31. package/dist/openTypeCmap.js +161 -0
  32. package/dist/openTypeCmap.js.map +1 -0
  33. package/dist/openTypeGlyf.d.ts +4 -0
  34. package/dist/openTypeGlyf.d.ts.map +1 -0
  35. package/dist/openTypeGlyf.js +229 -0
  36. package/dist/openTypeGlyf.js.map +1 -0
  37. package/dist/openTypeGlyphOutlineSource.d.ts +4 -0
  38. package/dist/openTypeGlyphOutlineSource.d.ts.map +1 -0
  39. package/dist/openTypeGlyphOutlineSource.js +168 -0
  40. package/dist/openTypeGlyphOutlineSource.js.map +1 -0
  41. package/dist/openTypeMetrics.d.ts +6 -0
  42. package/dist/openTypeMetrics.d.ts.map +1 -0
  43. package/dist/openTypeMetrics.js +74 -0
  44. package/dist/openTypeMetrics.js.map +1 -0
  45. package/dist/openTypeTestHelper.d.ts +26 -0
  46. package/dist/openTypeTestHelper.d.ts.map +1 -0
  47. package/dist/openTypeTestHelper.js +494 -0
  48. package/dist/openTypeTestHelper.js.map +1 -0
  49. package/dist/sfntAssembly.d.ts +7 -0
  50. package/dist/sfntAssembly.d.ts.map +1 -0
  51. package/dist/sfntAssembly.js +77 -0
  52. package/dist/sfntAssembly.js.map +1 -0
  53. package/dist/sfntTableDirectory.d.ts +4 -0
  54. package/dist/sfntTableDirectory.d.ts.map +1 -0
  55. package/dist/sfntTableDirectory.js +39 -0
  56. package/dist/sfntTableDirectory.js.map +1 -0
  57. package/dist/woff2Font.d.ts +6 -0
  58. package/dist/woff2Font.d.ts.map +1 -0
  59. package/dist/woff2Font.js +210 -0
  60. package/dist/woff2Font.js.map +1 -0
  61. package/dist/woff2GlyfTransform.d.ts +6 -0
  62. package/dist/woff2GlyfTransform.d.ts.map +1 -0
  63. package/dist/woff2GlyfTransform.js +104 -0
  64. package/dist/woff2GlyfTransform.js.map +1 -0
  65. package/dist/woffFont.d.ts +6 -0
  66. package/dist/woffFont.d.ts.map +1 -0
  67. package/dist/woffFont.js +112 -0
  68. package/dist/woffFont.js.map +1 -0
  69. package/package.json +50 -0
  70. package/src/cffCharstring.test.ts +177 -0
  71. package/src/cffDict.test.ts +67 -0
  72. package/src/cffFdSelect.test.ts +84 -0
  73. package/src/cffIndex.test.ts +97 -0
  74. package/src/cffTable.test.ts +84 -0
  75. package/src/openTypeCmap.test.ts +124 -0
  76. package/src/openTypeGlyf.test.ts +168 -0
  77. package/src/openTypeGlyphOutlineSource.test.ts +298 -0
  78. package/src/openTypeMetrics.test.ts +103 -0
  79. package/src/sfntAssembly.test.ts +92 -0
  80. package/src/sfntTableDirectory.test.ts +64 -0
  81. package/src/woff2Font.test.ts +125 -0
  82. package/src/woff2GlyfTransform.test.ts +88 -0
  83. package/src/woffFont.test.ts +167 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeGlyf.js","sourceRoot":"","sources":["../src/openTypeGlyf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlyphOutlineSource, OpenTypeFontExplanation } from '@flighthq/types/contract';
2
+ export declare function createGlyphOutlineSourceFromOpenTypeFont(source: Readonly<Uint8Array>): GlyphOutlineSource | null;
3
+ export declare function explainOpenTypeFont(bytes: Readonly<Uint8Array>): OpenTypeFontExplanation;
4
+ //# sourceMappingURL=openTypeGlyphOutlineSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeGlyphOutlineSource.d.ts","sourceRoot":"","sources":["../src/openTypeGlyphOutlineSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,kBAAkB,EAClB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AAgDlC,wBAAgB,wCAAwC,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAgChH;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,uBAAuB,CAsDxF"}
@@ -0,0 +1,168 @@
1
+ import { getDecompressor } from '@flighthq/compression/contract';
2
+ import { detectFontFormat } from '@flighthq/font/contract';
3
+ import { runCffCharstring } from './cffCharstring';
4
+ import { readCffTable } from './cffTable';
5
+ import { readOpenTypeCodepointMap } from './openTypeCmap';
6
+ import { readOpenTypeGlyphOutline, readOpenTypeGlyphRanges } from './openTypeGlyf';
7
+ import { readOpenTypeAdvances, readOpenTypeGlyphCount, readOpenTypeLocaFormat, readOpenTypeMetrics, } from './openTypeMetrics';
8
+ import { readSfntTableDirectory } from './sfntTableDirectory';
9
+ import { readWoffFont, WOFF_COMPRESSION } from './woffFont';
10
+ /**
11
+ * OPENTYPE/TRUETYPE BYTES → THE EXISTING `GlyphOutlineSource` SEAM.
12
+ *
13
+ * This package produces an interface it does not own. `GlyphOutlineSource` is declared in
14
+ * `@flighthq/types`, `@flighthq/font` already turns one into a rasterizer backend, and `@flighthq/swf`
15
+ * already produces one from its own edge-record encoding. What was missing was only a producer that
16
+ * reads a font FILE, so the output shape here is determined rather than designed.
17
+ *
18
+ * WHAT THIS PACKAGE IS NOT. Shaping is `@flighthq/textshaper`, layout is `@flighthq/textlayout`, and
19
+ * static bitmap strikes are `@flighthq/bitmapfont`. This produces outlines, advances, and a codepoint
20
+ * mapping, in unhinted design units, and nothing else.
21
+ *
22
+ * ON PROVENANCE, BECAUSE THIS IS THE MOST ENCUMBERED DOMAIN IN THE TREE. Table tags, field offsets, and
23
+ * flag bits are interface facts — what a published format exists to state — and carry no obligation.
24
+ * The outline reconstruction is an ALGORITHM, and it is built from the specification in Flight's own
25
+ * architecture, never transcribed from a reference implementation. Anything tested against is fetched
26
+ * on demand and committed nowhere; synthetic fonts assembled byte by byte in a test are preferred.
27
+ */
28
+ // WOFF is a wrapper around the same tables, so it is unwrapped once here and everything downstream — the
29
+ // directory, both outline flavors, CID — reads the rebuilt sfnt without knowing it arrived compressed.
30
+ // Returns the source unchanged for a plain sfnt, and the null sentinel for a container this package does
31
+ // not open or one whose tables need a decompressor nobody registered.
32
+ function unwrapFontContainer(source) {
33
+ const format = detectFontFormat(source);
34
+ if (format === 'truetype' || format === 'opentype')
35
+ return source;
36
+ if (format !== 'woff')
37
+ return null;
38
+ return readWoffFont(source, getDecompressor(WOFF_COMPRESSION));
39
+ }
40
+ // The producer. Returns the null sentinel for any font this package cannot read, which covers cases
41
+ // with completely different remedies — so `explainOpenTypeFont` is the shakeable query that separates
42
+ // them, and a caller diagnosing a rejection calls it rather than reading a message string.
43
+ export function createGlyphOutlineSourceFromOpenTypeFont(source) {
44
+ const parsed = readOpenTypeFontTables(source);
45
+ if (parsed === null)
46
+ return null;
47
+ const { advances, bytes, cff, codepoints, directory, glyphCount, metrics, ranges } = parsed;
48
+ // A bound method object rather than a plain record, because the source owns tables the methods close
49
+ // over. The scratch-free contract is the caller's: `getGlyphOutline` writes into their `out`.
50
+ return {
51
+ getGlyphOutline(out, glyphIndex) {
52
+ if (glyphIndex < 0 || glyphIndex >= glyphCount)
53
+ return false;
54
+ if (cff !== null) {
55
+ const charstring = cff.charstrings[glyphIndex];
56
+ if (charstring === undefined)
57
+ return false;
58
+ // A CID font selects the pool per glyph; every other font shares one. Reading the wrong pool
59
+ // draws plausible geometry rather than failing, so the choice is made here from the table's own
60
+ // structure rather than defaulted anywhere.
61
+ const localSubrs = cff.localSubrsByGlyph?.[glyphIndex] ?? cff.localSubrs;
62
+ return runCffCharstring(out, bytes, charstring, localSubrs, cff.globalSubrs);
63
+ }
64
+ return ranges === null ? false : readOpenTypeGlyphOutline(out, bytes, directory, ranges, glyphIndex);
65
+ },
66
+ getGlyphOutlineAdvance(glyphIndex) {
67
+ return glyphIndex < 0 || glyphIndex >= glyphCount ? 0 : advances[glyphIndex];
68
+ },
69
+ getGlyphOutlineIndexForCodePoint(codePoint) {
70
+ return codepoints.get(codePoint) ?? -1;
71
+ },
72
+ getGlyphOutlineMetrics() {
73
+ return metrics;
74
+ },
75
+ };
76
+ }
77
+ // Why `createGlyphOutlineSourceFromOpenTypeFont` returned null, as plain data.
78
+ //
79
+ // Kept separate from the producer, and re-reading the bytes rather than being handed its intermediate
80
+ // state, so a caller that never diagnoses anything does not link it. That costs a second parse on the
81
+ // failure path only, which is the path where nobody is counting microseconds.
82
+ export function explainOpenTypeFont(bytes) {
83
+ const format = detectFontFormat(bytes) ?? '';
84
+ const empty = { format, readableTableCount: 0, table: '', tableCount: 0 };
85
+ if (bytes.byteLength < 12)
86
+ return { ...empty, accepted: false, reason: 'too-short' };
87
+ if (format === '')
88
+ return { ...empty, accepted: false, reason: 'unrecognized' };
89
+ // WOFF is opened now: it wraps these same tables, so it is unwrapped and read like any other font. It
90
+ // needs a DEFLATE decompressor, which `@flighthq/compression` provides on request — an unregistered one
91
+ // is its own reason, because the remedy is one line of registration rather than a different producer.
92
+ // WOFF2 and a collection are still not opened: WOFF2 needs Brotli and a table-transform reversal, and a
93
+ // collection holds several fonts with no rule here for which is meant.
94
+ if (format === 'woff' && getDecompressor(WOFF_COMPRESSION) === null) {
95
+ return { ...empty, accepted: false, reason: 'missing-decompressor' };
96
+ }
97
+ if (format !== 'truetype' && format !== 'opentype' && format !== 'woff') {
98
+ return { ...empty, accepted: false, reason: 'unsupported-container' };
99
+ }
100
+ const unwrapped = format === 'woff' ? readWoffFont(bytes, getDecompressor(WOFF_COMPRESSION)) : bytes;
101
+ if (unwrapped === null)
102
+ return { ...empty, accepted: false, reason: 'malformed-table', table: '' };
103
+ const directory = readSfntTableDirectory(unwrapped);
104
+ if (directory === null)
105
+ return { ...empty, accepted: false, reason: 'too-short' };
106
+ const counted = {
107
+ format,
108
+ readableTableCount: directory.tables.size,
109
+ tableCount: directory.declaredTableCount,
110
+ };
111
+ void unwrapped;
112
+ for (const tag of ['cmap', 'head', 'hhea', 'hmtx', 'maxp']) {
113
+ if (!directory.tables.has(tag))
114
+ return { ...counted, accepted: false, reason: 'missing-required-table', table: tag };
115
+ }
116
+ // `glyf` and `CFF ` are the two outline flavors, and both are read now. `CFF2` is not: it is a
117
+ // different charstring dialect with variation support, so it keeps the stated-absence treatment that
118
+ // `CFF ` had until this landed — a caller holding one needs a different producer, not a repaired file.
119
+ if (!directory.tables.has('glyf')) {
120
+ if (directory.tables.has('CFF2') && !directory.tables.has('CFF ')) {
121
+ return { ...counted, accepted: false, reason: 'unsupported-outlines', table: 'CFF2' };
122
+ }
123
+ if (!directory.tables.has('CFF ')) {
124
+ return { ...counted, accepted: false, reason: 'missing-required-table', table: 'glyf' };
125
+ }
126
+ }
127
+ else if (!directory.tables.has('loca')) {
128
+ return { ...counted, accepted: false, reason: 'missing-required-table', table: 'loca' };
129
+ }
130
+ // Every table is present, so anything still wrong is a table that disagrees with its own extent.
131
+ const parsed = readOpenTypeFontTables(bytes);
132
+ if (parsed === null)
133
+ return { ...counted, accepted: false, reason: 'malformed-table', table: '' };
134
+ return { ...counted, accepted: true, reason: 'ok', table: '' };
135
+ }
136
+ // The single parse both entry points run, so the producer and the explanation can never disagree about
137
+ // whether a font is readable — a disagreement there is the defect where a caller is told the font is
138
+ // fine and still gets null.
139
+ function readOpenTypeFontTables(source) {
140
+ const bytes = unwrapFontContainer(source);
141
+ if (bytes === null)
142
+ return null;
143
+ const directory = readSfntTableDirectory(bytes);
144
+ if (directory === null)
145
+ return null;
146
+ const glyphCount = readOpenTypeGlyphCount(bytes, directory);
147
+ if (glyphCount <= 0)
148
+ return null;
149
+ const metrics = readOpenTypeMetrics(bytes, directory);
150
+ const advances = readOpenTypeAdvances(bytes, directory, glyphCount);
151
+ const codepoints = readOpenTypeCodepointMap(bytes, directory);
152
+ if (metrics === null || advances === null || codepoints === null)
153
+ return null;
154
+ // The flavor-independent tables are read first because they are needed either way; only the outline
155
+ // source differs. `glyf` is preferred when both are somehow present, since a font shipping both is
156
+ // malformed and the quadratic path is the one with the longer history here.
157
+ const shared = { advances, bytes, codepoints, directory, glyphCount, metrics };
158
+ if (directory.tables.has('glyf')) {
159
+ const locaFormat = readOpenTypeLocaFormat(bytes, directory);
160
+ if (locaFormat === -1)
161
+ return null;
162
+ const ranges = readOpenTypeGlyphRanges(bytes, directory, glyphCount, locaFormat);
163
+ return ranges === null ? null : { ...shared, cff: null, ranges };
164
+ }
165
+ const cff = readCffTable(bytes, directory);
166
+ return cff === null ? null : { ...shared, cff, ranges: null };
167
+ }
168
+ //# sourceMappingURL=openTypeGlyphOutlineSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeGlyphOutlineSource.js","sourceRoot":"","sources":["../src/openTypeGlyphOutlineSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAU3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;GAiBG;AAEH,yGAAyG;AACzG,uGAAuG;AACvG,yGAAyG;AACzG,sEAAsE;AACtE,SAAS,mBAAmB,CAAC,MAA4B;IACvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAoB,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAClE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,oGAAoG;AACpG,sGAAsG;AACtG,2FAA2F;AAC3F,MAAM,UAAU,wCAAwC,CAAC,MAA4B;IACnF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE5F,qGAAqG;IACrG,8FAA8F;IAC9F,OAAO;QACL,eAAe,CAAC,GAAS,EAAE,UAAkB;YAC3C,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC7D,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,UAAU,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBAC3C,6FAA6F;gBAC7F,gGAAgG;gBAChG,4CAA4C;gBAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC;gBACzE,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACvG,CAAC;QACD,sBAAsB,CAAC,UAAkB;YACvC,OAAO,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAE,CAAC;QAChF,CAAC;QACD,gCAAgC,CAAC,SAAiB;YAChD,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,sBAAsB;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,EAAE;AACF,sGAAsG;AACtG,sGAAsG;AACtG,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CAAC,KAA2B;IAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAmB,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAE1E,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACrF,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAChF,sGAAsG;IACtG,wGAAwG;IACxG,sGAAsG;IACtG,wGAAwG;IACxG,uEAAuE;IACvE,IAAI,MAAM,KAAK,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;QACpE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACxE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACrG,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAEnG,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAElF,MAAM,OAAO,GAAG;QACd,MAAM;QACN,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI;QACzC,UAAU,EAAE,SAAS,CAAC,kBAAkB;KACzC,CAAC;IAEF,KAAK,SAAS,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAC5B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACzF,CAAC;IAED,+FAA+F;IAC/F,qGAAqG;IACrG,uGAAuG;IACvG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC1F,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1F,CAAC;IAED,iGAAiG;IACjG,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClG,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACjE,CAAC;AAoBD,uGAAuG;AACvG,qGAAqG;AACrG,4BAA4B;AAC5B,SAAS,sBAAsB,CAAC,MAA4B;IAC1D,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9E,oGAAoG;IACpG,mGAAmG;IACnG,4EAA4E;IAC5E,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAC/E,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACjF,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { GlyphOutlineMetrics, SfntTableDirectory } from '@flighthq/types/contract';
2
+ export declare function readOpenTypeAdvances(bytes: Readonly<Uint8Array>, directory: Readonly<SfntTableDirectory>, glyphCount: number): Int32Array | null;
3
+ export declare function readOpenTypeGlyphCount(bytes: Readonly<Uint8Array>, directory: Readonly<SfntTableDirectory>): number;
4
+ export declare function readOpenTypeLocaFormat(bytes: Readonly<Uint8Array>, directory: Readonly<SfntTableDirectory>): number;
5
+ export declare function readOpenTypeMetrics(bytes: Readonly<Uint8Array>, directory: Readonly<SfntTableDirectory>): GlyphOutlineMetrics | null;
6
+ //# sourceMappingURL=openTypeMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeMetrics.d.ts","sourceRoot":"","sources":["../src/openTypeMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAexF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACvC,UAAU,EAAE,MAAM,GACjB,UAAU,GAAG,IAAI,CAgBnB;AAKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAInH;AAKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAKnH;AAID,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACtC,mBAAmB,GAAG,IAAI,CAqB5B"}
@@ -0,0 +1,74 @@
1
+ // The tables every outline source needs regardless of which flavor carries the outlines: `head` for the
2
+ // design-unit scale and the `loca` index width, `hhea` for the vertical metrics and the count of long
3
+ // horizontal metrics, `maxp` for the glyph count, and `hmtx` for per-glyph advances.
4
+ //
5
+ // All four are read into plain numbers here rather than kept as byte ranges, because they are small,
6
+ // fixed-layout, and read on every glyph — the alternative is re-reading a header inside a hot loop.
7
+ // Per-glyph horizontal advances, in design units, indexed by glyph id.
8
+ //
9
+ // `hmtx` is run-length shaped rather than flat: it holds `numberOfHMetrics` paired advance/bearing
10
+ // records followed by bearings alone, so every glyph past that count repeats the LAST stated advance.
11
+ // That is how monospaced and CJK fonts stay small, and reading it as a flat array silently gives every
12
+ // such glyph the wrong width. Expanded once here into a dense array so lookup is a single index.
13
+ export function readOpenTypeAdvances(bytes, directory, glyphCount) {
14
+ const hhea = directory.tables.get('hhea');
15
+ const hmtx = directory.tables.get('hmtx');
16
+ if (hhea === undefined || hmtx === undefined || hhea.length < 36)
17
+ return null;
18
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
19
+ const longMetricCount = view.getUint16(hhea.offset + 34);
20
+ if (longMetricCount === 0 || longMetricCount * 4 > hmtx.length)
21
+ return null;
22
+ const advances = new Int32Array(glyphCount);
23
+ let lastAdvance = 0;
24
+ for (let glyph = 0; glyph < glyphCount; glyph += 1) {
25
+ if (glyph < longMetricCount)
26
+ lastAdvance = view.getUint16(hmtx.offset + glyph * 4);
27
+ advances[glyph] = lastAdvance;
28
+ }
29
+ return advances;
30
+ }
31
+ // The number of glyphs the font declares, which bounds every glyph-indexed lookup. Returns -1 rather
32
+ // than null so a caller can compare against it without unwrapping; a font with no `maxp` has no
33
+ // defensible glyph count and every index is out of range.
34
+ export function readOpenTypeGlyphCount(bytes, directory) {
35
+ const maxp = directory.tables.get('maxp');
36
+ if (maxp === undefined || maxp.length < 6)
37
+ return -1;
38
+ return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint16(maxp.offset + 4);
39
+ }
40
+ // `head.indexToLocFormat`: 0 means `loca` holds 16-bit halved offsets, 1 means 32-bit byte offsets.
41
+ // Returns -1 when the table is absent or the value is neither, which is a malformed table rather than a
42
+ // value to guess at — guessing produces plausible garbage outlines instead of a clean rejection.
43
+ export function readOpenTypeLocaFormat(bytes, directory) {
44
+ const head = directory.tables.get('head');
45
+ if (head === undefined || head.length < 54)
46
+ return -1;
47
+ const format = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getInt16(head.offset + 50);
48
+ return format === 0 || format === 1 ? format : -1;
49
+ }
50
+ // Font-wide vertical metrics, in the design units `unitsPerEm` denominates. Returns the null sentinel
51
+ // when either table is absent or too short to hold the fields being read.
52
+ export function readOpenTypeMetrics(bytes, directory) {
53
+ const head = directory.tables.get('head');
54
+ const hhea = directory.tables.get('hhea');
55
+ if (head === undefined || hhea === undefined || head.length < 54 || hhea.length < 36)
56
+ return null;
57
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
58
+ const unitsPerEm = view.getUint16(head.offset + 18);
59
+ // A zero would make every scaled coordinate a division by zero downstream, and it is the one value in
60
+ // this table that cannot be defaulted sensibly, so it is treated as a malformed table rather than
61
+ // silently replaced.
62
+ if (unitsPerEm === 0)
63
+ return null;
64
+ return {
65
+ // `hhea` states ascender as a positive distance above the baseline and descender as a negative one.
66
+ // `GlyphOutlineMetrics` documents both as POSITIVE distances from the baseline, so the descender's
67
+ // sign is flipped here — at the seam, once, rather than in every consumer.
68
+ ascent: view.getInt16(hhea.offset + 4),
69
+ descent: -view.getInt16(hhea.offset + 6),
70
+ lineGap: view.getInt16(hhea.offset + 8),
71
+ unitsPerEm,
72
+ };
73
+ }
74
+ //# sourceMappingURL=openTypeMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeMetrics.js","sourceRoot":"","sources":["../src/openTypeMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface SyntheticGlyph {
2
+ endPoints: readonly number[];
3
+ points: readonly (readonly [number, number, boolean])[];
4
+ }
5
+ export interface SyntheticFontOptions {
6
+ advances?: readonly number[];
7
+ codepoints?: ReadonlyMap<number, number>;
8
+ charstrings?: readonly Uint8Array[];
9
+ cid?: Readonly<SyntheticCidOptions>;
10
+ glyphs?: readonly SyntheticGlyph[];
11
+ flavor?: 'opentype' | 'truetype';
12
+ omitTable?: string;
13
+ unitsPerEm?: number;
14
+ }
15
+ export declare function cffOperand(value: number): number;
16
+ export declare function createSyntheticFont(options?: Readonly<SyntheticFontOptions>): Uint8Array;
17
+ export declare function emptySyntheticGlyph(): SyntheticGlyph;
18
+ export declare function encodeSyntheticCff(charstrings: readonly Uint8Array[], cid?: Readonly<SyntheticCidOptions>): Uint8Array;
19
+ export interface SyntheticCidOptions {
20
+ fdSelect: readonly number[];
21
+ pools: readonly (readonly Uint8Array[])[];
22
+ }
23
+ export declare function encodeSyntheticWoff(sfnt: Readonly<Uint8Array>, reverseTableOrder?: boolean): Uint8Array;
24
+ export declare function encodeSyntheticWoff2(sfnt: Readonly<Uint8Array>, transformTags?: readonly string[]): Uint8Array;
25
+ export declare function squareSyntheticGlyph(size: number): SyntheticGlyph;
26
+ //# sourceMappingURL=openTypeTestHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openTypeTestHelper.d.ts","sourceRoot":"","sources":["../src/openTypeTestHelper.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAE7B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGzC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAEpC,GAAG,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAGnC,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAGD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,QAAQ,CAAC,oBAAoB,CAAM,GAAG,UAAU,CAkC5F;AAED,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD;AAKD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,GAAG,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAClC,UAAU,CAuEZ;AAED,MAAM,WAAW,mBAAmB;IAElC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAE5B,KAAK,EAAE,SAAS,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;CAC3C;AAwCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,UAAQ,GAAG,UAAU,CAyCrG;AA2KD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,GAAE,SAAS,MAAM,EAAO,GAAG,UAAU,CA2ClH;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAUjE"}