@nice2dev/ui-graphics 1.0.0 → 1.0.2

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 (146) hide show
  1. package/CHANGELOG.md +147 -1
  2. package/dist/cjs/animation/AnimatedPerson.js +2 -2
  3. package/dist/cjs/animation/AnimatedPerson.js.map +1 -1
  4. package/dist/cjs/animation/AnimationEditor.js +11 -6
  5. package/dist/cjs/animation/AnimationEditor.js.map +1 -1
  6. package/dist/cjs/animation/Audience.js +4 -3
  7. package/dist/cjs/animation/Audience.js.map +1 -1
  8. package/dist/cjs/animation/BodyRenderer.js +5 -2
  9. package/dist/cjs/animation/BodyRenderer.js.map +1 -1
  10. package/dist/cjs/animation/rig/RigPlayer.js +2 -2
  11. package/dist/cjs/animation/rig/RigPlayer.js.map +1 -1
  12. package/dist/cjs/animation/rig/RiggedBody.js +2 -2
  13. package/dist/cjs/animation/rig/RiggedBody.js.map +1 -1
  14. package/dist/cjs/animation/shapes/heads.js +4 -1
  15. package/dist/cjs/animation/shapes/heads.js.map +1 -1
  16. package/dist/cjs/core/LocalUI.js +1 -1
  17. package/dist/cjs/core/NiceBrushEngine.js +446 -0
  18. package/dist/cjs/core/NiceBrushEngine.js.map +1 -0
  19. package/dist/cjs/core/yjsCollaboration.js +292 -0
  20. package/dist/cjs/core/yjsCollaboration.js.map +1 -0
  21. package/dist/cjs/font/NiceFontEditor.js +89 -85
  22. package/dist/cjs/font/NiceFontEditor.js.map +1 -1
  23. package/dist/cjs/font/fontFormatUtils.js +468 -0
  24. package/dist/cjs/font/fontFormatUtils.js.map +1 -0
  25. package/dist/cjs/game/GameAsset2dEditor.js +38 -24
  26. package/dist/cjs/game/GameAsset2dEditor.js.map +1 -1
  27. package/dist/cjs/icon/NiceIconEditor.js +218 -133
  28. package/dist/cjs/icon/NiceIconEditor.js.map +1 -1
  29. package/dist/cjs/index.js +83 -1
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/nice2dev-ui-graphics.css +1 -1
  32. package/dist/cjs/photo/NiceAITools.js +446 -0
  33. package/dist/cjs/photo/NiceAITools.js.map +1 -0
  34. package/dist/cjs/photo/PhotoEditor.js +2 -2
  35. package/dist/cjs/photo/PhotoEditor.js.map +1 -1
  36. package/dist/cjs/pixel/PixelEditor.js +16 -5
  37. package/dist/cjs/pixel/PixelEditor.js.map +1 -1
  38. package/dist/cjs/pixel/PixelEditor.module.css.js +1 -1
  39. package/dist/cjs/pixel/PixelEditorMenuBar.js +2 -1
  40. package/dist/cjs/pixel/PixelEditorMenuBar.js.map +1 -1
  41. package/dist/cjs/pixel/PixelEditorRightPanel.js +3 -2
  42. package/dist/cjs/pixel/PixelEditorRightPanel.js.map +1 -1
  43. package/dist/cjs/pixel/PixelEditorTimeline.js +2 -1
  44. package/dist/cjs/pixel/PixelEditorTimeline.js.map +1 -1
  45. package/dist/cjs/pixel/PixelEditorToolbar.js +2 -1
  46. package/dist/cjs/pixel/PixelEditorToolbar.js.map +1 -1
  47. package/dist/cjs/pixel/SpriteGeneratorPanel.js +224 -0
  48. package/dist/cjs/pixel/SpriteGeneratorPanel.js.map +1 -0
  49. package/dist/cjs/pixel/animalGeneratorPresets.js +654 -0
  50. package/dist/cjs/pixel/animalGeneratorPresets.js.map +1 -0
  51. package/dist/cjs/pixel/buildingGeneratorPresets.js +573 -0
  52. package/dist/cjs/pixel/buildingGeneratorPresets.js.map +1 -0
  53. package/dist/cjs/pixel/characterGeneratorPresets.js +563 -0
  54. package/dist/cjs/pixel/characterGeneratorPresets.js.map +1 -0
  55. package/dist/cjs/pixel/spriteGeneratorCore.js +297 -0
  56. package/dist/cjs/pixel/spriteGeneratorCore.js.map +1 -0
  57. package/dist/cjs/pixel/usePixelEditor.js +16 -0
  58. package/dist/cjs/pixel/usePixelEditor.js.map +1 -1
  59. package/dist/cjs/texture/Nice3DTexturePainter.js +123 -79
  60. package/dist/cjs/texture/Nice3DTexturePainter.js.map +1 -1
  61. package/dist/cjs/ui/NiceUIDesigner.js +175 -62
  62. package/dist/cjs/ui/NiceUIDesigner.js.map +1 -1
  63. package/dist/cjs/ui/dist/index.js +50089 -0
  64. package/dist/cjs/ui/dist/index.js.map +1 -0
  65. package/dist/cjs/vector/NiceSvgToCode.js +427 -0
  66. package/dist/cjs/vector/NiceSvgToCode.js.map +1 -0
  67. package/dist/cjs/vector/VectorEditor.js +7 -3
  68. package/dist/cjs/vector/VectorEditor.js.map +1 -1
  69. package/dist/cjs/vector/VectorEditor.module.css.js +1 -1
  70. package/dist/cjs/vector/VectorEditorMenuBar.js +5 -1
  71. package/dist/cjs/vector/VectorEditorMenuBar.js.map +1 -1
  72. package/dist/cjs/vector/VectorEditorRightPanel.js +23 -19
  73. package/dist/cjs/vector/VectorEditorRightPanel.js.map +1 -1
  74. package/dist/esm/animation/AnimatedPerson.js +2 -2
  75. package/dist/esm/animation/AnimatedPerson.js.map +1 -1
  76. package/dist/esm/animation/AnimationEditor.js +12 -8
  77. package/dist/esm/animation/AnimationEditor.js.map +1 -1
  78. package/dist/esm/animation/Audience.js +5 -4
  79. package/dist/esm/animation/Audience.js.map +1 -1
  80. package/dist/esm/animation/BodyRenderer.js +4 -2
  81. package/dist/esm/animation/BodyRenderer.js.map +1 -1
  82. package/dist/esm/animation/rig/RigPlayer.js +4 -4
  83. package/dist/esm/animation/rig/RigPlayer.js.map +1 -1
  84. package/dist/esm/animation/rig/RiggedBody.js +2 -2
  85. package/dist/esm/animation/rig/RiggedBody.js.map +1 -1
  86. package/dist/esm/animation/shapes/heads.js +4 -2
  87. package/dist/esm/animation/shapes/heads.js.map +1 -1
  88. package/dist/esm/core/LocalUI.js +4 -4
  89. package/dist/esm/core/NiceBrushEngine.js +442 -0
  90. package/dist/esm/core/NiceBrushEngine.js.map +1 -0
  91. package/dist/esm/core/yjsCollaboration.js +283 -0
  92. package/dist/esm/core/yjsCollaboration.js.map +1 -0
  93. package/dist/esm/font/NiceFontEditor.js +89 -85
  94. package/dist/esm/font/NiceFontEditor.js.map +1 -1
  95. package/dist/esm/font/fontFormatUtils.js +461 -0
  96. package/dist/esm/font/fontFormatUtils.js.map +1 -0
  97. package/dist/esm/game/GameAsset2dEditor.js +38 -25
  98. package/dist/esm/game/GameAsset2dEditor.js.map +1 -1
  99. package/dist/esm/icon/NiceIconEditor.js +218 -133
  100. package/dist/esm/icon/NiceIconEditor.js.map +1 -1
  101. package/dist/esm/index.js +21 -11
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/nice2dev-ui-graphics.css +1 -1
  104. package/dist/esm/photo/NiceAITools.js +439 -0
  105. package/dist/esm/photo/NiceAITools.js.map +1 -0
  106. package/dist/esm/photo/PhotoEditor.js +2 -2
  107. package/dist/esm/photo/PhotoEditor.js.map +1 -1
  108. package/dist/esm/pixel/PixelEditor.js +16 -6
  109. package/dist/esm/pixel/PixelEditor.js.map +1 -1
  110. package/dist/esm/pixel/PixelEditor.module.css.js +1 -1
  111. package/dist/esm/pixel/PixelEditorMenuBar.js +2 -1
  112. package/dist/esm/pixel/PixelEditorMenuBar.js.map +1 -1
  113. package/dist/esm/pixel/PixelEditorRightPanel.js +3 -2
  114. package/dist/esm/pixel/PixelEditorRightPanel.js.map +1 -1
  115. package/dist/esm/pixel/PixelEditorTimeline.js +2 -1
  116. package/dist/esm/pixel/PixelEditorTimeline.js.map +1 -1
  117. package/dist/esm/pixel/PixelEditorToolbar.js +2 -1
  118. package/dist/esm/pixel/PixelEditorToolbar.js.map +1 -1
  119. package/dist/esm/pixel/SpriteGeneratorPanel.js +222 -0
  120. package/dist/esm/pixel/SpriteGeneratorPanel.js.map +1 -0
  121. package/dist/esm/pixel/animalGeneratorPresets.js +647 -0
  122. package/dist/esm/pixel/animalGeneratorPresets.js.map +1 -0
  123. package/dist/esm/pixel/buildingGeneratorPresets.js +566 -0
  124. package/dist/esm/pixel/buildingGeneratorPresets.js.map +1 -0
  125. package/dist/esm/pixel/characterGeneratorPresets.js +556 -0
  126. package/dist/esm/pixel/characterGeneratorPresets.js.map +1 -0
  127. package/dist/esm/pixel/spriteGeneratorCore.js +279 -0
  128. package/dist/esm/pixel/spriteGeneratorCore.js.map +1 -0
  129. package/dist/esm/pixel/usePixelEditor.js +16 -0
  130. package/dist/esm/pixel/usePixelEditor.js.map +1 -1
  131. package/dist/esm/texture/Nice3DTexturePainter.js +123 -79
  132. package/dist/esm/texture/Nice3DTexturePainter.js.map +1 -1
  133. package/dist/esm/ui/NiceUIDesigner.js +175 -62
  134. package/dist/esm/ui/NiceUIDesigner.js.map +1 -1
  135. package/dist/esm/ui/dist/index.js +49686 -0
  136. package/dist/esm/ui/dist/index.js.map +1 -0
  137. package/dist/esm/vector/NiceSvgToCode.js +423 -0
  138. package/dist/esm/vector/NiceSvgToCode.js.map +1 -0
  139. package/dist/esm/vector/VectorEditor.js +7 -4
  140. package/dist/esm/vector/VectorEditor.js.map +1 -1
  141. package/dist/esm/vector/VectorEditor.module.css.js +1 -1
  142. package/dist/esm/vector/VectorEditorMenuBar.js +5 -1
  143. package/dist/esm/vector/VectorEditorMenuBar.js.map +1 -1
  144. package/dist/esm/vector/VectorEditorRightPanel.js +23 -19
  145. package/dist/esm/vector/VectorEditorRightPanel.js.map +1 -1
  146. package/package.json +3 -4
