@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.
Files changed (142) hide show
  1. package/dist/browser-module.mjs +4448 -1142
  2. package/dist/browser-module.mjs.map +1 -1
  3. package/dist/browser.cjs +4449 -1142
  4. package/dist/browser.cjs.map +1 -1
  5. package/dist/main.cjs +4449 -1142
  6. package/dist/main.cjs.map +1 -1
  7. package/dist/module.mjs +4448 -1142
  8. package/dist/module.mjs.map +1 -1
  9. package/package.json +4 -1
  10. package/src/CmapProcessor.js +60 -21
  11. package/src/DFont.js +114 -14
  12. package/src/TTFFont.js +260 -62
  13. package/src/TrueTypeCollection.js +59 -15
  14. package/src/WOFF2Font.js +128 -22
  15. package/src/WOFFFont.js +45 -8
  16. package/src/aat/AATFeatureMap.js +83 -40
  17. package/src/aat/AATLayoutEngine.js +34 -2
  18. package/src/aat/AATLookupTable.js +24 -6
  19. package/src/aat/AATMorxProcessor.js +202 -65
  20. package/src/aat/AATStateMachine.js +35 -3
  21. package/src/base.js +20 -1
  22. package/src/cff/CFFCharsets.js +3 -0
  23. package/src/cff/CFFDict.js +81 -11
  24. package/src/cff/CFFEncodings.js +2 -0
  25. package/src/cff/CFFFont.js +120 -24
  26. package/src/cff/CFFIndex.js +66 -9
  27. package/src/cff/CFFOperand.js +53 -28
  28. package/src/cff/CFFPointer.js +41 -2
  29. package/src/cff/CFFPrivateDict.js +34 -24
  30. package/src/cff/CFFStandardStrings.js +68 -67
  31. package/src/cff/CFFTop.js +161 -68
  32. package/src/decorators.js +34 -15
  33. package/src/encodings.js +133 -116
  34. package/src/fs.js +10 -0
  35. package/src/glyph/BBox.js +14 -0
  36. package/src/glyph/CFFGlyph.js +293 -152
  37. package/src/glyph/COLRGlyph.js +40 -5
  38. package/src/glyph/Glyph.js +72 -13
  39. package/src/glyph/GlyphVariationProcessor.js +158 -62
  40. package/src/glyph/Path.js +119 -32
  41. package/src/glyph/SBIXGlyph.js +57 -8
  42. package/src/glyph/StandardNames.js +1 -0
  43. package/src/glyph/TTFGlyph.js +203 -63
  44. package/src/glyph/TTFGlyphEncoder.js +58 -26
  45. package/src/glyph/WOFF2Glyph.js +25 -6
  46. package/src/layout/GlyphPosition.js +6 -0
  47. package/src/layout/GlyphRun.js +28 -10
  48. package/src/layout/KernProcessor.js +63 -4
  49. package/src/layout/LayoutEngine.js +99 -26
  50. package/src/layout/Script.js +52 -26
  51. package/src/layout/UnicodeLayoutEngine.js +34 -10
  52. package/src/opentype/GPOSProcessor.js +156 -45
  53. package/src/opentype/GSUBProcessor.js +92 -33
  54. package/src/opentype/GlyphInfo.js +53 -5
  55. package/src/opentype/GlyphIterator.js +51 -2
  56. package/src/opentype/OTLayoutEngine.js +66 -8
  57. package/src/opentype/OTProcessor.js +284 -71
  58. package/src/opentype/ShapingPlan.js +52 -5
  59. package/src/opentype/shapers/ArabicShaper.js +27 -8
  60. package/src/opentype/shapers/DefaultShaper.js +54 -10
  61. package/src/opentype/shapers/HangulShaper.js +120 -42
  62. package/src/opentype/shapers/HebrewShaper.js +50 -16
  63. package/src/opentype/shapers/IndicShaper.js +159 -44
  64. package/src/opentype/shapers/ThaiShaper.js +50 -19
  65. package/src/opentype/shapers/UniversalShaper.js +83 -17
  66. package/src/opentype/shapers/index.js +48 -35
  67. package/src/opentype/shapers/indic-data.js +2 -2
  68. package/src/packages/unicode-properties/data-trie.js +2 -1
  69. package/src/packages/unicode-properties/data.js +13 -1
  70. package/src/packages/unicode-properties/dist/index.cjs +23 -10
  71. package/src/packages/unicode-properties/dist/index.cjs.map +2 -2
  72. package/src/packages/unicode-properties/dist/index.mjs +22 -10
  73. package/src/packages/unicode-properties/dist/index.mjs.map +2 -2
  74. package/src/packages/unicode-properties/generate.js +3 -4
  75. package/src/packages/unicode-properties/index.js +95 -30
  76. package/src/packages/unicode-properties/package.json +1 -1
  77. package/src/packages/unicode-trie/builder.js +146 -29
  78. package/src/packages/unicode-trie/dist/builder.cjs +135 -25
  79. package/src/packages/unicode-trie/dist/builder.cjs.map +2 -2
  80. package/src/packages/unicode-trie/dist/builder.mjs +134 -25
  81. package/src/packages/unicode-trie/dist/builder.mjs.map +2 -2
  82. package/src/packages/unicode-trie/dist/index.cjs +22 -9
  83. package/src/packages/unicode-trie/dist/index.cjs.map +2 -2
  84. package/src/packages/unicode-trie/dist/index.mjs +21 -9
  85. package/src/packages/unicode-trie/dist/index.mjs.map +2 -2
  86. package/src/packages/unicode-trie/index.js +63 -12
  87. package/src/packages/unicode-trie/package.json +1 -1
  88. package/src/packages/unicode-trie/swap.js +15 -2
  89. package/src/subset/CFFSubset.js +112 -22
  90. package/src/subset/Subset.js +23 -3
  91. package/src/subset/TTFSubset.js +84 -41
  92. package/src/tables/BASE.js +28 -27
  93. package/src/tables/COLR.js +10 -9
  94. package/src/tables/CPAL.js +2 -1
  95. package/src/tables/DSIG.js +8 -7
  96. package/src/tables/EBDT.js +10 -4
  97. package/src/tables/EBLC.js +70 -10
  98. package/src/tables/GDEF.js +18 -17
  99. package/src/tables/GPOS.js +153 -90
  100. package/src/tables/GSUB.js +50 -39
  101. package/src/tables/HVAR.js +51 -5
  102. package/src/tables/JSTF.js +17 -16
  103. package/src/tables/LTSH.js +4 -3
  104. package/src/tables/OS2.js +50 -49
  105. package/src/tables/PCLT.js +16 -15
  106. package/src/tables/STAT.js +46 -6
  107. package/src/tables/VDMX.js +18 -17
  108. package/src/tables/VORG.js +8 -7
  109. package/src/tables/WOFF2Directory.js +57 -9
  110. package/src/tables/WOFFDirectory.js +32 -20
  111. package/src/tables/aat.js +160 -35
  112. package/src/tables/avar.js +1 -0
  113. package/src/tables/bsln.js +3 -2
  114. package/src/tables/cmap.js +83 -63
  115. package/src/tables/cvt.js +1 -0
  116. package/src/tables/directory.js +56 -28
  117. package/src/tables/feat.js +24 -2
  118. package/src/tables/fpgm.js +1 -0
  119. package/src/tables/fvar.js +32 -4
  120. package/src/tables/gasp.js +6 -5
  121. package/src/tables/glyf.js +2 -1
  122. package/src/tables/gvar.js +29 -2
  123. package/src/tables/hdmx.js +18 -7
  124. package/src/tables/head.js +17 -16
  125. package/src/tables/hhea.js +15 -14
  126. package/src/tables/hmtx.js +18 -2
  127. package/src/tables/index.js +1 -5
  128. package/src/tables/just.js +15 -4
  129. package/src/tables/kern.js +84 -47
  130. package/src/tables/loca.js +23 -10
  131. package/src/tables/maxp.js +16 -15
  132. package/src/tables/morx.js +27 -20
  133. package/src/tables/name.js +120 -39
  134. package/src/tables/opbd.js +2 -1
  135. package/src/tables/opentype.js +126 -91
  136. package/src/tables/post.js +18 -11
  137. package/src/tables/prep.js +1 -0
  138. package/src/tables/sbix.js +12 -1
  139. package/src/tables/variations.js +29 -9
  140. package/src/tables/vhea.js +15 -14
  141. package/src/tables/vmtx.js +20 -4
  142. package/src/utils.js +15 -0
