@cantoo/fontkit 2.0.4 → 2.0.6
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.
- package/dist/browser-module.mjs +4448 -1142
- package/dist/browser-module.mjs.map +1 -1
- package/dist/browser.cjs +4449 -1142
- package/dist/browser.cjs.map +1 -1
- package/dist/main.cjs +4449 -1142
- package/dist/main.cjs.map +1 -1
- package/dist/module.mjs +4448 -1142
- package/dist/module.mjs.map +1 -1
- package/package.json +4 -1
- package/src/CmapProcessor.js +60 -21
- package/src/DFont.js +114 -14
- package/src/TTFFont.js +260 -62
- package/src/TrueTypeCollection.js +59 -15
- package/src/WOFF2Font.js +128 -22
- package/src/WOFFFont.js +45 -8
- package/src/aat/AATFeatureMap.js +83 -40
- package/src/aat/AATLayoutEngine.js +34 -2
- package/src/aat/AATLookupTable.js +24 -6
- package/src/aat/AATMorxProcessor.js +202 -65
- package/src/aat/AATStateMachine.js +35 -3
- package/src/base.js +20 -1
- package/src/cff/CFFCharsets.js +3 -0
- package/src/cff/CFFDict.js +81 -11
- package/src/cff/CFFEncodings.js +2 -0
- package/src/cff/CFFFont.js +120 -24
- package/src/cff/CFFIndex.js +66 -9
- package/src/cff/CFFOperand.js +53 -28
- package/src/cff/CFFPointer.js +41 -2
- package/src/cff/CFFPrivateDict.js +34 -24
- package/src/cff/CFFStandardStrings.js +68 -67
- package/src/cff/CFFTop.js +161 -68
- package/src/decorators.js +34 -15
- package/src/encodings.js +133 -116
- package/src/fs.js +10 -0
- package/src/glyph/BBox.js +14 -0
- package/src/glyph/CFFGlyph.js +293 -152
- package/src/glyph/COLRGlyph.js +40 -5
- package/src/glyph/Glyph.js +72 -13
- package/src/glyph/GlyphVariationProcessor.js +158 -62
- package/src/glyph/Path.js +119 -32
- package/src/glyph/SBIXGlyph.js +57 -8
- package/src/glyph/StandardNames.js +1 -0
- package/src/glyph/TTFGlyph.js +203 -63
- package/src/glyph/TTFGlyphEncoder.js +58 -26
- package/src/glyph/WOFF2Glyph.js +25 -6
- package/src/layout/GlyphPosition.js +6 -0
- package/src/layout/GlyphRun.js +28 -10
- package/src/layout/KernProcessor.js +63 -4
- package/src/layout/LayoutEngine.js +99 -26
- package/src/layout/Script.js +52 -26
- package/src/layout/UnicodeLayoutEngine.js +34 -10
- package/src/opentype/GPOSProcessor.js +156 -45
- package/src/opentype/GSUBProcessor.js +92 -33
- package/src/opentype/GlyphInfo.js +53 -5
- package/src/opentype/GlyphIterator.js +51 -2
- package/src/opentype/OTLayoutEngine.js +66 -8
- package/src/opentype/OTProcessor.js +284 -71
- package/src/opentype/ShapingPlan.js +52 -5
- package/src/opentype/shapers/ArabicShaper.js +27 -8
- package/src/opentype/shapers/DefaultShaper.js +54 -10
- package/src/opentype/shapers/HangulShaper.js +120 -42
- package/src/opentype/shapers/HebrewShaper.js +50 -16
- package/src/opentype/shapers/IndicShaper.js +159 -44
- package/src/opentype/shapers/ThaiShaper.js +50 -19
- package/src/opentype/shapers/UniversalShaper.js +83 -17
- package/src/opentype/shapers/index.js +48 -35
- package/src/opentype/shapers/indic-data.js +2 -2
- package/src/packages/unicode-properties/data-trie.js +2 -1
- package/src/packages/unicode-properties/data.js +13 -1
- package/src/packages/unicode-properties/dist/index.cjs +23 -10
- package/src/packages/unicode-properties/dist/index.cjs.map +2 -2
- package/src/packages/unicode-properties/dist/index.mjs +22 -10
- package/src/packages/unicode-properties/dist/index.mjs.map +2 -2
- package/src/packages/unicode-properties/generate.js +3 -4
- package/src/packages/unicode-properties/index.js +95 -30
- package/src/packages/unicode-properties/package.json +1 -1
- package/src/packages/unicode-trie/builder.js +146 -29
- package/src/packages/unicode-trie/dist/builder.cjs +135 -25
- package/src/packages/unicode-trie/dist/builder.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/builder.mjs +134 -25
- package/src/packages/unicode-trie/dist/builder.mjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.cjs +22 -9
- package/src/packages/unicode-trie/dist/index.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.mjs +21 -9
- package/src/packages/unicode-trie/dist/index.mjs.map +2 -2
- package/src/packages/unicode-trie/index.js +63 -12
- package/src/packages/unicode-trie/package.json +1 -1
- package/src/packages/unicode-trie/swap.js +15 -2
- package/src/subset/CFFSubset.js +112 -22
- package/src/subset/Subset.js +23 -3
- package/src/subset/TTFSubset.js +84 -41
- package/src/tables/BASE.js +28 -27
- package/src/tables/COLR.js +10 -9
- package/src/tables/CPAL.js +2 -1
- package/src/tables/DSIG.js +8 -7
- package/src/tables/EBDT.js +10 -4
- package/src/tables/EBLC.js +70 -10
- package/src/tables/GDEF.js +18 -17
- package/src/tables/GPOS.js +153 -90
- package/src/tables/GSUB.js +50 -39
- package/src/tables/HVAR.js +51 -5
- package/src/tables/JSTF.js +17 -16
- package/src/tables/LTSH.js +4 -3
- package/src/tables/OS2.js +50 -49
- package/src/tables/PCLT.js +16 -15
- package/src/tables/STAT.js +46 -6
- package/src/tables/VDMX.js +18 -17
- package/src/tables/VORG.js +8 -7
- package/src/tables/WOFF2Directory.js +57 -9
- package/src/tables/WOFFDirectory.js +32 -20
- package/src/tables/aat.js +160 -35
- package/src/tables/avar.js +1 -0
- package/src/tables/bsln.js +3 -2
- package/src/tables/cmap.js +83 -63
- package/src/tables/cvt.js +1 -0
- package/src/tables/directory.js +56 -28
- package/src/tables/feat.js +24 -2
- package/src/tables/fpgm.js +1 -0
- package/src/tables/fvar.js +32 -4
- package/src/tables/gasp.js +6 -5
- package/src/tables/glyf.js +2 -1
- package/src/tables/gvar.js +29 -2
- package/src/tables/hdmx.js +18 -7
- package/src/tables/head.js +17 -16
- package/src/tables/hhea.js +15 -14
- package/src/tables/hmtx.js +18 -2
- package/src/tables/index.js +1 -5
- package/src/tables/just.js +15 -4
- package/src/tables/kern.js +84 -47
- package/src/tables/loca.js +23 -10
- package/src/tables/maxp.js +16 -15
- package/src/tables/morx.js +27 -20
- package/src/tables/name.js +120 -39
- package/src/tables/opbd.js +2 -1
- package/src/tables/opentype.js +126 -91
- package/src/tables/post.js +18 -11
- package/src/tables/prep.js +1 -0
- package/src/tables/sbix.js +12 -1
- package/src/tables/variations.js +29 -9
- package/src/tables/vhea.js +15 -14
- package/src/tables/vmtx.js +20 -4
- package/src/utils.js +15 -0
package/src/tables/JSTF.js
CHANGED
|
@@ -5,39 +5,40 @@ import { GPOSLookup } from './GPOS';
|
|
|
5
5
|
let JstfGSUBModList = new r.Array(r.uint16, r.uint16);
|
|
6
6
|
|
|
7
7
|
let JstfPriority = new r.Struct({
|
|
8
|
-
shrinkageEnableGSUB:
|
|
9
|
-
shrinkageDisableGSUB:
|
|
10
|
-
shrinkageEnableGPOS:
|
|
11
|
-
shrinkageDisableGPOS:
|
|
12
|
-
shrinkageJstfMax:
|
|
13
|
-
extensionEnableGSUB:
|
|
14
|
-
extensionDisableGSUB:
|
|
15
|
-
extensionEnableGPOS:
|
|
16
|
-
extensionDisableGPOS:
|
|
17
|
-
extensionJstfMax:
|
|
8
|
+
shrinkageEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
9
|
+
shrinkageDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
10
|
+
shrinkageEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
11
|
+
shrinkageDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
12
|
+
shrinkageJstfMax: new r.Pointer(r.uint16, LookupList(GPOSLookup)),
|
|
13
|
+
extensionEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
14
|
+
extensionDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
15
|
+
extensionEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
16
|
+
extensionDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
|
|
17
|
+
extensionJstfMax: new r.Pointer(r.uint16, LookupList(GPOSLookup))
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
let JstfLangSys = new r.Array(new r.Pointer(r.uint16, JstfPriority), r.uint16);
|
|
21
21
|
|
|
22
22
|
let JstfLangSysRecord = new r.Struct({
|
|
23
|
-
tag:
|
|
23
|
+
tag: new r.String(4),
|
|
24
24
|
jstfLangSys: new r.Pointer(r.uint16, JstfLangSys)
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
let JstfScript = new r.Struct({
|
|
28
28
|
extenderGlyphs: new r.Pointer(r.uint16, new r.Array(r.uint16, r.uint16)), // array of glyphs to extend line length
|
|
29
29
|
defaultLangSys: new r.Pointer(r.uint16, JstfLangSys),
|
|
30
|
-
langSysCount:
|
|
30
|
+
langSysCount: r.uint16,
|
|
31
31
|
langSysRecords: new r.Array(JstfLangSysRecord, 'langSysCount')
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
let JstfScriptRecord = new r.Struct({
|
|
35
|
-
tag:
|
|
36
|
-
script: new r.Pointer(r.uint16, JstfScript, {type: 'parent'})
|
|
35
|
+
tag: new r.String(4),
|
|
36
|
+
script: new r.Pointer(r.uint16, JstfScript, { type: 'parent' })
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
+
/** @type {import('restructure').Struct} */
|
|
39
40
|
export default new r.Struct({
|
|
40
|
-
version:
|
|
41
|
+
version: r.uint32, // should be 0x00010000
|
|
41
42
|
scriptCount: r.uint16,
|
|
42
|
-
scriptList:
|
|
43
|
+
scriptList: new r.Array(JstfScriptRecord, 'scriptCount')
|
|
43
44
|
});
|
package/src/tables/LTSH.js
CHANGED
|
@@ -3,8 +3,9 @@ import * as r from 'restructure';
|
|
|
3
3
|
// Linear Threshold table
|
|
4
4
|
// Records the ppem for each glyph at which the scaling becomes linear again,
|
|
5
5
|
// despite instructions effecting the advance width
|
|
6
|
+
/** @type {import('restructure').Struct} */
|
|
6
7
|
export default new r.Struct({
|
|
7
|
-
version:
|
|
8
|
-
numGlyphs:
|
|
9
|
-
yPels:
|
|
8
|
+
version: r.uint16,
|
|
9
|
+
numGlyphs: r.uint16,
|
|
10
|
+
yPels: new r.Array(r.uint8, 'numGlyphs')
|
|
10
11
|
});
|
package/src/tables/OS2.js
CHANGED
|
@@ -1,77 +1,78 @@
|
|
|
1
1
|
import * as r from 'restructure';
|
|
2
2
|
|
|
3
|
+
/** @type {import('restructure').VersionedStruct} */
|
|
3
4
|
var OS2 = new r.VersionedStruct(r.uint16, {
|
|
4
5
|
header: {
|
|
5
|
-
xAvgCharWidth:
|
|
6
|
-
usWeightClass:
|
|
7
|
-
usWidthClass:
|
|
8
|
-
fsType:
|
|
6
|
+
xAvgCharWidth: r.int16, // average weighted advance width of lower case letters and space
|
|
7
|
+
usWeightClass: r.uint16, // visual weight of stroke in glyphs
|
|
8
|
+
usWidthClass: r.uint16, // relative change from the normal aspect ratio (width to height ratio)
|
|
9
|
+
fsType: new r.Bitfield(r.uint16, [ // Indicates font embedding licensing rights
|
|
9
10
|
null, 'noEmbedding', 'viewOnly', 'editable', null,
|
|
10
11
|
null, null, null, 'noSubsetting', 'bitmapOnly'
|
|
11
12
|
]),
|
|
12
|
-
ySubscriptXSize:
|
|
13
|
-
ySubscriptYSize:
|
|
14
|
-
ySubscriptXOffset:
|
|
15
|
-
ySubscriptYOffset:
|
|
16
|
-
ySuperscriptXSize:
|
|
17
|
-
ySuperscriptYSize:
|
|
18
|
-
ySuperscriptXOffset:
|
|
19
|
-
ySuperscriptYOffset:
|
|
20
|
-
yStrikeoutSize:
|
|
21
|
-
yStrikeoutPosition:
|
|
22
|
-
sFamilyClass:
|
|
23
|
-
panose:
|
|
24
|
-
ulCharRange:
|
|
25
|
-
vendorID:
|
|
26
|
-
fsSelection:
|
|
13
|
+
ySubscriptXSize: r.int16, // recommended horizontal size in pixels for subscripts
|
|
14
|
+
ySubscriptYSize: r.int16, // recommended vertical size in pixels for subscripts
|
|
15
|
+
ySubscriptXOffset: r.int16, // recommended horizontal offset for subscripts
|
|
16
|
+
ySubscriptYOffset: r.int16, // recommended vertical offset form the baseline for subscripts
|
|
17
|
+
ySuperscriptXSize: r.int16, // recommended horizontal size in pixels for superscripts
|
|
18
|
+
ySuperscriptYSize: r.int16, // recommended vertical size in pixels for superscripts
|
|
19
|
+
ySuperscriptXOffset: r.int16, // recommended horizontal offset for superscripts
|
|
20
|
+
ySuperscriptYOffset: r.int16, // recommended vertical offset from the baseline for superscripts
|
|
21
|
+
yStrikeoutSize: r.int16, // width of the strikeout stroke
|
|
22
|
+
yStrikeoutPosition: r.int16, // position of the strikeout stroke relative to the baseline
|
|
23
|
+
sFamilyClass: r.int16, // classification of font-family design
|
|
24
|
+
panose: new r.Array(r.uint8, 10), // describe the visual characteristics of a given typeface
|
|
25
|
+
ulCharRange: new r.Array(r.uint32, 4),
|
|
26
|
+
vendorID: new r.String(4), // four character identifier for the font vendor
|
|
27
|
+
fsSelection: new r.Bitfield(r.uint16, [ // bit field containing information about the font
|
|
27
28
|
'italic', 'underscore', 'negative', 'outlined', 'strikeout',
|
|
28
29
|
'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique'
|
|
29
30
|
]),
|
|
30
|
-
usFirstCharIndex:
|
|
31
|
-
usLastCharIndex:
|
|
31
|
+
usFirstCharIndex: r.uint16, // The minimum Unicode index in this font
|
|
32
|
+
usLastCharIndex: r.uint16 // The maximum Unicode index in this font
|
|
32
33
|
},
|
|
33
34
|
|
|
34
35
|
// The Apple version of this table ends here, but the Microsoft one continues on...
|
|
35
36
|
0: {},
|
|
36
37
|
|
|
37
38
|
1: {
|
|
38
|
-
typoAscender:
|
|
39
|
-
typoDescender:
|
|
40
|
-
typoLineGap:
|
|
41
|
-
winAscent:
|
|
42
|
-
winDescent:
|
|
43
|
-
codePageRange:
|
|
39
|
+
typoAscender: r.int16,
|
|
40
|
+
typoDescender: r.int16,
|
|
41
|
+
typoLineGap: r.int16,
|
|
42
|
+
winAscent: r.uint16,
|
|
43
|
+
winDescent: r.uint16,
|
|
44
|
+
codePageRange: new r.Array(r.uint32, 2)
|
|
44
45
|
},
|
|
45
46
|
|
|
46
47
|
2: {
|
|
47
48
|
// these should be common with version 1 somehow
|
|
48
|
-
typoAscender:
|
|
49
|
-
typoDescender:
|
|
50
|
-
typoLineGap:
|
|
51
|
-
winAscent:
|
|
52
|
-
winDescent:
|
|
53
|
-
codePageRange:
|
|
49
|
+
typoAscender: r.int16,
|
|
50
|
+
typoDescender: r.int16,
|
|
51
|
+
typoLineGap: r.int16,
|
|
52
|
+
winAscent: r.uint16,
|
|
53
|
+
winDescent: r.uint16,
|
|
54
|
+
codePageRange: new r.Array(r.uint32, 2),
|
|
54
55
|
|
|
55
|
-
xHeight:
|
|
56
|
-
capHeight:
|
|
57
|
-
defaultChar:
|
|
58
|
-
breakChar:
|
|
59
|
-
maxContent:
|
|
56
|
+
xHeight: r.int16,
|
|
57
|
+
capHeight: r.int16,
|
|
58
|
+
defaultChar: r.uint16,
|
|
59
|
+
breakChar: r.uint16,
|
|
60
|
+
maxContent: r.uint16
|
|
60
61
|
},
|
|
61
62
|
|
|
62
63
|
5: {
|
|
63
|
-
typoAscender:
|
|
64
|
-
typoDescender:
|
|
65
|
-
typoLineGap:
|
|
66
|
-
winAscent:
|
|
67
|
-
winDescent:
|
|
68
|
-
codePageRange:
|
|
64
|
+
typoAscender: r.int16,
|
|
65
|
+
typoDescender: r.int16,
|
|
66
|
+
typoLineGap: r.int16,
|
|
67
|
+
winAscent: r.uint16,
|
|
68
|
+
winDescent: r.uint16,
|
|
69
|
+
codePageRange: new r.Array(r.uint32, 2),
|
|
69
70
|
|
|
70
|
-
xHeight:
|
|
71
|
-
capHeight:
|
|
72
|
-
defaultChar:
|
|
73
|
-
breakChar:
|
|
74
|
-
maxContent:
|
|
71
|
+
xHeight: r.int16,
|
|
72
|
+
capHeight: r.int16,
|
|
73
|
+
defaultChar: r.uint16,
|
|
74
|
+
breakChar: r.uint16,
|
|
75
|
+
maxContent: r.uint16,
|
|
75
76
|
|
|
76
77
|
usLowerOpticalPointSize: r.uint16,
|
|
77
78
|
usUpperOpticalPointSize: r.uint16
|
package/src/tables/PCLT.js
CHANGED
|
@@ -2,20 +2,21 @@ import * as r from 'restructure';
|
|
|
2
2
|
|
|
3
3
|
// PCL 5 Table
|
|
4
4
|
// NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines
|
|
5
|
+
/** @type {import('restructure').Struct} */
|
|
5
6
|
export default new r.Struct({
|
|
6
|
-
version:
|
|
7
|
-
fontNumber:
|
|
8
|
-
pitch:
|
|
9
|
-
xHeight:
|
|
10
|
-
style:
|
|
11
|
-
typeFamily:
|
|
12
|
-
capHeight:
|
|
13
|
-
symbolSet:
|
|
14
|
-
typeface:
|
|
15
|
-
characterComplement:
|
|
16
|
-
fileName:
|
|
17
|
-
strokeWeight:
|
|
18
|
-
widthType:
|
|
19
|
-
serifStyle:
|
|
20
|
-
reserved:
|
|
7
|
+
version: r.uint16,
|
|
8
|
+
fontNumber: r.uint32,
|
|
9
|
+
pitch: r.uint16,
|
|
10
|
+
xHeight: r.uint16,
|
|
11
|
+
style: r.uint16,
|
|
12
|
+
typeFamily: r.uint16,
|
|
13
|
+
capHeight: r.uint16,
|
|
14
|
+
symbolSet: r.uint16,
|
|
15
|
+
typeface: new r.String(16),
|
|
16
|
+
characterComplement: new r.String(8),
|
|
17
|
+
fileName: new r.String(6),
|
|
18
|
+
strokeWeight: new r.String(1),
|
|
19
|
+
widthType: new r.String(1),
|
|
20
|
+
serifStyle: r.uint8,
|
|
21
|
+
reserved: new r.Reserved(r.uint8)
|
|
21
22
|
});
|
package/src/tables/STAT.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import * as r from 'restructure';
|
|
2
2
|
|
|
3
|
+
/** @typedef {import('restructure').BaseType} BaseType */
|
|
4
|
+
/** @typedef {import('restructure').DecodeStream} DecodeStream */
|
|
5
|
+
/** @typedef {import('restructure').EncodeStream} EncodeStream */
|
|
6
|
+
/** @typedef {import('restructure').StructValue} StructValue */
|
|
7
|
+
|
|
3
8
|
let AxisRecord = new r.Struct({
|
|
4
9
|
axisTag: new r.String(4),
|
|
5
10
|
axisNameID: r.uint16,
|
|
@@ -41,19 +46,40 @@ let AxisValue = new r.VersionedStruct(r.uint16, {
|
|
|
41
46
|
});
|
|
42
47
|
|
|
43
48
|
let AxisValueArray = new r.Struct({
|
|
44
|
-
axisValues: new r.Array(
|
|
49
|
+
axisValues: new r.Array(
|
|
50
|
+
new r.Pointer(r.uint16, AxisValue),
|
|
51
|
+
/** @param {StructValue} t @returns {number} */
|
|
52
|
+
t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).axisValueCount)
|
|
53
|
+
)
|
|
45
54
|
});
|
|
46
55
|
|
|
47
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Design-axis array whose record stride is designAxisSize (OpenType forward-compat).
|
|
58
|
+
* @implements {BaseType}
|
|
59
|
+
*/
|
|
48
60
|
class DesignAxisArray {
|
|
61
|
+
/**
|
|
62
|
+
* @param {StructValue | null | undefined} parent
|
|
63
|
+
* @returns {number}
|
|
64
|
+
*/
|
|
49
65
|
_stride(parent) {
|
|
50
66
|
// Spec requires room for Tag + 2×uint16 (8 bytes); never shrink below that.
|
|
51
|
-
|
|
67
|
+
let fromParent = parent ? /** @type {number | undefined} */ (parent.designAxisSize) : undefined;
|
|
68
|
+
let fromVal = parent && parent.val
|
|
69
|
+
? /** @type {number | undefined} */ (/** @type {StructValue} */ (parent.val).designAxisSize)
|
|
70
|
+
: undefined;
|
|
71
|
+
return Math.max(8, fromParent ?? fromVal ?? 8);
|
|
52
72
|
}
|
|
53
73
|
|
|
74
|
+
/**
|
|
75
|
+
* @param {DecodeStream} stream
|
|
76
|
+
* @param {StructValue | null | undefined} parent
|
|
77
|
+
* @returns {StructValue[]}
|
|
78
|
+
*/
|
|
54
79
|
decode(stream, parent) {
|
|
55
|
-
let count = parent.designAxisCount;
|
|
80
|
+
let count = parent ? /** @type {number} */ (parent.designAxisCount) : 0;
|
|
56
81
|
let size = this._stride(parent);
|
|
82
|
+
/** @type {StructValue[]} */
|
|
57
83
|
let res = [];
|
|
58
84
|
for (let i = 0; i < count; i++) {
|
|
59
85
|
let start = stream.pos;
|
|
@@ -63,13 +89,26 @@ class DesignAxisArray {
|
|
|
63
89
|
return res;
|
|
64
90
|
}
|
|
65
91
|
|
|
92
|
+
/**
|
|
93
|
+
* @param {unknown} array
|
|
94
|
+
* @param {StructValue | null | undefined} parent
|
|
95
|
+
* @returns {number}
|
|
96
|
+
*/
|
|
66
97
|
size(array, parent) {
|
|
67
|
-
|
|
98
|
+
let len = Array.isArray(array) ? array.length : 0;
|
|
99
|
+
return len * this._stride(parent);
|
|
68
100
|
}
|
|
69
101
|
|
|
102
|
+
/**
|
|
103
|
+
* @param {EncodeStream} stream
|
|
104
|
+
* @param {unknown} array
|
|
105
|
+
* @param {StructValue | null | undefined} parent
|
|
106
|
+
* @returns {void}
|
|
107
|
+
*/
|
|
70
108
|
encode(stream, array, parent) {
|
|
71
109
|
let size = this._stride(parent);
|
|
72
|
-
|
|
110
|
+
let items = Array.isArray(array) ? /** @type {StructValue[]} */ (array) : [];
|
|
111
|
+
for (let item of items) {
|
|
73
112
|
let start = stream.pos;
|
|
74
113
|
AxisRecord.encode(stream, item, parent);
|
|
75
114
|
let pad = size - (stream.pos - start);
|
|
@@ -80,6 +119,7 @@ class DesignAxisArray {
|
|
|
80
119
|
}
|
|
81
120
|
}
|
|
82
121
|
|
|
122
|
+
/** @type {import('restructure').VersionedStruct} */
|
|
83
123
|
export default new r.VersionedStruct(r.uint32, {
|
|
84
124
|
header: {
|
|
85
125
|
designAxisSize: r.uint16,
|
package/src/tables/VDMX.js
CHANGED
|
@@ -4,30 +4,31 @@ import * as r from 'restructure';
|
|
|
4
4
|
// sizes. This is needed in order to match font metrics on Windows.
|
|
5
5
|
|
|
6
6
|
let Ratio = new r.Struct({
|
|
7
|
-
bCharSet:
|
|
8
|
-
xRatio:
|
|
9
|
-
yStartRatio:
|
|
10
|
-
yEndRatio:
|
|
7
|
+
bCharSet: r.uint8, // Character set
|
|
8
|
+
xRatio: r.uint8, // Value to use for x-Ratio
|
|
9
|
+
yStartRatio: r.uint8, // Starting y-Ratio value
|
|
10
|
+
yEndRatio: r.uint8 // Ending y-Ratio value
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
let vTable = new r.Struct({
|
|
14
|
-
yPelHeight:
|
|
15
|
-
yMax:
|
|
16
|
-
yMin:
|
|
14
|
+
yPelHeight: r.uint16, // yPelHeight to which values apply
|
|
15
|
+
yMax: r.int16, // Maximum value (in pels) for this yPelHeight
|
|
16
|
+
yMin: r.int16 // Minimum value (in pels) for this yPelHeight
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
let VdmxGroup = new r.Struct({
|
|
20
|
-
recs:
|
|
21
|
-
startsz:
|
|
22
|
-
endsz:
|
|
23
|
-
entries:
|
|
20
|
+
recs: r.uint16, // Number of height records in this group
|
|
21
|
+
startsz: r.uint8, // Starting yPelHeight
|
|
22
|
+
endsz: r.uint8, // Ending yPelHeight
|
|
23
|
+
entries: new r.Array(vTable, 'recs') // The VDMX records
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
/** @type {import('restructure').Struct} */
|
|
26
27
|
export default new r.Struct({
|
|
27
|
-
version:
|
|
28
|
-
numRecs:
|
|
29
|
-
numRatios:
|
|
30
|
-
ratioRanges:
|
|
31
|
-
offsets:
|
|
32
|
-
groups:
|
|
28
|
+
version: r.uint16, // Version number (0 or 1)
|
|
29
|
+
numRecs: r.uint16, // Number of VDMX groups present
|
|
30
|
+
numRatios: r.uint16, // Number of aspect ratio groupings
|
|
31
|
+
ratioRanges: new r.Array(Ratio, 'numRatios'), // Ratio ranges
|
|
32
|
+
offsets: new r.Array(r.uint16, 'numRatios'), // Offset to the VDMX group for this ratio range
|
|
33
|
+
groups: new r.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings
|
|
33
34
|
});
|
package/src/tables/VORG.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import * as r from 'restructure';
|
|
2
2
|
|
|
3
3
|
let VerticalOrigin = new r.Struct({
|
|
4
|
-
glyphIndex:
|
|
5
|
-
vertOriginY:
|
|
4
|
+
glyphIndex: r.uint16,
|
|
5
|
+
vertOriginY: r.int16
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
+
/** @type {import('restructure').Struct} */
|
|
8
9
|
export default new r.Struct({
|
|
9
|
-
majorVersion:
|
|
10
|
-
minorVersion:
|
|
11
|
-
defaultVertOriginY:
|
|
12
|
-
numVertOriginYMetrics:
|
|
13
|
-
metrics:
|
|
10
|
+
majorVersion: r.uint16,
|
|
11
|
+
minorVersion: r.uint16,
|
|
12
|
+
defaultVertOriginY: r.int16,
|
|
13
|
+
numVertOriginYMetrics: r.uint16,
|
|
14
|
+
metrics: new r.Array(VerticalOrigin, 'numVertOriginYMetrics')
|
|
14
15
|
});
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import * as r from 'restructure';
|
|
2
2
|
|
|
3
|
+
/** @typedef {import('restructure').BaseType} BaseType */
|
|
4
|
+
/** @typedef {import('restructure').DecodeStream} DecodeStream */
|
|
5
|
+
/** @typedef {import('restructure').StructValue} StructValue */
|
|
6
|
+
/** @typedef {import('../../types/fontkit').TableEntry} TableEntry */
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* WOFF2 variable-length unsigned integer (Base128).
|
|
10
|
+
* @type {BaseType}
|
|
11
|
+
*/
|
|
3
12
|
const Base128 = {
|
|
13
|
+
/**
|
|
14
|
+
* @param {DecodeStream} stream
|
|
15
|
+
* @returns {number}
|
|
16
|
+
*/
|
|
4
17
|
decode(stream) {
|
|
5
18
|
let result = 0;
|
|
6
19
|
let iterable = [0, 1, 2, 3, 4];
|
|
@@ -34,14 +47,46 @@ let knownTags = [
|
|
|
34
47
|
|
|
35
48
|
let WOFF2DirectoryEntry = new r.Struct({
|
|
36
49
|
flags: r.uint8,
|
|
37
|
-
customTag: new r.Optional(
|
|
38
|
-
|
|
50
|
+
customTag: new r.Optional(
|
|
51
|
+
new r.String(4),
|
|
52
|
+
/** @param {StructValue} t @returns {boolean} */
|
|
53
|
+
t => (/** @type {number} */ (t.flags) & 0x3f) === 0x3f
|
|
54
|
+
),
|
|
55
|
+
/**
|
|
56
|
+
* @param {StructValue} t
|
|
57
|
+
* @returns {string}
|
|
58
|
+
*/
|
|
59
|
+
tag: (t) => {
|
|
60
|
+
let flags = /** @type {number} */ (t.flags);
|
|
61
|
+
return /** @type {string} */ (t.customTag) || knownTags[flags & 0x3f];
|
|
62
|
+
},
|
|
39
63
|
length: Base128,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
64
|
+
/**
|
|
65
|
+
* @param {StructValue} t
|
|
66
|
+
* @returns {number}
|
|
67
|
+
*/
|
|
68
|
+
transformVersion: t => (/** @type {number} */ (t.flags) >>> 6) & 0x03,
|
|
69
|
+
/**
|
|
70
|
+
* @param {StructValue} t
|
|
71
|
+
* @returns {boolean}
|
|
72
|
+
*/
|
|
73
|
+
transformed: t => (t.tag === 'glyf' || t.tag === 'loca')
|
|
74
|
+
? t.transformVersion === 0
|
|
75
|
+
: t.transformVersion !== 0,
|
|
76
|
+
transformLength: new r.Optional(
|
|
77
|
+
Base128,
|
|
78
|
+
/** @param {StructValue} t @returns {boolean} */
|
|
79
|
+
t => !!t.transformed
|
|
80
|
+
)
|
|
43
81
|
});
|
|
44
82
|
|
|
83
|
+
/**
|
|
84
|
+
* @typedef {StructValue & {
|
|
85
|
+
* tables: TableEntry[] | Record<string, TableEntry>
|
|
86
|
+
* }} WOFF2DirectoryValue
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
/** @type {import('restructure').Struct} */
|
|
45
90
|
let WOFF2Directory = new r.Struct({
|
|
46
91
|
tag: new r.String(4), // should be 'wOF2'
|
|
47
92
|
flavor: r.uint32,
|
|
@@ -60,14 +105,17 @@ let WOFF2Directory = new r.Struct({
|
|
|
60
105
|
tables: new r.Array(WOFF2DirectoryEntry, 'numTables')
|
|
61
106
|
});
|
|
62
107
|
|
|
63
|
-
WOFF2Directory.process = function() {
|
|
108
|
+
WOFF2Directory.process = function () {
|
|
109
|
+
let self = /** @type {WOFF2DirectoryValue} */ (this);
|
|
110
|
+
/** @type {Record<string, TableEntry>} */
|
|
64
111
|
let tables = {};
|
|
65
|
-
|
|
66
|
-
|
|
112
|
+
let list = /** @type {TableEntry[]} */ (self.tables);
|
|
113
|
+
for (let i = 0; i < list.length; i++) {
|
|
114
|
+
let table = list[i];
|
|
67
115
|
tables[table.tag] = table;
|
|
68
116
|
}
|
|
69
117
|
|
|
70
|
-
|
|
118
|
+
self.tables = tables;
|
|
71
119
|
};
|
|
72
120
|
|
|
73
121
|
export default WOFF2Directory;
|
|
@@ -1,37 +1,49 @@
|
|
|
1
1
|
import * as r from 'restructure';
|
|
2
2
|
|
|
3
|
+
/** @typedef {import('restructure').StructValue} StructValue */
|
|
4
|
+
/** @typedef {import('../../types/fontkit').TableEntry} TableEntry */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {StructValue & {
|
|
8
|
+
* tables: TableEntry[] | Record<string, TableEntry>
|
|
9
|
+
* }} WOFFDirectoryValue
|
|
10
|
+
*/
|
|
11
|
+
|
|
3
12
|
let WOFFDirectoryEntry = new r.Struct({
|
|
4
|
-
tag:
|
|
5
|
-
offset:
|
|
6
|
-
compLength:
|
|
7
|
-
length:
|
|
13
|
+
tag: new r.String(4),
|
|
14
|
+
offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
|
|
15
|
+
compLength: r.uint32,
|
|
16
|
+
length: r.uint32,
|
|
8
17
|
origChecksum: r.uint32
|
|
9
18
|
});
|
|
10
19
|
|
|
20
|
+
/** @type {import('restructure').Struct} */
|
|
11
21
|
let WOFFDirectory = new r.Struct({
|
|
12
|
-
tag:
|
|
13
|
-
flavor:
|
|
14
|
-
length:
|
|
15
|
-
numTables:
|
|
16
|
-
reserved:
|
|
17
|
-
totalSfntSize:
|
|
18
|
-
majorVersion:
|
|
19
|
-
minorVersion:
|
|
20
|
-
metaOffset:
|
|
21
|
-
metaLength:
|
|
22
|
+
tag: new r.String(4), // should be 'wOFF'
|
|
23
|
+
flavor: r.uint32,
|
|
24
|
+
length: r.uint32,
|
|
25
|
+
numTables: r.uint16,
|
|
26
|
+
reserved: new r.Reserved(r.uint16),
|
|
27
|
+
totalSfntSize: r.uint32,
|
|
28
|
+
majorVersion: r.uint16,
|
|
29
|
+
minorVersion: r.uint16,
|
|
30
|
+
metaOffset: r.uint32,
|
|
31
|
+
metaLength: r.uint32,
|
|
22
32
|
metaOrigLength: r.uint32,
|
|
23
|
-
privOffset:
|
|
24
|
-
privLength:
|
|
25
|
-
tables:
|
|
33
|
+
privOffset: r.uint32,
|
|
34
|
+
privLength: r.uint32,
|
|
35
|
+
tables: new r.Array(WOFFDirectoryEntry, 'numTables')
|
|
26
36
|
});
|
|
27
37
|
|
|
28
|
-
WOFFDirectory.process = function() {
|
|
38
|
+
WOFFDirectory.process = function () {
|
|
39
|
+
let self = /** @type {WOFFDirectoryValue} */ (this);
|
|
40
|
+
/** @type {Record<string, TableEntry>} */
|
|
29
41
|
let tables = {};
|
|
30
|
-
for (let table of
|
|
42
|
+
for (let table of /** @type {TableEntry[]} */ (self.tables)) {
|
|
31
43
|
tables[table.tag] = table;
|
|
32
44
|
}
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
self.tables = tables;
|
|
35
47
|
};
|
|
36
48
|
|
|
37
49
|
export default WOFFDirectory;
|