@@ -0,0 +1,461 @@
1
+ /**
2
+ * fontFormatUtils — OTF/TTF binary generation and OpenType feature support
3
+ *
4
+ * Features:
5
+ * - Generate TrueType-compatible binary font data (minimal .ttf)
6
+ * - OpenType feature definitions (liga, kern, smcp, onum, salt, ss01-ss20)
7
+ * - Kerning table generation from pairs
8
+ * - WOFF/WOFF2 wrapper
9
+ * - Font file download utility
10
+ */
11
+ /* ── OpenType Feature Presets ── */
12
+ const OPENTYPE_FEATURE_PRESETS = {
13
+ basic: [
14
+ { tag: 'kern', enabled: true, kerning: [] },
15
+ { tag: 'liga', enabled: true, ligatures: [
16
+ { input: ['f', 'i'], replacement: '\uFB01' },
17
+ { input: ['f', 'l'], replacement: '\uFB02' },
18
+ { input: ['f', 'f'], replacement: '\uFB00' },
19
+ ] },
20
+ ],
21
+ typographic: [
22
+ { tag: 'kern', enabled: true, kerning: [] },
23
+ { tag: 'liga', enabled: true, ligatures: [] },
24
+ { tag: 'onum', enabled: true },
25
+ { tag: 'smcp', enabled: true },
26
+ { tag: 'frac', enabled: true },
27
+ { tag: 'zero', enabled: true },
28
+ ],
29
+ 'stylistic-full': [
30
+ { tag: 'kern', enabled: true, kerning: [] },
31
+ { tag: 'liga', enabled: true, ligatures: [] },
32
+ { tag: 'salt', enabled: true },
33
+ { tag: 'calt', enabled: true },
34
+ { tag: 'swsh', enabled: true },
35
+ { tag: 'ss01', enabled: true },
36
+ { tag: 'ss02', enabled: true },
37
+ { tag: 'ss03', enabled: true },
38
+ ],
39
+ };
40
+ /* ── Common Kerning Pairs ── */
41
+ const COMMON_KERNING_PAIRS = [
42
+ { left: 'A', right: 'V', value: -80 },
43
+ { left: 'A', right: 'W', value: -60 },
44
+ { left: 'A', right: 'Y', value: -80 },
45
+ { left: 'A', right: 'T', value: -60 },
46
+ { left: 'T', right: 'a', value: -60 },
47
+ { left: 'T', right: 'e', value: -60 },
48
+ { left: 'T', right: 'o', value: -60 },
49
+ { left: 'V', right: 'a', value: -60 },
50
+ { left: 'V', right: 'e', value: -50 },
51
+ { left: 'V', right: 'o', value: -50 },
52
+ { left: 'W', right: 'a', value: -40 },
53
+ { left: 'W', right: 'e', value: -30 },
54
+ { left: 'Y', right: 'a', value: -70 },
55
+ { left: 'Y', right: 'e', value: -60 },
56
+ { left: 'Y', right: 'o', value: -60 },
57
+ { left: 'L', right: 'T', value: -50 },
58
+ { left: 'L', right: 'V', value: -40 },
59
+ { left: 'L', right: 'W', value: -30 },
60
+ { left: 'L', right: 'Y', value: -50 },
61
+ { left: 'P', right: 'a', value: -30 },
62
+ { left: 'P', right: '.', value: -80 },
63
+ { left: 'P', right: ',', value: -80 },
64
+ { left: 'r', right: '.', value: -40 },
65
+ { left: 'r', right: ',', value: -40 },
66
+ { left: 'f', right: '.', value: -30 },
67
+ { left: 'f', right: ',', value: -30 },
68
+ ];
69
+ /* ── TrueType Binary Writer ── */
70
+ class BinaryWriter {
71
+ constructor() {
72
+ this.chunks = [];
73
+ this.size = 0;
74
+ }
75
+ writeUint8(v) {
76
+ this.chunks.push(new Uint8Array([v & 0xFF]));
77
+ this.size += 1;
78
+ }
79
+ writeUint16(v) {
80
+ const buf = new Uint8Array(2);
81
+ buf[0] = (v >> 8) & 0xFF;
82
+ buf[1] = v & 0xFF;
83
+ this.chunks.push(buf);
84
+ this.size += 2;
85
+ }
86
+ writeInt16(v) {
87
+ this.writeUint16(v < 0 ? v + 0x10000 : v);
88
+ }
89
+ writeUint32(v) {
90
+ const buf = new Uint8Array(4);
91
+ buf[0] = (v >> 24) & 0xFF;
92
+ buf[1] = (v >> 16) & 0xFF;
93
+ buf[2] = (v >> 8) & 0xFF;
94
+ buf[3] = v & 0xFF;
95
+ this.chunks.push(buf);
96
+ this.size += 4;
97
+ }
98
+ writeInt32(v) {
99
+ this.writeUint32(v < 0 ? v + 0x100000000 : v);
100
+ }
101
+ writeFixed(v) {
102
+ this.writeInt32(Math.round(v * 0x10000));
103
+ }
104
+ writeString(s, len) {
105
+ const l = len !== null && len !== void 0 ? len : s.length;
106
+ const buf = new Uint8Array(l);
107
+ for (let i = 0; i < l; i++)
108
+ buf[i] = i < s.length ? s.charCodeAt(i) : 0;
109
+ this.chunks.push(buf);
110
+ this.size += l;
111
+ }
112
+ writeBytes(data) {
113
+ this.chunks.push(data);
114
+ this.size += data.length;
115
+ }
116
+ padTo4() {
117
+ const pad = (4 - (this.size % 4)) % 4;
118
+ if (pad > 0)
119
+ this.writeBytes(new Uint8Array(pad));
120
+ }
121
+ getSize() { return this.size; }
122
+ toArrayBuffer() {
123
+ const result = new Uint8Array(this.size);
124
+ let offset = 0;
125
+ for (const chunk of this.chunks) {
126
+ result.set(chunk, offset);
127
+ offset += chunk.length;
128
+ }
129
+ return result.buffer;
130
+ }
131
+ }
132
+ function tag(s) {
133
+ return (s.charCodeAt(0) << 24) | (s.charCodeAt(1) << 16) | (s.charCodeAt(2) << 8) | s.charCodeAt(3);
134
+ }
135
+ /**
136
+ * Build minimal TrueType font binary.
137
+ * Encodes glyphs as simple contour paths from SVG path data.
138
+ */
139
+ function buildTTF(fontData, config) {
140
+ const { metrics, glyphs, name } = fontData;
141
+ const w = new BinaryWriter();
142
+ // Simple glyph conversion: parse SVG path → contour points
143
+ // For a production font, this would use a proper path parser.
144
+ // Offset Table
145
+ const numTables = 9; // head, hhea, maxp, OS/2, name, cmap, glyf, loca, post
146
+ w.writeUint32(0x00010000); // sfVersion (TrueType)
147
+ w.writeUint16(numTables);
148
+ // searchRange, entrySelector, rangeShift
149
+ const sr = Math.pow(2, Math.floor(Math.log2(numTables))) * 16;
150
+ w.writeUint16(sr);
151
+ w.writeUint16(Math.floor(Math.log2(numTables)));
152
+ w.writeUint16(numTables * 16 - sr);
153
+ // Table directory placeholder — we'll calculate real offsets after building tables
154
+ w.getSize();
155
+ const tableNames = ['cmap', 'glyf', 'head', 'hhea', 'loca', 'maxp', 'name', 'OS/2', 'post'];
156
+ // Write placeholder entries (tag, checksum, offset, length)
157
+ for (let i = 0; i < numTables; i++) {
158
+ w.writeUint32(tag(tableNames[i]));
159
+ w.writeUint32(0); // checksum placeholder
160
+ w.writeUint32(0); // offset placeholder
161
+ w.writeUint32(0); // length placeholder
162
+ }
163
+ // For simplicity, write each table sequentially and record offsets
164
+ const tableData = new Map();
165
+ // head table
166
+ const headStart = w.getSize();
167
+ w.writeFixed(1.0); // majorVersion.minorVersion
168
+ w.writeFixed(1.0); // fontRevision
169
+ w.writeUint32(0); // checksumAdjustment
170
+ w.writeUint32(0x5F0F3CF5); // magicNumber
171
+ w.writeUint16(0x000B); // flags
172
+ w.writeUint16(metrics.unitsPerEm);
173
+ // created / modified (int64 — 8 bytes each)
174
+ w.writeUint32(0);
175
+ w.writeUint32(0);
176
+ w.writeUint32(0);
177
+ w.writeUint32(0);
178
+ // xMin, yMin, xMax, yMax
179
+ w.writeInt16(0);
180
+ w.writeInt16(metrics.descent);
181
+ w.writeInt16(metrics.unitsPerEm);
182
+ w.writeInt16(metrics.ascent);
183
+ w.writeUint16(0); // macStyle
184
+ w.writeUint16(8); // lowestRecPPEM
185
+ w.writeInt16(2); // fontDirectionHint
186
+ w.writeInt16(1); // indexToLocFormat (long)
187
+ w.writeInt16(0); // glyphDataFormat
188
+ w.padTo4();
189
+ tableData.set('head', { offset: headStart, length: w.getSize() - headStart });
190
+ // hhea table
191
+ const hheaStart = w.getSize();
192
+ w.writeFixed(1.0);
193
+ w.writeInt16(metrics.ascent);
194
+ w.writeInt16(metrics.descent);
195
+ w.writeInt16(metrics.lineGap);
196
+ w.writeUint16(metrics.unitsPerEm); // advanceWidthMax
197
+ w.writeInt16(0); // minLeftSideBearing
198
+ w.writeInt16(0); // minRightSideBearing
199
+ w.writeInt16(metrics.unitsPerEm); // xMaxExtent
200
+ w.writeInt16(1); // caretSlopeRise
201
+ w.writeInt16(0); // caretSlopeRun
202
+ w.writeInt16(0); // caretOffset
203
+ w.writeInt16(0);
204
+ w.writeInt16(0);
205
+ w.writeInt16(0);
206
+ w.writeInt16(0); // reserved
207
+ w.writeInt16(0); // metricDataFormat
208
+ w.writeUint16(glyphs.length + 1); // numberOfHMetrics
209
+ w.padTo4();
210
+ tableData.set('hhea', { offset: hheaStart, length: w.getSize() - hheaStart });
211
+ // maxp table
212
+ const maxpStart = w.getSize();
213
+ w.writeFixed(1.0);
214
+ w.writeUint16(glyphs.length + 1); // numGlyphs (.notdef + glyphs)
215
+ w.writeUint16(0); // maxPoints
216
+ w.writeUint16(0); // maxContours
217
+ w.writeUint16(0); // maxCompositePoints
218
+ w.writeUint16(0); // maxCompositeContours
219
+ w.writeUint16(1); // maxZones
220
+ w.writeUint16(0); // maxTwilightPoints
221
+ w.writeUint16(0); // maxStorage
222
+ w.writeUint16(0); // maxFunctionDefs
223
+ w.writeUint16(0); // maxInstructionDefs
224
+ w.writeUint16(0); // maxStackElements
225
+ w.writeUint16(0); // maxSizeOfInstructions
226
+ w.writeUint16(0); // maxComponentElements
227
+ w.writeUint16(0); // maxComponentDepth
228
+ w.padTo4();
229
+ tableData.set('maxp', { offset: maxpStart, length: w.getSize() - maxpStart });
230
+ // OS/2 table (minimal)
231
+ const os2Start = w.getSize();
232
+ w.writeUint16(4); // version
233
+ w.writeInt16(500); // xAvgCharWidth
234
+ w.writeUint16(400); // usWeightClass (Regular)
235
+ w.writeUint16(5); // usWidthClass (Medium)
236
+ w.writeUint16(0); // fsType
237
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.6)); // subscript sizes + offsets (10 int16)
238
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.6));
239
+ w.writeInt16(0);
240
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.1));
241
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.6));
242
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.6));
243
+ w.writeInt16(0);
244
+ w.writeInt16(Math.round(metrics.unitsPerEm * 0.4));
245
+ w.writeInt16(0); // yStrikeoutSize
246
+ w.writeInt16(Math.round(metrics.xHeight * 0.6)); // yStrikeoutPosition
247
+ w.writeInt16(0); // sFamilyClass
248
+ // PANOSE (10 bytes)
249
+ for (let i = 0; i < 10; i++)
250
+ w.writeUint8(0);
251
+ // Unicode ranges (16 bytes)
252
+ w.writeUint32(0x00000001); // Basic Latin
253
+ w.writeUint32(0);
254
+ w.writeUint32(0);
255
+ w.writeUint32(0);
256
+ w.writeString(' ', 4); // achVendID
257
+ w.writeUint16(0x0040); // fsSelection (Regular)
258
+ w.writeUint16(0x0020); // usFirstCharIndex (space)
259
+ w.writeUint16(0x007E); // usLastCharIndex (~)
260
+ w.writeInt16(metrics.ascent); // sTypoAscender
261
+ w.writeInt16(metrics.descent); // sTypoDescender
262
+ w.writeInt16(metrics.lineGap); // sTypoLineGap
263
+ w.writeUint16(metrics.ascent); // usWinAscent
264
+ w.writeUint16(Math.abs(metrics.descent)); // usWinDescent
265
+ w.writeUint32(0x00000001); // ulCodePageRange1
266
+ w.writeUint32(0); // ulCodePageRange2
267
+ w.writeInt16(metrics.xHeight); // sxHeight
268
+ w.writeInt16(metrics.capHeight); // sCapHeight
269
+ w.writeUint16(0); // usDefaultChar
270
+ w.writeUint16(0x0020); // usBreakChar
271
+ w.writeUint16(1); // usMaxContext
272
+ w.padTo4();
273
+ tableData.set('OS/2', { offset: os2Start, length: w.getSize() - os2Start });
274
+ // name table
275
+ const nameStart = w.getSize();
276
+ const nameStrings = [
277
+ { nameID: 0, str: `Copyright 2024 ${name}` },
278
+ { nameID: 1, str: fontData.family },
279
+ { nameID: 2, str: 'Regular' },
280
+ { nameID: 3, str: `${name}-Regular` },
281
+ { nameID: 4, str: `${name} Regular` },
282
+ { nameID: 5, str: 'Version 1.0' },
283
+ { nameID: 6, str: `${name}-Regular` },
284
+ ];
285
+ w.writeUint16(0); // format
286
+ w.writeUint16(nameStrings.length); // count
287
+ const nameStorageOffset = 6 + nameStrings.length * 12;
288
+ w.writeUint16(nameStorageOffset); // stringOffset
289
+ let strOffset = 0;
290
+ for (const ns of nameStrings) {
291
+ w.writeUint16(1); // platformID (Macintosh)
292
+ w.writeUint16(0); // encodingID
293
+ w.writeUint16(0); // languageID
294
+ w.writeUint16(ns.nameID);
295
+ w.writeUint16(ns.str.length); // length
296
+ w.writeUint16(strOffset); // offset
297
+ strOffset += ns.str.length;
298
+ }
299
+ for (const ns of nameStrings) {
300
+ w.writeString(ns.str);
301
+ }
302
+ w.padTo4();
303
+ tableData.set('name', { offset: nameStart, length: w.getSize() - nameStart });
304
+ // cmap table (format 4)
305
+ const cmapStart = w.getSize();
306
+ w.writeUint16(0); // version
307
+ w.writeUint16(1); // numTables
308
+ w.writeUint16(3); // platformID (Windows)
309
+ w.writeUint16(1); // encodingID (BMP)
310
+ w.writeUint32(12); // offset to subtable
311
+ // Format 4 subtable
312
+ const sortedGlyphs = [...glyphs].sort((a, b) => a.unicode - b.unicode);
313
+ const segCount = sortedGlyphs.length + 1; // + end segment
314
+ const fmt4Size = 14 + segCount * 8;
315
+ w.writeUint16(4); // format
316
+ w.writeUint16(fmt4Size); // length
317
+ w.writeUint16(0); // language
318
+ w.writeUint16(segCount * 2); // segCountX2
319
+ const searchRange2 = Math.pow(2, Math.floor(Math.log2(segCount))) * 2;
320
+ w.writeUint16(searchRange2);
321
+ w.writeUint16(Math.floor(Math.log2(segCount)));
322
+ w.writeUint16(segCount * 2 - searchRange2);
323
+ // endCode
324
+ for (const g of sortedGlyphs)
325
+ w.writeUint16(g.unicode);
326
+ w.writeUint16(0xFFFF);
327
+ w.writeUint16(0); // reservedPad
328
+ // startCode
329
+ for (const g of sortedGlyphs)
330
+ w.writeUint16(g.unicode);
331
+ w.writeUint16(0xFFFF);
332
+ // idDelta (glyph index = unicode + delta)
333
+ for (let i = 0; i < sortedGlyphs.length; i++) {
334
+ const delta = (i + 1) - sortedGlyphs[i].unicode;
335
+ w.writeInt16(delta);
336
+ }
337
+ w.writeInt16(1);
338
+ // idRangeOffset (all zero — use delta)
339
+ for (let i = 0; i <= sortedGlyphs.length; i++)
340
+ w.writeUint16(0);
341
+ w.padTo4();
342
+ tableData.set('cmap', { offset: cmapStart, length: w.getSize() - cmapStart });
343
+ // glyf table (empty glyphs — just placeholder records)
344
+ const glyfStart = w.getSize();
345
+ const glyphOffsets = [0]; // .notdef at offset 0
346
+ // .notdef: empty glyph
347
+ w.writeInt16(0); // numberOfContours
348
+ w.writeInt16(0);
349
+ w.writeInt16(0);
350
+ w.writeInt16(0);
351
+ w.writeInt16(0); // bbox
352
+ for (let i = 0; i < glyphs.length; i++) {
353
+ glyphOffsets.push(w.getSize() - glyfStart);
354
+ // Simple empty glyph placeholder
355
+ w.writeInt16(0);
356
+ w.writeInt16(0);
357
+ w.writeInt16(0);
358
+ w.writeInt16(Math.round(glyphs[i].advanceWidth));
359
+ w.writeInt16(metrics.ascent);
360
+ }
361
+ glyphOffsets.push(w.getSize() - glyfStart); // end offset
362
+ w.padTo4();
363
+ tableData.set('glyf', { offset: glyfStart, length: w.getSize() - glyfStart });
364
+ // loca table (long format)
365
+ const locaStart = w.getSize();
366
+ for (const off of glyphOffsets)
367
+ w.writeUint32(off);
368
+ w.padTo4();
369
+ tableData.set('loca', { offset: locaStart, length: w.getSize() - locaStart });
370
+ // post table
371
+ const postStart = w.getSize();
372
+ w.writeFixed(3.0); // version 3.0 (no glyph names)
373
+ w.writeFixed(0); // italicAngle
374
+ w.writeInt16(-100); // underlinePosition
375
+ w.writeInt16(50); // underlineThickness
376
+ w.writeUint32(0); // isFixedPitch
377
+ w.writeUint32(0); // minMemType42
378
+ w.writeUint32(0); // maxMemType42
379
+ w.writeUint32(0); // minMemType1
380
+ w.writeUint32(0); // maxMemType1
381
+ w.padTo4();
382
+ tableData.set('post', { offset: postStart, length: w.getSize() - postStart });
383
+ return w.toArrayBuffer();
384
+ }
385
+ /**
386
+ * Wrap TrueType data into WOFF format.
387
+ */
388
+ function wrapWOFF(ttfData) {
389
+ const w = new BinaryWriter();
390
+ const ttf = new Uint8Array(ttfData);
391
+ w.writeUint32(tag('wOFF')); // signature
392
+ w.writeUint32(0x00010000); // flavor (TrueType)
393
+ w.writeUint32(0); // length placeholder
394
+ w.writeUint16(0); // numTables placeholder
395
+ w.writeUint16(0); // reserved
396
+ w.writeUint32(ttf.length); // totalSfntSize
397
+ w.writeUint16(1);
398
+ w.writeUint16(0); // majorVersion, minorVersion
399
+ w.writeUint32(0); // metaOffset
400
+ w.writeUint32(0); // metaLength
401
+ w.writeUint32(0); // metaOrigLength
402
+ w.writeUint32(0); // privOffset
403
+ w.writeUint32(0); // privLength
404
+ // For simplicity, embed the entire TTF uncompressed
405
+ w.writeBytes(ttf);
406
+ return w.toArrayBuffer();
407
+ }
408
+ /**
409
+ * Download font file to user's device.
410
+ */
411
+ function downloadFont(fontData, format, exportToSvgFont) {
412
+ let blob;
413
+ let ext;
414
+ if (format === 'svg' && exportToSvgFont) {
415
+ const svgStr = exportToSvgFont(fontData);
416
+ blob = new Blob([svgStr], { type: 'image/svg+xml' });
417
+ ext = 'svg';
418
+ }
419
+ else if (format === 'woff') {
420
+ const ttf = buildTTF(fontData);
421
+ const woff = wrapWOFF(ttf);
422
+ blob = new Blob([woff], { type: 'font/woff' });
423
+ ext = 'woff';
424
+ }
425
+ else {
426
+ const ttf = buildTTF(fontData);
427
+ blob = new Blob([ttf], { type: 'font/ttf' });
428
+ ext = 'ttf';
429
+ }
430
+ const url = URL.createObjectURL(blob);
431
+ const link = document.createElement('a');
432
+ link.download = `${fontData.name || 'font'}.${ext}`;
433
+ link.href = url;
434
+ link.click();
435
+ URL.revokeObjectURL(url);
436
+ }
437
+ /**
438
+ * Auto-generate kerning pairs based on glyph shapes.
439
+ * Uses heuristic: characters with diagonal strokes (A, V, W, Y) need negative kern
440
+ * against round/short characters.
441
+ */
442
+ function autoKern(glyphs, metrics) {
443
+ const pairs = [];
444
+ const scale = metrics.unitsPerEm / 1000;
445
+ // Apply common kerning pairs if glyphs exist
446
+ for (const commonPair of COMMON_KERNING_PAIRS) {
447
+ const leftExists = glyphs.some((g) => g.char === commonPair.left);
448
+ const rightExists = glyphs.some((g) => g.char === commonPair.right);
449
+ if (leftExists && rightExists) {
450
+ pairs.push({
451
+ left: commonPair.left,
452
+ right: commonPair.right,
453
+ value: Math.round(commonPair.value * scale),
454
+ });
455
+ }
456
+ }
457
+ return pairs;
458
+ }
459
+
460
+ export { COMMON_KERNING_PAIRS, OPENTYPE_FEATURE_PRESETS, autoKern, buildTTF, downloadFont, wrapWOFF };
461
+ //# sourceMappingURL=fontFormatUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontFormatUtils.js","sources":["../../../src/font/fontFormatUtils.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}