@@ -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: 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, new 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, new LookupList(GPOSLookup))
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: new r.String(4),
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: r.uint16,
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: new r.String(4),
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: r.uint32, // should be 0x00010000
41
+ version: r.uint32, // should be 0x00010000
41
42
  scriptCount: r.uint16,
42
- scriptList: new r.Array(JstfScriptRecord, 'scriptCount')
43
+ scriptList: new r.Array(JstfScriptRecord, 'scriptCount')
43
44
  });
@@ -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: r.uint16,
8
- numGlyphs: r.uint16,
9
- yPels: new r.Array(r.uint8, 'numGlyphs')
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: r.int16, // average weighted advance width of lower case letters and space
6
- usWeightClass: r.uint16, // visual weight of stroke in glyphs
7
- usWidthClass: r.uint16, // relative change from the normal aspect ratio (width to height ratio)
8
- fsType: new r.Bitfield(r.uint16, [ // Indicates font embedding licensing rights
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: r.int16, // recommended horizontal size in pixels for subscripts
13
- ySubscriptYSize: r.int16, // recommended vertical size in pixels for subscripts
14
- ySubscriptXOffset: r.int16, // recommended horizontal offset for subscripts
15
- ySubscriptYOffset: r.int16, // recommended vertical offset form the baseline for subscripts
16
- ySuperscriptXSize: r.int16, // recommended horizontal size in pixels for superscripts
17
- ySuperscriptYSize: r.int16, // recommended vertical size in pixels for superscripts
18
- ySuperscriptXOffset: r.int16, // recommended horizontal offset for superscripts
19
- ySuperscriptYOffset: r.int16, // recommended vertical offset from the baseline for superscripts
20
- yStrikeoutSize: r.int16, // width of the strikeout stroke
21
- yStrikeoutPosition: r.int16, // position of the strikeout stroke relative to the baseline
22
- sFamilyClass: r.int16, // classification of font-family design
23
- panose: new r.Array(r.uint8, 10), // describe the visual characteristics of a given typeface
24
- ulCharRange: new r.Array(r.uint32, 4),
25
- vendorID: new r.String(4), // four character identifier for the font vendor
26
- fsSelection: new r.Bitfield(r.uint16, [ // bit field containing information about the font
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: r.uint16, // The minimum Unicode index in this font
31
- usLastCharIndex: r.uint16 // The maximum Unicode index in this font
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: r.int16,
39
- typoDescender: r.int16,
40
- typoLineGap: r.int16,
41
- winAscent: r.uint16,
42
- winDescent: r.uint16,
43
- codePageRange: new r.Array(r.uint32, 2)
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: r.int16,
49
- typoDescender: r.int16,
50
- typoLineGap: r.int16,
51
- winAscent: r.uint16,
52
- winDescent: r.uint16,
53
- codePageRange: new r.Array(r.uint32, 2),
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: r.int16,
56
- capHeight: r.int16,
57
- defaultChar: r.uint16,
58
- breakChar: r.uint16,
59
- maxContent: r.uint16
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: r.int16,
64
- typoDescender: r.int16,
65
- typoLineGap: r.int16,
66
- winAscent: r.uint16,
67
- winDescent: r.uint16,
68
- codePageRange: new r.Array(r.uint32, 2),
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: r.int16,
71
- capHeight: r.int16,
72
- defaultChar: r.uint16,
73
- breakChar: r.uint16,
74
- maxContent: r.uint16,
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
@@ -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: r.uint16,
7
- fontNumber: r.uint32,
8
- pitch: r.uint16,
9
- xHeight: r.uint16,
10
- style: r.uint16,
11
- typeFamily: r.uint16,
12
- capHeight: r.uint16,
13
- symbolSet: r.uint16,
14
- typeface: new r.String(16),
15
- characterComplement: new r.String(8),
16
- fileName: new r.String(6),
17
- strokeWeight: new r.String(1),
18
- widthType: new r.String(1),
19
- serifStyle: r.uint8,
20
- reserved: new r.Reserved(r.uint8)
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
  });
@@ -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(new r.Pointer(r.uint16, AxisValue), t => t.parent.axisValueCount)
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
- // Use designAxisSize as record stride (OpenType forward-compat).
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
- return Math.max(8, parent.designAxisSize ?? parent.val?.designAxisSize ?? 8);
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
- return (array?.length ?? 0) * this._stride(parent);
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
- for (let item of array) {
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,
@@ -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: 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
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: 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
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: 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
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: r.uint16, // Version number (0 or 1)
28
- numRecs: r.uint16, // Number of VDMX groups present
29
- numRatios: r.uint16, // Number of aspect ratio groupings
30
- ratioRanges: new r.Array(Ratio, 'numRatios'), // Ratio ranges
31
- offsets: new r.Array(r.uint16, 'numRatios'), // Offset to the VDMX group for this ratio range
32
- groups: new r.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings
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
  });
@@ -1,14 +1,15 @@
1
1
  import * as r from 'restructure';
2
2
 
3
3
  let VerticalOrigin = new r.Struct({
4
- glyphIndex: r.uint16,
5
- vertOriginY: r.int16
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: r.uint16,
10
- minorVersion: r.uint16,
11
- defaultVertOriginY: r.int16,
12
- numVertOriginYMetrics: r.uint16,
13
- metrics: new r.Array(VerticalOrigin, 'numVertOriginYMetrics')
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(new r.String(4), t => (t.flags & 0x3f) === 0x3f),
38
- tag: t => t.customTag || knownTags[t.flags & 0x3f],// || (() => { throw new Error(`Bad tag: ${flags & 0x3f}`); })(); },
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
- transformVersion: t => (t.flags >>> 6) & 0x03,
41
- transformed: t => (t.tag === 'glyf' || t.tag === 'loca') ? t.transformVersion === 0 : t.transformVersion !== 0,
42
- transformLength: new r.Optional(Base128, t => t.transformed)
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
- for (let i = 0; i < this.tables.length; i++) {
66
- let table = this.tables[i];
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
- return this.tables = tables;
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: new r.String(4),
5
- offset: new r.Pointer(r.uint32, 'void', {type: 'global'}),
6
- compLength: r.uint32,
7
- length: r.uint32,
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: new r.String(4), // should be 'wOFF'
13
- flavor: r.uint32,
14
- length: r.uint32,
15
- numTables: r.uint16,
16
- reserved: new r.Reserved(r.uint16),
17
- totalSfntSize: r.uint32,
18
- majorVersion: r.uint16,
19
- minorVersion: r.uint16,
20
- metaOffset: r.uint32,
21
- metaLength: r.uint32,
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: r.uint32,
24
- privLength: r.uint32,
25
- tables: new r.Array(WOFFDirectoryEntry, 'numTables')
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 this.tables) {
42
+ for (let table of /** @type {TableEntry[]} */ (self.tables)) {
31
43
  tables[table.tag] = table;
32
44
  }
33
45
 
34
- this.tables = tables;
46
+ self.tables = tables;
35
47
  };
36
48
 
37
49
  export default WOFFDirectory;