@shotstack/shotstack-canvas 1.4.6 → 1.5.0
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/chunk-HYGMWVDX.js +19 -0
- package/dist/entry.node.cjs +154 -30
- package/dist/entry.node.d.cts +31 -0
- package/dist/entry.node.d.ts +31 -0
- package/dist/entry.node.js +154 -30
- package/dist/entry.web.d.ts +31 -0
- package/dist/entry.web.js +161 -33
- package/dist/hb-KXF2MJ2J.js +550 -0
- package/dist/hbjs-ZTRARROF.js +499 -0
- package/package.json +62 -62
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__commonJS
|
|
3
|
+
} from "./chunk-HYGMWVDX.js";
|
|
4
|
+
|
|
5
|
+
// node_modules/harfbuzzjs/hbjs.js
|
|
6
|
+
var require_hbjs = __commonJS({
|
|
7
|
+
"node_modules/harfbuzzjs/hbjs.js"(exports, module) {
|
|
8
|
+
function hbjs(Module) {
|
|
9
|
+
"use strict";
|
|
10
|
+
var exports2 = Module.wasmExports;
|
|
11
|
+
var utf8Decoder = new TextDecoder("utf8");
|
|
12
|
+
let addFunction = Module.addFunction;
|
|
13
|
+
let removeFunction = Module.removeFunction;
|
|
14
|
+
var freeFuncPtr = addFunction(function(ptr) {
|
|
15
|
+
exports2.free(ptr);
|
|
16
|
+
}, "vi");
|
|
17
|
+
var HB_MEMORY_MODE_WRITABLE = 2;
|
|
18
|
+
var HB_SET_VALUE_INVALID = -1;
|
|
19
|
+
var HB_BUFFER_CONTENT_TYPE_GLYPHS = 2;
|
|
20
|
+
var DONT_STOP = 0;
|
|
21
|
+
var GSUB_PHASE = 1;
|
|
22
|
+
var GPOS_PHASE = 2;
|
|
23
|
+
function hb_tag(s) {
|
|
24
|
+
return (s.charCodeAt(0) & 255) << 24 | (s.charCodeAt(1) & 255) << 16 | (s.charCodeAt(2) & 255) << 8 | (s.charCodeAt(3) & 255) << 0;
|
|
25
|
+
}
|
|
26
|
+
var HB_BUFFER_SERIALIZE_FORMAT_JSON = hb_tag("JSON");
|
|
27
|
+
var HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 4;
|
|
28
|
+
function _hb_untag(tag) {
|
|
29
|
+
return [
|
|
30
|
+
String.fromCharCode(tag >> 24 & 255),
|
|
31
|
+
String.fromCharCode(tag >> 16 & 255),
|
|
32
|
+
String.fromCharCode(tag >> 8 & 255),
|
|
33
|
+
String.fromCharCode(tag >> 0 & 255)
|
|
34
|
+
].join("");
|
|
35
|
+
}
|
|
36
|
+
function _buffer_flag(s) {
|
|
37
|
+
if (s == "BOT") {
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
if (s == "EOT") {
|
|
41
|
+
return 2;
|
|
42
|
+
}
|
|
43
|
+
if (s == "PRESERVE_DEFAULT_IGNORABLES") {
|
|
44
|
+
return 4;
|
|
45
|
+
}
|
|
46
|
+
if (s == "REMOVE_DEFAULT_IGNORABLES") {
|
|
47
|
+
return 8;
|
|
48
|
+
}
|
|
49
|
+
if (s == "DO_NOT_INSERT_DOTTED_CIRCLE") {
|
|
50
|
+
return 16;
|
|
51
|
+
}
|
|
52
|
+
if (s == "PRODUCE_UNSAFE_TO_CONCAT") {
|
|
53
|
+
return 64;
|
|
54
|
+
}
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
function createBlob(blob) {
|
|
58
|
+
var blobPtr = exports2.malloc(blob.byteLength);
|
|
59
|
+
Module.HEAPU8.set(new Uint8Array(blob), blobPtr);
|
|
60
|
+
var ptr = exports2.hb_blob_create(blobPtr, blob.byteLength, HB_MEMORY_MODE_WRITABLE, blobPtr, freeFuncPtr);
|
|
61
|
+
return {
|
|
62
|
+
ptr,
|
|
63
|
+
/**
|
|
64
|
+
* Free the object.
|
|
65
|
+
*/
|
|
66
|
+
destroy: function() {
|
|
67
|
+
exports2.hb_blob_destroy(ptr);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function typedArrayFromSet(setPtr) {
|
|
72
|
+
const setCount = exports2.hb_set_get_population(setPtr);
|
|
73
|
+
const arrayPtr = exports2.malloc(setCount << 2);
|
|
74
|
+
const arrayOffset = arrayPtr >> 2;
|
|
75
|
+
const array = Module.HEAPU32.subarray(arrayOffset, arrayOffset + setCount);
|
|
76
|
+
Module.HEAPU32.set(array, arrayOffset);
|
|
77
|
+
exports2.hb_set_next_many(setPtr, HB_SET_VALUE_INVALID, arrayPtr, setCount);
|
|
78
|
+
return array;
|
|
79
|
+
}
|
|
80
|
+
function createFace(blob, index) {
|
|
81
|
+
var ptr = exports2.hb_face_create(blob.ptr, index);
|
|
82
|
+
const upem = exports2.hb_face_get_upem(ptr);
|
|
83
|
+
return {
|
|
84
|
+
ptr,
|
|
85
|
+
upem,
|
|
86
|
+
/**
|
|
87
|
+
* Return the binary contents of an OpenType table.
|
|
88
|
+
* @param {string} table Table name
|
|
89
|
+
*/
|
|
90
|
+
reference_table: function(table) {
|
|
91
|
+
var blob2 = exports2.hb_face_reference_table(ptr, hb_tag(table));
|
|
92
|
+
var length = exports2.hb_blob_get_length(blob2);
|
|
93
|
+
if (!length) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
var blobptr = exports2.hb_blob_get_data(blob2, null);
|
|
97
|
+
var table_string = Module.HEAPU8.subarray(blobptr, blobptr + length);
|
|
98
|
+
return table_string;
|
|
99
|
+
},
|
|
100
|
+
/**
|
|
101
|
+
* Return variation axis infos
|
|
102
|
+
*/
|
|
103
|
+
getAxisInfos: function() {
|
|
104
|
+
var axis = exports2.malloc(64 * 32);
|
|
105
|
+
var c = exports2.malloc(4);
|
|
106
|
+
Module.HEAPU32[c / 4] = 64;
|
|
107
|
+
exports2.hb_ot_var_get_axis_infos(ptr, 0, c, axis);
|
|
108
|
+
var result = {};
|
|
109
|
+
Array.from({ length: Module.HEAPU32[c / 4] }).forEach(function(_, i) {
|
|
110
|
+
result[_hb_untag(Module.HEAPU32[axis / 4 + i * 8 + 1])] = {
|
|
111
|
+
min: Module.HEAPF32[axis / 4 + i * 8 + 4],
|
|
112
|
+
default: Module.HEAPF32[axis / 4 + i * 8 + 5],
|
|
113
|
+
max: Module.HEAPF32[axis / 4 + i * 8 + 6]
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
exports2.free(c);
|
|
117
|
+
exports2.free(axis);
|
|
118
|
+
return result;
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* Return unicodes the face supports
|
|
122
|
+
*/
|
|
123
|
+
collectUnicodes: function() {
|
|
124
|
+
var unicodeSetPtr = exports2.hb_set_create();
|
|
125
|
+
exports2.hb_face_collect_unicodes(ptr, unicodeSetPtr);
|
|
126
|
+
var result = typedArrayFromSet(unicodeSetPtr);
|
|
127
|
+
exports2.hb_set_destroy(unicodeSetPtr);
|
|
128
|
+
return result;
|
|
129
|
+
},
|
|
130
|
+
/**
|
|
131
|
+
* Free the object.
|
|
132
|
+
*/
|
|
133
|
+
destroy: function() {
|
|
134
|
+
exports2.hb_face_destroy(ptr);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
var pathBuffer = "";
|
|
139
|
+
var nameBufferSize = 256;
|
|
140
|
+
var nameBuffer = exports2.malloc(nameBufferSize);
|
|
141
|
+
function createFont(face) {
|
|
142
|
+
var ptr = exports2.hb_font_create(face.ptr);
|
|
143
|
+
var drawFuncsPtr = null;
|
|
144
|
+
var moveToPtr = null;
|
|
145
|
+
var lineToPtr = null;
|
|
146
|
+
var cubicToPtr = null;
|
|
147
|
+
var quadToPtr = null;
|
|
148
|
+
var closePathPtr = null;
|
|
149
|
+
function glyphToPath(glyphId) {
|
|
150
|
+
if (!drawFuncsPtr) {
|
|
151
|
+
var moveTo = function(dfuncs, draw_data, draw_state, to_x, to_y, user_data) {
|
|
152
|
+
pathBuffer += `M${to_x},${to_y}`;
|
|
153
|
+
};
|
|
154
|
+
var lineTo = function(dfuncs, draw_data, draw_state, to_x, to_y, user_data) {
|
|
155
|
+
pathBuffer += `L${to_x},${to_y}`;
|
|
156
|
+
};
|
|
157
|
+
var cubicTo = function(dfuncs, draw_data, draw_state, c1_x, c1_y, c2_x, c2_y, to_x, to_y, user_data) {
|
|
158
|
+
pathBuffer += `C${c1_x},${c1_y} ${c2_x},${c2_y} ${to_x},${to_y}`;
|
|
159
|
+
};
|
|
160
|
+
var quadTo = function(dfuncs, draw_data, draw_state, c_x, c_y, to_x, to_y, user_data) {
|
|
161
|
+
pathBuffer += `Q${c_x},${c_y} ${to_x},${to_y}`;
|
|
162
|
+
};
|
|
163
|
+
var closePath = function(dfuncs, draw_data, draw_state, user_data) {
|
|
164
|
+
pathBuffer += "Z";
|
|
165
|
+
};
|
|
166
|
+
moveToPtr = addFunction(moveTo, "viiiffi");
|
|
167
|
+
lineToPtr = addFunction(lineTo, "viiiffi");
|
|
168
|
+
cubicToPtr = addFunction(cubicTo, "viiiffffffi");
|
|
169
|
+
quadToPtr = addFunction(quadTo, "viiiffffi");
|
|
170
|
+
closePathPtr = addFunction(closePath, "viiii");
|
|
171
|
+
drawFuncsPtr = exports2.hb_draw_funcs_create();
|
|
172
|
+
exports2.hb_draw_funcs_set_move_to_func(drawFuncsPtr, moveToPtr, 0, 0);
|
|
173
|
+
exports2.hb_draw_funcs_set_line_to_func(drawFuncsPtr, lineToPtr, 0, 0);
|
|
174
|
+
exports2.hb_draw_funcs_set_cubic_to_func(drawFuncsPtr, cubicToPtr, 0, 0);
|
|
175
|
+
exports2.hb_draw_funcs_set_quadratic_to_func(drawFuncsPtr, quadToPtr, 0, 0);
|
|
176
|
+
exports2.hb_draw_funcs_set_close_path_func(drawFuncsPtr, closePathPtr, 0, 0);
|
|
177
|
+
}
|
|
178
|
+
pathBuffer = "";
|
|
179
|
+
exports2.hb_font_draw_glyph(ptr, glyphId, drawFuncsPtr, 0);
|
|
180
|
+
return pathBuffer;
|
|
181
|
+
}
|
|
182
|
+
function glyphName(glyphId) {
|
|
183
|
+
exports2.hb_font_glyph_to_string(
|
|
184
|
+
ptr,
|
|
185
|
+
glyphId,
|
|
186
|
+
nameBuffer,
|
|
187
|
+
nameBufferSize
|
|
188
|
+
);
|
|
189
|
+
var array = Module.HEAPU8.subarray(nameBuffer, nameBuffer + nameBufferSize);
|
|
190
|
+
return utf8Decoder.decode(array.slice(0, array.indexOf(0)));
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
ptr,
|
|
194
|
+
glyphName,
|
|
195
|
+
glyphToPath,
|
|
196
|
+
/**
|
|
197
|
+
* Return a glyph as a JSON path string
|
|
198
|
+
* based on format described on https://svgwg.org/specs/paths/#InterfaceSVGPathSegment
|
|
199
|
+
* @param {number} glyphId ID of the requested glyph in the font.
|
|
200
|
+
**/
|
|
201
|
+
glyphToJson: function(glyphId) {
|
|
202
|
+
var path = glyphToPath(glyphId);
|
|
203
|
+
return path.replace(/([MLQCZ])/g, "|$1 ").split("|").filter(function(x) {
|
|
204
|
+
return x.length;
|
|
205
|
+
}).map(function(x) {
|
|
206
|
+
var row = x.split(/[ ,]/g);
|
|
207
|
+
return { type: row[0], values: row.slice(1).filter(function(x2) {
|
|
208
|
+
return x2.length;
|
|
209
|
+
}).map(function(x2) {
|
|
210
|
+
return +x2;
|
|
211
|
+
}) };
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
/**
|
|
215
|
+
* Set the font's scale factor, affecting the position values returned from
|
|
216
|
+
* shaping.
|
|
217
|
+
* @param {number} xScale Units to scale in the X dimension.
|
|
218
|
+
* @param {number} yScale Units to scale in the Y dimension.
|
|
219
|
+
**/
|
|
220
|
+
setScale: function(xScale, yScale) {
|
|
221
|
+
exports2.hb_font_set_scale(ptr, xScale, yScale);
|
|
222
|
+
},
|
|
223
|
+
/**
|
|
224
|
+
* Set the font's variations.
|
|
225
|
+
* @param {object} variations Dictionary of variations to set
|
|
226
|
+
**/
|
|
227
|
+
setVariations: function(variations) {
|
|
228
|
+
var entries = Object.entries(variations);
|
|
229
|
+
var vars = exports2.malloc(8 * entries.length);
|
|
230
|
+
entries.forEach(function(entry, i) {
|
|
231
|
+
Module.HEAPU32[vars / 4 + i * 2 + 0] = hb_tag(entry[0]);
|
|
232
|
+
Module.HEAPF32[vars / 4 + i * 2 + 1] = entry[1];
|
|
233
|
+
});
|
|
234
|
+
exports2.hb_font_set_variations(ptr, vars, entries.length);
|
|
235
|
+
exports2.free(vars);
|
|
236
|
+
},
|
|
237
|
+
/**
|
|
238
|
+
* Free the object.
|
|
239
|
+
*/
|
|
240
|
+
destroy: function() {
|
|
241
|
+
exports2.hb_font_destroy(ptr);
|
|
242
|
+
if (drawFuncsPtr) {
|
|
243
|
+
exports2.hb_draw_funcs_destroy(drawFuncsPtr);
|
|
244
|
+
drawFuncsPtr = null;
|
|
245
|
+
removeFunction(moveToPtr);
|
|
246
|
+
removeFunction(lineToPtr);
|
|
247
|
+
removeFunction(cubicToPtr);
|
|
248
|
+
removeFunction(quadToPtr);
|
|
249
|
+
removeFunction(closePathPtr);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function createAsciiString(text) {
|
|
255
|
+
var ptr = exports2.malloc(text.length + 1);
|
|
256
|
+
for (let i = 0; i < text.length; ++i) {
|
|
257
|
+
const char = text.charCodeAt(i);
|
|
258
|
+
if (char > 127) throw new Error("Expected ASCII text");
|
|
259
|
+
Module.HEAPU8[ptr + i] = char;
|
|
260
|
+
}
|
|
261
|
+
Module.HEAPU8[ptr + text.length] = 0;
|
|
262
|
+
return {
|
|
263
|
+
ptr,
|
|
264
|
+
length: text.length,
|
|
265
|
+
free: function() {
|
|
266
|
+
exports2.free(ptr);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function createJsString(text) {
|
|
271
|
+
const ptr = exports2.malloc(text.length * 2);
|
|
272
|
+
const words = new Uint16Array(Module.wasmMemory.buffer, ptr, text.length);
|
|
273
|
+
for (let i = 0; i < words.length; ++i) words[i] = text.charCodeAt(i);
|
|
274
|
+
return {
|
|
275
|
+
ptr,
|
|
276
|
+
length: words.length,
|
|
277
|
+
free: function() {
|
|
278
|
+
exports2.free(ptr);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function createBuffer() {
|
|
283
|
+
var ptr = exports2.hb_buffer_create();
|
|
284
|
+
return {
|
|
285
|
+
ptr,
|
|
286
|
+
/**
|
|
287
|
+
* Add text to the buffer.
|
|
288
|
+
* @param {string} text Text to be added to the buffer.
|
|
289
|
+
**/
|
|
290
|
+
addText: function(text) {
|
|
291
|
+
const str = createJsString(text);
|
|
292
|
+
exports2.hb_buffer_add_utf16(ptr, str.ptr, str.length, 0, str.length);
|
|
293
|
+
str.free();
|
|
294
|
+
},
|
|
295
|
+
/**
|
|
296
|
+
* Set buffer script, language and direction.
|
|
297
|
+
*
|
|
298
|
+
* This needs to be done before shaping.
|
|
299
|
+
**/
|
|
300
|
+
guessSegmentProperties: function() {
|
|
301
|
+
return exports2.hb_buffer_guess_segment_properties(ptr);
|
|
302
|
+
},
|
|
303
|
+
/**
|
|
304
|
+
* Set buffer direction explicitly.
|
|
305
|
+
* @param {string} direction: One of "ltr", "rtl", "ttb" or "btt"
|
|
306
|
+
*/
|
|
307
|
+
setDirection: function(dir) {
|
|
308
|
+
exports2.hb_buffer_set_direction(ptr, {
|
|
309
|
+
ltr: 4,
|
|
310
|
+
rtl: 5,
|
|
311
|
+
ttb: 6,
|
|
312
|
+
btt: 7
|
|
313
|
+
}[dir] || 0);
|
|
314
|
+
},
|
|
315
|
+
/**
|
|
316
|
+
* Set buffer flags explicitly.
|
|
317
|
+
* @param {string[]} flags: A list of strings which may be either:
|
|
318
|
+
* "BOT"
|
|
319
|
+
* "EOT"
|
|
320
|
+
* "PRESERVE_DEFAULT_IGNORABLES"
|
|
321
|
+
* "REMOVE_DEFAULT_IGNORABLES"
|
|
322
|
+
* "DO_NOT_INSERT_DOTTED_CIRCLE"
|
|
323
|
+
* "PRODUCE_UNSAFE_TO_CONCAT"
|
|
324
|
+
*/
|
|
325
|
+
setFlags: function(flags) {
|
|
326
|
+
var flagValue = 0;
|
|
327
|
+
flags.forEach(function(s) {
|
|
328
|
+
flagValue |= _buffer_flag(s);
|
|
329
|
+
});
|
|
330
|
+
exports2.hb_buffer_set_flags(ptr, flagValue);
|
|
331
|
+
},
|
|
332
|
+
/**
|
|
333
|
+
* Set buffer language explicitly.
|
|
334
|
+
* @param {string} language: The buffer language
|
|
335
|
+
*/
|
|
336
|
+
setLanguage: function(language) {
|
|
337
|
+
var str = createAsciiString(language);
|
|
338
|
+
exports2.hb_buffer_set_language(ptr, exports2.hb_language_from_string(str.ptr, -1));
|
|
339
|
+
str.free();
|
|
340
|
+
},
|
|
341
|
+
/**
|
|
342
|
+
* Set buffer script explicitly.
|
|
343
|
+
* @param {string} script: The buffer script
|
|
344
|
+
*/
|
|
345
|
+
setScript: function(script) {
|
|
346
|
+
var str = createAsciiString(script);
|
|
347
|
+
exports2.hb_buffer_set_script(ptr, exports2.hb_script_from_string(str.ptr, -1));
|
|
348
|
+
str.free();
|
|
349
|
+
},
|
|
350
|
+
/**
|
|
351
|
+
* Set the Harfbuzz clustering level.
|
|
352
|
+
*
|
|
353
|
+
* Affects the cluster values returned from shaping.
|
|
354
|
+
* @param {number} level: Clustering level. See the Harfbuzz manual chapter
|
|
355
|
+
* on Clusters.
|
|
356
|
+
**/
|
|
357
|
+
setClusterLevel: function(level) {
|
|
358
|
+
exports2.hb_buffer_set_cluster_level(ptr, level);
|
|
359
|
+
},
|
|
360
|
+
/**
|
|
361
|
+
* Return the buffer contents as a JSON object.
|
|
362
|
+
*
|
|
363
|
+
* After shaping, this function will return an array of glyph information
|
|
364
|
+
* objects. Each object will have the following attributes:
|
|
365
|
+
*
|
|
366
|
+
* - g: The glyph ID
|
|
367
|
+
* - cl: The cluster ID
|
|
368
|
+
* - ax: Advance width (width to advance after this glyph is painted)
|
|
369
|
+
* - ay: Advance height (height to advance after this glyph is painted)
|
|
370
|
+
* - dx: X displacement (adjustment in X dimension when painting this glyph)
|
|
371
|
+
* - dy: Y displacement (adjustment in Y dimension when painting this glyph)
|
|
372
|
+
* - flags: Glyph flags like `HB_GLYPH_FLAG_UNSAFE_TO_BREAK` (0x1)
|
|
373
|
+
**/
|
|
374
|
+
json: function() {
|
|
375
|
+
var length = exports2.hb_buffer_get_length(ptr);
|
|
376
|
+
var result = [];
|
|
377
|
+
var infosPtr = exports2.hb_buffer_get_glyph_infos(ptr, 0);
|
|
378
|
+
var infosPtr32 = infosPtr / 4;
|
|
379
|
+
var positionsPtr32 = exports2.hb_buffer_get_glyph_positions(ptr, 0) / 4;
|
|
380
|
+
var infos = Module.HEAPU32.subarray(infosPtr32, infosPtr32 + 5 * length);
|
|
381
|
+
var positions = Module.HEAP32.subarray(positionsPtr32, positionsPtr32 + 5 * length);
|
|
382
|
+
for (var i = 0; i < length; ++i) {
|
|
383
|
+
result.push({
|
|
384
|
+
g: infos[i * 5 + 0],
|
|
385
|
+
cl: infos[i * 5 + 2],
|
|
386
|
+
ax: positions[i * 5 + 0],
|
|
387
|
+
ay: positions[i * 5 + 1],
|
|
388
|
+
dx: positions[i * 5 + 2],
|
|
389
|
+
dy: positions[i * 5 + 3],
|
|
390
|
+
flags: exports2.hb_glyph_info_get_glyph_flags(infosPtr + i * 20)
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
return result;
|
|
394
|
+
},
|
|
395
|
+
/**
|
|
396
|
+
* Free the object.
|
|
397
|
+
*/
|
|
398
|
+
destroy: function() {
|
|
399
|
+
exports2.hb_buffer_destroy(ptr);
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function shape(font, buffer, features) {
|
|
404
|
+
var featuresPtr = 0;
|
|
405
|
+
var featuresLen = 0;
|
|
406
|
+
if (features) {
|
|
407
|
+
features = features.split(",");
|
|
408
|
+
featuresPtr = exports2.malloc(16 * features.length);
|
|
409
|
+
features.forEach(function(feature, i) {
|
|
410
|
+
var str = createAsciiString(feature);
|
|
411
|
+
if (exports2.hb_feature_from_string(str.ptr, -1, featuresPtr + featuresLen * 16))
|
|
412
|
+
featuresLen++;
|
|
413
|
+
str.free();
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
exports2.hb_shape(font.ptr, buffer.ptr, featuresPtr, featuresLen);
|
|
417
|
+
if (featuresPtr)
|
|
418
|
+
exports2.free(featuresPtr);
|
|
419
|
+
}
|
|
420
|
+
function shapeWithTrace(font, buffer, features, stop_at, stop_phase) {
|
|
421
|
+
var trace = [];
|
|
422
|
+
var currentPhase = DONT_STOP;
|
|
423
|
+
var stopping = false;
|
|
424
|
+
var failure = false;
|
|
425
|
+
var traceBufLen = 1024 * 1024;
|
|
426
|
+
var traceBufPtr = exports2.malloc(traceBufLen);
|
|
427
|
+
var traceFunc = function(bufferPtr, fontPtr, messagePtr, user_data) {
|
|
428
|
+
var message = utf8Decoder.decode(Module.HEAPU8.subarray(messagePtr, Module.HEAPU8.indexOf(0, messagePtr)));
|
|
429
|
+
if (message.startsWith("start table GSUB"))
|
|
430
|
+
currentPhase = GSUB_PHASE;
|
|
431
|
+
else if (message.startsWith("start table GPOS"))
|
|
432
|
+
currentPhase = GPOS_PHASE;
|
|
433
|
+
if (currentPhase != stop_phase)
|
|
434
|
+
stopping = false;
|
|
435
|
+
if (failure)
|
|
436
|
+
return 1;
|
|
437
|
+
if (stop_phase != DONT_STOP && currentPhase == stop_phase && message.startsWith("end lookup " + stop_at))
|
|
438
|
+
stopping = true;
|
|
439
|
+
if (stopping)
|
|
440
|
+
return 0;
|
|
441
|
+
exports2.hb_buffer_serialize_glyphs(
|
|
442
|
+
bufferPtr,
|
|
443
|
+
0,
|
|
444
|
+
exports2.hb_buffer_get_length(bufferPtr),
|
|
445
|
+
traceBufPtr,
|
|
446
|
+
traceBufLen,
|
|
447
|
+
0,
|
|
448
|
+
fontPtr,
|
|
449
|
+
HB_BUFFER_SERIALIZE_FORMAT_JSON,
|
|
450
|
+
HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES
|
|
451
|
+
);
|
|
452
|
+
trace.push({
|
|
453
|
+
m: message,
|
|
454
|
+
t: JSON.parse(utf8Decoder.decode(Module.HEAPU8.subarray(traceBufPtr, Module.HEAPU8.indexOf(0, traceBufPtr)))),
|
|
455
|
+
glyphs: exports2.hb_buffer_get_content_type(bufferPtr) == HB_BUFFER_CONTENT_TYPE_GLYPHS
|
|
456
|
+
});
|
|
457
|
+
return 1;
|
|
458
|
+
};
|
|
459
|
+
var traceFuncPtr = addFunction(traceFunc, "iiiii");
|
|
460
|
+
exports2.hb_buffer_set_message_func(buffer.ptr, traceFuncPtr, 0, 0);
|
|
461
|
+
shape(font, buffer, features, 0);
|
|
462
|
+
exports2.free(traceBufPtr);
|
|
463
|
+
removeFunction(traceFuncPtr);
|
|
464
|
+
return trace;
|
|
465
|
+
}
|
|
466
|
+
function version() {
|
|
467
|
+
var versionPtr = exports2.malloc(12);
|
|
468
|
+
exports2.hb_version(versionPtr, versionPtr + 4, versionPtr + 8);
|
|
469
|
+
var version2 = {
|
|
470
|
+
major: Module.HEAPU32[versionPtr / 4],
|
|
471
|
+
minor: Module.HEAPU32[(versionPtr + 4) / 4],
|
|
472
|
+
micro: Module.HEAPU32[(versionPtr + 8) / 4]
|
|
473
|
+
};
|
|
474
|
+
exports2.free(versionPtr);
|
|
475
|
+
return version2;
|
|
476
|
+
}
|
|
477
|
+
function version_string() {
|
|
478
|
+
var versionPtr = exports2.hb_version_string();
|
|
479
|
+
var version2 = utf8Decoder.decode(Module.HEAPU8.subarray(versionPtr, Module.HEAPU8.indexOf(0, versionPtr)));
|
|
480
|
+
return version2;
|
|
481
|
+
}
|
|
482
|
+
return {
|
|
483
|
+
createBlob,
|
|
484
|
+
createFace,
|
|
485
|
+
createFont,
|
|
486
|
+
createBuffer,
|
|
487
|
+
shape,
|
|
488
|
+
shapeWithTrace,
|
|
489
|
+
version,
|
|
490
|
+
version_string
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
try {
|
|
494
|
+
module.exports = hbjs;
|
|
495
|
+
} catch (e) {
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
export default require_hbjs();
|
package/package.json
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@shotstack/shotstack-canvas",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Text layout & animation engine (HarfBuzz) for Node & Web - fully self-contained.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/entry.node.cjs",
|
|
7
|
-
"module": "./dist/entry.node.js",
|
|
8
|
-
"browser": "./dist/entry.web.js",
|
|
9
|
-
"types": "./dist/entry.node.d.ts",
|
|
10
|
-
"exports": {
|
|
11
|
-
".": {
|
|
12
|
-
"node": {
|
|
13
|
-
"import": "./dist/entry.node.js",
|
|
14
|
-
"require": "./dist/entry.node.cjs"
|
|
15
|
-
},
|
|
16
|
-
"browser": "./dist/entry.web.js",
|
|
17
|
-
"default": "./dist/entry.web.js"
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
"files": [
|
|
21
|
-
"dist/**",
|
|
22
|
-
"scripts/postinstall.js",
|
|
23
|
-
"README.md",
|
|
24
|
-
"LICENSE"
|
|
25
|
-
],
|
|
26
|
-
"scripts": {
|
|
27
|
-
"dev": "tsup --watch",
|
|
28
|
-
"build": "tsup",
|
|
29
|
-
"postinstall": "node scripts/postinstall.js",
|
|
30
|
-
"vendor:harfbuzz": "node scripts/vendor-harfbuzz.js",
|
|
31
|
-
"example:node": "node examples/node-example.mjs",
|
|
32
|
-
"example:video": "node examples/node-video.mjs",
|
|
33
|
-
"example:web": "vite dev examples/web-example",
|
|
34
|
-
"prepublishOnly": "npm run build"
|
|
35
|
-
},
|
|
36
|
-
"publishConfig": {
|
|
37
|
-
"access": "public",
|
|
38
|
-
"registry": "https://registry.npmjs.org/"
|
|
39
|
-
},
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=18"
|
|
42
|
-
},
|
|
43
|
-
"sideEffects": false,
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"canvas": "npm:@napi-rs/canvas@^0.1.54",
|
|
46
|
-
"ffmpeg-static": "^5.2.0",
|
|
47
|
-
"fontkit": "^2.0.4",
|
|
48
|
-
"harfbuzzjs": "0.4.12",
|
|
49
|
-
"joi": "^17.13.3",
|
|
50
|
-
"opentype.js": "^1.3.4"
|
|
51
|
-
},
|
|
52
|
-
"devDependencies": {
|
|
53
|
-
"@types/fluent-ffmpeg": "2.1.27",
|
|
54
|
-
"@types/node": "^20.14.10",
|
|
55
|
-
"fluent-ffmpeg": "^2.1.3",
|
|
56
|
-
"tsup": "^8.2.3",
|
|
57
|
-
"typescript": "^5.5.3",
|
|
58
|
-
"vite": "^5.3.3",
|
|
59
|
-
"vite-plugin-top-level-await": "1.6.0",
|
|
60
|
-
"vite-plugin-wasm": "3.5.0"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@shotstack/shotstack-canvas",
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "Text layout & animation engine (HarfBuzz) for Node & Web - fully self-contained.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/entry.node.cjs",
|
|
7
|
+
"module": "./dist/entry.node.js",
|
|
8
|
+
"browser": "./dist/entry.web.js",
|
|
9
|
+
"types": "./dist/entry.node.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"node": {
|
|
13
|
+
"import": "./dist/entry.node.js",
|
|
14
|
+
"require": "./dist/entry.node.cjs"
|
|
15
|
+
},
|
|
16
|
+
"browser": "./dist/entry.web.js",
|
|
17
|
+
"default": "./dist/entry.web.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist/**",
|
|
22
|
+
"scripts/postinstall.js",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"postinstall": "node scripts/postinstall.js",
|
|
30
|
+
"vendor:harfbuzz": "node scripts/vendor-harfbuzz.js",
|
|
31
|
+
"example:node": "node examples/node-example.mjs",
|
|
32
|
+
"example:video": "node examples/node-video.mjs",
|
|
33
|
+
"example:web": "vite dev examples/web-example",
|
|
34
|
+
"prepublishOnly": "npm run build"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public",
|
|
38
|
+
"registry": "https://registry.npmjs.org/"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"sideEffects": false,
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"canvas": "npm:@napi-rs/canvas@^0.1.54",
|
|
46
|
+
"ffmpeg-static": "^5.2.0",
|
|
47
|
+
"fontkit": "^2.0.4",
|
|
48
|
+
"harfbuzzjs": "0.4.12",
|
|
49
|
+
"joi": "^17.13.3",
|
|
50
|
+
"opentype.js": "^1.3.4"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/fluent-ffmpeg": "2.1.27",
|
|
54
|
+
"@types/node": "^20.14.10",
|
|
55
|
+
"fluent-ffmpeg": "^2.1.3",
|
|
56
|
+
"tsup": "^8.2.3",
|
|
57
|
+
"typescript": "^5.5.3",
|
|
58
|
+
"vite": "^5.3.3",
|
|
59
|
+
"vite-plugin-top-level-await": "1.6.0",
|
|
60
|
+
"vite-plugin-wasm": "3.5.0"
|
|
61
|
+
}
|
|
62
|
+
}
|