@takumi-rs/wasm 1.8.7 → 2.0.0-beta.1
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/export.cjs +137 -132
- package/dist/export.d.cts +117 -105
- package/dist/export.d.mts +117 -105
- package/dist/export.mjs +133 -128
- package/package.json +2 -2
- package/pkg/takumi_wasm_bg.wasm +0 -0
- package/pkg/takumi_wasm_bg.wasm.d.ts +3 -4
package/dist/export.cjs
CHANGED
|
@@ -23,13 +23,6 @@ var Renderer$1 = class {
|
|
|
23
23
|
wasm.__wbg_renderer_free(ptr, 0);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Clears the renderer's internal image store.
|
|
27
|
-
*/
|
|
28
|
-
clearImageStore() {
|
|
29
|
-
const ret = wasm.renderer_clearImageStore(this.__wbg_ptr);
|
|
30
|
-
if (ret[1]) throw takeFromExternrefTable0(ret[0]);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
26
|
* Encodes a precomputed frame sequence into an animated image buffer.
|
|
34
27
|
* @param {AnimationFrameSource[]} frames
|
|
35
28
|
* @param {EncodeFramesOptions} options
|
|
@@ -45,14 +38,6 @@ var Renderer$1 = class {
|
|
|
45
38
|
return v2;
|
|
46
39
|
}
|
|
47
40
|
/**
|
|
48
|
-
* Loads a font into the renderer.
|
|
49
|
-
* @param {Font} font
|
|
50
|
-
*/
|
|
51
|
-
loadFont(font) {
|
|
52
|
-
const ret = wasm.renderer_loadFont(this.__wbg_ptr, font);
|
|
53
|
-
if (ret[1]) throw takeFromExternrefTable0(ret[0]);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
41
|
* Measures a node tree and returns layout information.
|
|
57
42
|
* @param {Node} node
|
|
58
43
|
* @param {RenderOptions | null} [options]
|
|
@@ -65,22 +50,23 @@ var Renderer$1 = class {
|
|
|
65
50
|
}
|
|
66
51
|
/**
|
|
67
52
|
* Creates a new Renderer instance.
|
|
68
|
-
* @param {ConstructRendererOptions | null} [options]
|
|
69
53
|
*/
|
|
70
|
-
constructor(
|
|
71
|
-
const ret = wasm.renderer_new(
|
|
54
|
+
constructor() {
|
|
55
|
+
const ret = wasm.renderer_new();
|
|
72
56
|
if (ret[2]) throw takeFromExternrefTable0(ret[1]);
|
|
73
57
|
this.__wbg_ptr = ret[0];
|
|
74
58
|
RendererFinalization.register(this, this.__wbg_ptr, this);
|
|
75
59
|
return this;
|
|
76
60
|
}
|
|
77
61
|
/**
|
|
78
|
-
*
|
|
79
|
-
* @param {
|
|
62
|
+
* Registers fonts into the renderer, returning the families each font produced.
|
|
63
|
+
* @param {Font} font
|
|
64
|
+
* @returns {RegisteredFamily[]}
|
|
80
65
|
*/
|
|
81
|
-
|
|
82
|
-
const ret = wasm.
|
|
83
|
-
if (ret[
|
|
66
|
+
registerFont(font) {
|
|
67
|
+
const ret = wasm.renderer_registerFont(this.__wbg_ptr, font);
|
|
68
|
+
if (ret[2]) throw takeFromExternrefTable0(ret[1]);
|
|
69
|
+
return takeFromExternrefTable0(ret[0]);
|
|
84
70
|
}
|
|
85
71
|
/**
|
|
86
72
|
* Renders a node tree into an image buffer.
|
|
@@ -134,6 +120,31 @@ var Renderer$1 = class {
|
|
|
134
120
|
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
135
121
|
}
|
|
136
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Renders a node tree into an SVG document string.
|
|
125
|
+
* @param {Node} node
|
|
126
|
+
* @param {SvgRenderOptions | null} [options]
|
|
127
|
+
* @returns {string}
|
|
128
|
+
*/
|
|
129
|
+
renderSvg(node, options) {
|
|
130
|
+
let deferred2_0;
|
|
131
|
+
let deferred2_1;
|
|
132
|
+
try {
|
|
133
|
+
const ret = wasm.renderer_renderSvg(this.__wbg_ptr, node, isLikeNone(options) ? 0 : addToExternrefTable0(options));
|
|
134
|
+
var ptr1 = ret[0];
|
|
135
|
+
var len1 = ret[1];
|
|
136
|
+
if (ret[3]) {
|
|
137
|
+
ptr1 = 0;
|
|
138
|
+
len1 = 0;
|
|
139
|
+
throw takeFromExternrefTable0(ret[2]);
|
|
140
|
+
}
|
|
141
|
+
deferred2_0 = ptr1;
|
|
142
|
+
deferred2_1 = len1;
|
|
143
|
+
return getStringFromWasm0(ptr1, len1);
|
|
144
|
+
} finally {
|
|
145
|
+
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
137
148
|
};
|
|
138
149
|
if (Symbol.dispose) Renderer$1.prototype[Symbol.dispose] = Renderer$1.prototype.free;
|
|
139
150
|
function __wbg_get_imports() {
|
|
@@ -543,124 +554,118 @@ async function __wbg_init(module_or_path) {
|
|
|
543
554
|
}
|
|
544
555
|
//#endregion
|
|
545
556
|
//#region src/export.ts
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
super.clearImageStore();
|
|
572
|
-
this.persistentImageSrcMark.clear();
|
|
573
|
-
this.pendingPersistentImages.clear();
|
|
574
|
-
}
|
|
575
|
-
async loadFonts(fonts, signal) {
|
|
576
|
-
let loaded = 0;
|
|
577
|
-
for (const font of fonts) if (await this.loadFontInternal(font, signal)) loaded += 1;
|
|
578
|
-
return loaded;
|
|
579
|
-
}
|
|
580
|
-
loadFont(data, signal) {
|
|
581
|
-
const loaded = this.loadFontInternal(data, signal);
|
|
582
|
-
if (isPromise(loaded)) return loaded.then(() => void 0);
|
|
583
|
-
}
|
|
584
|
-
loadFontInternal(font, signal) {
|
|
585
|
-
if (signal?.aborted) return false;
|
|
586
|
-
const resolved = resolveFontLoader(font);
|
|
587
|
-
if (isPromise(resolved)) return resolved.then((value) => {
|
|
588
|
-
if (signal?.aborted || !this.checkAndMarkFont(value)) return false;
|
|
589
|
-
try {
|
|
590
|
-
super.loadFont(value);
|
|
591
|
-
return true;
|
|
592
|
-
} catch (error) {
|
|
593
|
-
this.unmarkFont(value);
|
|
594
|
-
throw error;
|
|
595
|
-
}
|
|
557
|
+
async function resolveImageLoaders(images) {
|
|
558
|
+
const bySrc = /* @__PURE__ */ new Map();
|
|
559
|
+
for (const image of images) bySrc.set(image.src, image);
|
|
560
|
+
return Promise.all([...bySrc.values()].map(async ({ src, data, cache }) => ({
|
|
561
|
+
src,
|
|
562
|
+
data: typeof data === "function" ? await data() : data,
|
|
563
|
+
cache
|
|
564
|
+
})));
|
|
565
|
+
}
|
|
566
|
+
var Renderer = class {
|
|
567
|
+
fontMapping = /* @__PURE__ */ new Map();
|
|
568
|
+
inner = new Renderer$1();
|
|
569
|
+
async prepareFonts(fonts) {
|
|
570
|
+
if (!fonts) return;
|
|
571
|
+
const families = await Promise.all(fonts.map(this.registerFont.bind(this)));
|
|
572
|
+
return [...new Set(families.flat().map((f) => f.name))];
|
|
573
|
+
}
|
|
574
|
+
async render(node, options) {
|
|
575
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
576
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
577
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
578
|
+
return this.inner.render(node, {
|
|
579
|
+
...rest,
|
|
580
|
+
images: resolvedImages,
|
|
581
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
596
582
|
});
|
|
597
|
-
if (!this.checkAndMarkFont(resolved)) return false;
|
|
598
|
-
try {
|
|
599
|
-
super.loadFont(resolved);
|
|
600
|
-
return true;
|
|
601
|
-
} catch (error) {
|
|
602
|
-
this.unmarkFont(resolved);
|
|
603
|
-
throw error;
|
|
604
|
-
}
|
|
605
583
|
}
|
|
606
|
-
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
return isNew;
|
|
584
|
+
async renderAsDataUrl(node, options) {
|
|
585
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
586
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
587
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
588
|
+
return this.inner.renderAsDataUrl(node, {
|
|
589
|
+
...rest,
|
|
590
|
+
images: resolvedImages,
|
|
591
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
592
|
+
});
|
|
616
593
|
}
|
|
617
|
-
|
|
618
|
-
const
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
594
|
+
async renderSvg(node, options) {
|
|
595
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
596
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
597
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
598
|
+
return this.inner.renderSvg(node, {
|
|
599
|
+
...rest,
|
|
600
|
+
images: resolvedImages,
|
|
601
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
602
|
+
});
|
|
624
603
|
}
|
|
625
|
-
|
|
626
|
-
|
|
604
|
+
async measure(node, options) {
|
|
605
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
606
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
607
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
608
|
+
return this.inner.measure(node, {
|
|
609
|
+
...rest,
|
|
610
|
+
images: resolvedImages,
|
|
611
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
612
|
+
});
|
|
627
613
|
}
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (isPromise(resolved)) return resolved.then((data) => ({
|
|
638
|
-
...font,
|
|
639
|
-
data
|
|
640
|
-
}));
|
|
641
|
-
return {
|
|
642
|
-
...font,
|
|
643
|
-
data: resolved
|
|
644
|
-
};
|
|
614
|
+
async renderAnimation(options) {
|
|
615
|
+
const { fonts, fontFamilies, images, ...rest } = options;
|
|
616
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
617
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
618
|
+
return this.inner.renderAnimation({
|
|
619
|
+
...rest,
|
|
620
|
+
images: resolvedImages,
|
|
621
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
622
|
+
});
|
|
645
623
|
}
|
|
646
|
-
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
624
|
+
async encodeFrames(frames, options) {
|
|
625
|
+
const { fonts, fontFamilies, images, ...rest } = options;
|
|
626
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
627
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
628
|
+
return this.inner.encodeFrames(frames, {
|
|
629
|
+
...rest,
|
|
630
|
+
images: resolvedImages,
|
|
631
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
free() {
|
|
635
|
+
this.inner.free();
|
|
636
|
+
}
|
|
637
|
+
async registerFont(font) {
|
|
638
|
+
const key = createFontKey(font);
|
|
639
|
+
const cached = this.fontMapping.get(key);
|
|
640
|
+
if (cached) return cached;
|
|
641
|
+
const extracted = extractFontBuffer(font);
|
|
642
|
+
const register = (data) => this.inner.registerFont(isBuffer(font) ? data : {
|
|
643
|
+
...font,
|
|
653
644
|
data
|
|
654
|
-
})
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
645
|
+
});
|
|
646
|
+
if (isBuffer(extracted)) {
|
|
647
|
+
const binded = register(extracted);
|
|
648
|
+
this.fontMapping.set(key, Promise.resolve(binded));
|
|
649
|
+
return binded;
|
|
650
|
+
}
|
|
651
|
+
const promise = extracted.then(register).catch((error) => {
|
|
652
|
+
this.fontMapping.delete(key);
|
|
653
|
+
throw error;
|
|
654
|
+
});
|
|
655
|
+
this.fontMapping.set(key, promise);
|
|
656
|
+
return promise;
|
|
659
657
|
}
|
|
660
|
-
|
|
658
|
+
};
|
|
659
|
+
function extractFontBuffer(font) {
|
|
660
|
+
if (isBuffer(font)) return font;
|
|
661
|
+
if (typeof font.data !== "function") return font.data;
|
|
662
|
+
return font.data();
|
|
661
663
|
}
|
|
662
|
-
function
|
|
663
|
-
|
|
664
|
+
function createFontKey(font) {
|
|
665
|
+
if (isBuffer(font)) return font;
|
|
666
|
+
if ("key" in font && font.key) return font.key;
|
|
667
|
+
if (typeof font.data === "function") return `${font.name ?? ""}:${font.weight ?? ""}:${font.style ?? ""}`;
|
|
668
|
+
return font.data;
|
|
664
669
|
}
|
|
665
670
|
function isBuffer(data) {
|
|
666
671
|
return data instanceof Uint8Array || data instanceof ArrayBuffer || typeof Buffer !== "undefined" && Buffer.isBuffer(data);
|
package/dist/export.d.cts
CHANGED
|
@@ -12,7 +12,7 @@ type KeyframesRuleList = {
|
|
|
12
12
|
}[];
|
|
13
13
|
}[];
|
|
14
14
|
type Keyframes = KeyframesMap | KeyframesRuleList;
|
|
15
|
-
type RenderOptions = {
|
|
15
|
+
type RenderOptions$1 = {
|
|
16
16
|
/**
|
|
17
17
|
* The width of the image. If not provided, the width will be automatically calculated based on the content.
|
|
18
18
|
*/
|
|
@@ -31,9 +31,10 @@ type RenderOptions = {
|
|
|
31
31
|
*/
|
|
32
32
|
quality?: number;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
35
|
+
* in place of fetching external `src` URLs during rendering.
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
+
images?: ImageSource[];
|
|
37
38
|
/**
|
|
38
39
|
* CSS stylesheets to apply before rendering.
|
|
39
40
|
*/
|
|
@@ -60,8 +61,17 @@ type RenderOptions = {
|
|
|
60
61
|
* @default "none"
|
|
61
62
|
*/
|
|
62
63
|
dithering?: "none" | "ordered-bayer" | "floyd-steinberg";
|
|
64
|
+
/**
|
|
65
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
66
|
+
* Defaults to all registered families in registration order.
|
|
67
|
+
*/
|
|
68
|
+
fontFamilies?: string[];
|
|
63
69
|
};
|
|
64
|
-
|
|
70
|
+
/**
|
|
71
|
+
* SVG is a vector format, so the raster-only knobs do not apply.
|
|
72
|
+
*/
|
|
73
|
+
type SvgRenderOptions$1 = Omit<RenderOptions$1, "format" | "quality" | "drawDebugBorder" | "devicePixelRatio" | "dithering">;
|
|
74
|
+
type RenderAnimationOptions$1 = {
|
|
65
75
|
scenes: AnimationSceneSource[];
|
|
66
76
|
width: number;
|
|
67
77
|
height: number;
|
|
@@ -71,9 +81,10 @@ type RenderAnimationOptions = {
|
|
|
71
81
|
*/
|
|
72
82
|
quality?: number;
|
|
73
83
|
/**
|
|
74
|
-
*
|
|
84
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
85
|
+
* in place of fetching external `src` URLs during rendering.
|
|
75
86
|
*/
|
|
76
|
-
|
|
87
|
+
images?: ImageSource[];
|
|
77
88
|
drawDebugBorder?: boolean;
|
|
78
89
|
/**
|
|
79
90
|
* CSS stylesheets to apply before rendering.
|
|
@@ -88,8 +99,13 @@ type RenderAnimationOptions = {
|
|
|
88
99
|
* Frames per second for timeline sampling.
|
|
89
100
|
*/
|
|
90
101
|
fps: number;
|
|
102
|
+
/**
|
|
103
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
104
|
+
* Defaults to all registered families in registration order.
|
|
105
|
+
*/
|
|
106
|
+
fontFamilies?: string[];
|
|
91
107
|
};
|
|
92
|
-
type EncodeFramesOptions = {
|
|
108
|
+
type EncodeFramesOptions$1 = {
|
|
93
109
|
width: number;
|
|
94
110
|
height: number;
|
|
95
111
|
format?: "webp" | "apng" | "gif";
|
|
@@ -98,9 +114,10 @@ type EncodeFramesOptions = {
|
|
|
98
114
|
*/
|
|
99
115
|
quality?: number;
|
|
100
116
|
/**
|
|
101
|
-
*
|
|
117
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
118
|
+
* in place of fetching external `src` URLs during rendering.
|
|
102
119
|
*/
|
|
103
|
-
|
|
120
|
+
images?: ImageSource[];
|
|
104
121
|
drawDebugBorder?: boolean;
|
|
105
122
|
/**
|
|
106
123
|
* CSS stylesheets to apply before rendering.
|
|
@@ -111,16 +128,28 @@ type EncodeFramesOptions = {
|
|
|
111
128
|
* @default 1.0
|
|
112
129
|
*/
|
|
113
130
|
devicePixelRatio?: number;
|
|
131
|
+
/**
|
|
132
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
133
|
+
* Defaults to all registered families in registration order.
|
|
134
|
+
*/
|
|
135
|
+
fontFamilies?: string[];
|
|
114
136
|
};
|
|
115
137
|
type FontDetails = {
|
|
116
138
|
name?: string;
|
|
117
139
|
data: ByteBuf;
|
|
118
140
|
weight?: number;
|
|
119
141
|
style?: "normal" | "italic" | "oblique" | `oblique ${number}deg` | (string & {});
|
|
142
|
+
/**
|
|
143
|
+
* Logical family this font is a coverage subset of. Subsets sharing a `subsetOf` are
|
|
144
|
+
* kept as distinct families and `font-family: {subsetOf}` expands to all of them, so each
|
|
145
|
+
* script routes to the subset that covers it. Set by {@link loadGoogleFonts}.
|
|
146
|
+
*/
|
|
147
|
+
subsetOf?: string;
|
|
120
148
|
};
|
|
121
149
|
type ImageSource = {
|
|
122
150
|
src: string;
|
|
123
|
-
data: ByteBuf;
|
|
151
|
+
data: ByteBuf; /** Cache policy for the decoded image. Defaults to `"auto"`. */
|
|
152
|
+
cache?: "auto" | "none";
|
|
124
153
|
};
|
|
125
154
|
type KeyframeRule = {
|
|
126
155
|
offsets: number[];
|
|
@@ -131,20 +160,15 @@ type KeyframesRule = {
|
|
|
131
160
|
keyframes: KeyframeRule[];
|
|
132
161
|
};
|
|
133
162
|
type Font = FontDetails | ByteBuf;
|
|
134
|
-
type
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Whether to load the default fonts.
|
|
145
|
-
* If `fonts` are provided, this will be `false` by default.
|
|
146
|
-
*/
|
|
147
|
-
loadDefaultFonts?: boolean;
|
|
163
|
+
type RegisteredFace = {
|
|
164
|
+
weight: number;
|
|
165
|
+
style: string;
|
|
166
|
+
width: number;
|
|
167
|
+
index: number;
|
|
168
|
+
};
|
|
169
|
+
type RegisteredFamily = {
|
|
170
|
+
name: string;
|
|
171
|
+
faces: RegisteredFace[];
|
|
148
172
|
};
|
|
149
173
|
type MeasuredTextRun = {
|
|
150
174
|
text: string;
|
|
@@ -168,68 +192,18 @@ type AnimationSceneSource = {
|
|
|
168
192
|
node: Node$1;
|
|
169
193
|
durationMs: number;
|
|
170
194
|
};
|
|
171
|
-
/**
|
|
172
|
-
* The main renderer for Takumi image rendering engine.
|
|
173
|
-
*
|
|
174
|
-
* State lives behind a lock and every method takes `&self`, mirroring the
|
|
175
|
-
* napi bindings: a panic mid-call can't leave the wasm-bindgen borrow flag
|
|
176
|
-
* permanently set, which would otherwise fail all subsequent calls.
|
|
177
|
-
*/
|
|
178
|
-
declare class Renderer$1 {
|
|
179
|
-
free(): void;
|
|
180
|
-
[Symbol.dispose](): void;
|
|
181
|
-
/**
|
|
182
|
-
* Clears the renderer's internal image store.
|
|
183
|
-
*/
|
|
184
|
-
clearImageStore(): void;
|
|
185
|
-
/**
|
|
186
|
-
* Encodes a precomputed frame sequence into an animated image buffer.
|
|
187
|
-
*/
|
|
188
|
-
encodeFrames(frames: AnimationFrameSource[], options: EncodeFramesOptions): Uint8Array;
|
|
189
|
-
/**
|
|
190
|
-
* Loads a font into the renderer.
|
|
191
|
-
*/
|
|
192
|
-
loadFont(font: Font): void;
|
|
193
|
-
/**
|
|
194
|
-
* Measures a node tree and returns layout information.
|
|
195
|
-
*/
|
|
196
|
-
measure(node: Node$1, options?: RenderOptions | null): MeasuredNode;
|
|
197
|
-
/**
|
|
198
|
-
* Creates a new Renderer instance.
|
|
199
|
-
*/
|
|
200
|
-
constructor(options?: ConstructRendererOptions | null);
|
|
201
|
-
/**
|
|
202
|
-
* Puts a persistent image into the renderer's internal store.
|
|
203
|
-
*/
|
|
204
|
-
putPersistentImage(data: ImageSource): void;
|
|
205
|
-
/**
|
|
206
|
-
* Renders a node tree into an image buffer.
|
|
207
|
-
*/
|
|
208
|
-
render(node: Node$1, options?: RenderOptions | null): Uint8Array;
|
|
209
|
-
/**
|
|
210
|
-
* Renders a sequential animation timeline into a buffer.
|
|
211
|
-
*/
|
|
212
|
-
renderAnimation(options: RenderAnimationOptions): Uint8Array;
|
|
213
|
-
/**
|
|
214
|
-
* Renders a node tree into a data URL.
|
|
215
|
-
*
|
|
216
|
-
* `raw` format is not supported for data URL.
|
|
217
|
-
*/
|
|
218
|
-
renderAsDataUrl(node: Node$1, options: RenderOptions): string;
|
|
219
|
-
}
|
|
220
195
|
type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
|
221
196
|
interface InitOutput {
|
|
222
197
|
readonly memory: WebAssembly.Memory;
|
|
223
198
|
readonly __wbg_renderer_free: (a: number, b: number) => void;
|
|
224
|
-
readonly renderer_clearImageStore: (a: number) => [number, number];
|
|
225
199
|
readonly renderer_encodeFrames: (a: number, b: number, c: number, d: any) => [number, number, number, number];
|
|
226
|
-
readonly renderer_loadFont: (a: number, b: any) => [number, number];
|
|
227
200
|
readonly renderer_measure: (a: number, b: any, c: number) => [number, number, number];
|
|
228
|
-
readonly renderer_new: (
|
|
229
|
-
readonly
|
|
201
|
+
readonly renderer_new: () => [number, number, number];
|
|
202
|
+
readonly renderer_registerFont: (a: number, b: any) => [number, number, number];
|
|
230
203
|
readonly renderer_render: (a: number, b: any, c: number) => [number, number, number, number];
|
|
231
204
|
readonly renderer_renderAnimation: (a: number, b: any) => [number, number, number, number];
|
|
232
205
|
readonly renderer_renderAsDataUrl: (a: number, b: any, c: any) => [number, number, number, number];
|
|
206
|
+
readonly renderer_renderSvg: (a: number, b: any, c: number) => [number, number, number, number];
|
|
233
207
|
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
|
234
208
|
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
235
209
|
readonly __wbindgen_exn_store: (a: number) => void;
|
|
@@ -265,35 +239,73 @@ declare function __wbg_init(module_or_path?: {
|
|
|
265
239
|
} | InitInput | Promise<InitInput>): Promise<InitOutput>;
|
|
266
240
|
//#endregion
|
|
267
241
|
//#region src/export.d.ts
|
|
268
|
-
type ImageSourceLoader = Omit<ImageSource, "data"> & {
|
|
269
|
-
data: ImageSource["data"] | (() => Promise<ImageSource["data"]> | ImageSource["data"]);
|
|
270
|
-
};
|
|
271
242
|
type FontLoader = Font | (Omit<FontDetails, "data"> & {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
243
|
+
data: () => Promise<FontDetails["data"]> | FontDetails["data"];
|
|
244
|
+
} & ({
|
|
245
|
+
key: string;
|
|
246
|
+
} | {
|
|
247
|
+
name: string;
|
|
248
|
+
}));
|
|
249
|
+
type ImageLoaderData = ImageSource["data"];
|
|
250
|
+
type ImageLoader = Omit<ImageSource, "data"> & {
|
|
251
|
+
data: ImageLoaderData | (() => ImageLoaderData | Promise<ImageLoaderData>);
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Output format. Format-specific options live on the variant that supports them,
|
|
255
|
+
* so `quality` cannot be paired with a lossless format. On wasm, WebP is always
|
|
256
|
+
* lossless (lossy WebP is native-only).
|
|
257
|
+
*/
|
|
258
|
+
type OutputFormatOptions = {
|
|
259
|
+
format?: "png";
|
|
260
|
+
} | {
|
|
261
|
+
format: "jpeg";
|
|
262
|
+
quality?: number;
|
|
263
|
+
} | {
|
|
264
|
+
format: "webp";
|
|
265
|
+
} | {
|
|
266
|
+
format: "ico";
|
|
267
|
+
} | {
|
|
268
|
+
format: "raw";
|
|
269
|
+
};
|
|
270
|
+
type RenderOptions = Omit<RenderOptions$1, "images" | "format" | "quality"> & OutputFormatOptions & {
|
|
271
|
+
fonts?: FontLoader[];
|
|
272
|
+
images?: ImageLoader[];
|
|
277
273
|
};
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
274
|
+
/**
|
|
275
|
+
* Animation output format. On wasm, WebP animation is always lossless (lossy
|
|
276
|
+
* WebP is native-only).
|
|
277
|
+
*/
|
|
278
|
+
type AnimationOutputFormatOptions = {
|
|
279
|
+
format?: "webp";
|
|
280
|
+
} | {
|
|
281
|
+
format: "apng";
|
|
282
|
+
} | {
|
|
283
|
+
format: "gif";
|
|
284
|
+
};
|
|
285
|
+
type RenderAnimationOptions = Omit<RenderAnimationOptions$1, "images" | "format"> & AnimationOutputFormatOptions & {
|
|
286
|
+
fonts?: FontLoader[];
|
|
287
|
+
images?: ImageLoader[];
|
|
288
|
+
};
|
|
289
|
+
type EncodeFramesOptions = Omit<EncodeFramesOptions$1, "images" | "format"> & AnimationOutputFormatOptions & {
|
|
290
|
+
fonts?: FontLoader[];
|
|
291
|
+
images?: ImageLoader[];
|
|
292
|
+
};
|
|
293
|
+
type SvgRenderOptions = Omit<SvgRenderOptions$1, "images"> & {
|
|
294
|
+
fonts?: FontLoader[];
|
|
295
|
+
images?: ImageLoader[];
|
|
296
|
+
};
|
|
297
|
+
declare class Renderer {
|
|
298
|
+
private fontMapping;
|
|
299
|
+
private inner;
|
|
300
|
+
private prepareFonts;
|
|
301
|
+
render(node: Node, options?: RenderOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
302
|
+
renderAsDataUrl(node: Node, options?: RenderOptions): Promise<string>;
|
|
303
|
+
renderSvg(node: Node, options?: SvgRenderOptions): Promise<string>;
|
|
304
|
+
measure(node: Node, options?: RenderOptions): Promise<MeasuredNode>;
|
|
305
|
+
renderAnimation(options: RenderAnimationOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
306
|
+
encodeFrames(frames: AnimationFrameSource[], options: EncodeFramesOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
307
|
+
free(): void;
|
|
308
|
+
registerFont(font: FontLoader): Promise<any>;
|
|
297
309
|
}
|
|
298
310
|
//#endregion
|
|
299
|
-
export { AnimationFrameSource, AnimationSceneSource, ByteBuf,
|
|
311
|
+
export { AnimationFrameSource, AnimationOutputFormatOptions, AnimationSceneSource, ByteBuf, ContainerNode, EncodeFramesOptions, Font, FontDetails, FontLoader, ImageLoader, ImageNode, ImageSource, InitInput, InitOutput, KeyframeRule, Keyframes, KeyframesMap, KeyframesRule, KeyframesRuleList, MeasuredNode, MeasuredTextRun, type Node, NodeMetadata, OutputFormatOptions, RegisteredFace, RegisteredFamily, RenderAnimationOptions, RenderOptions, Renderer, SvgRenderOptions, SyncInitInput, TextNode, __wbg_init as default, extractResourceUrls, initSync };
|
package/dist/export.d.mts
CHANGED
|
@@ -12,7 +12,7 @@ type KeyframesRuleList = {
|
|
|
12
12
|
}[];
|
|
13
13
|
}[];
|
|
14
14
|
type Keyframes = KeyframesMap | KeyframesRuleList;
|
|
15
|
-
type RenderOptions = {
|
|
15
|
+
type RenderOptions$1 = {
|
|
16
16
|
/**
|
|
17
17
|
* The width of the image. If not provided, the width will be automatically calculated based on the content.
|
|
18
18
|
*/
|
|
@@ -31,9 +31,10 @@ type RenderOptions = {
|
|
|
31
31
|
*/
|
|
32
32
|
quality?: number;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
35
|
+
* in place of fetching external `src` URLs during rendering.
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
+
images?: ImageSource[];
|
|
37
38
|
/**
|
|
38
39
|
* CSS stylesheets to apply before rendering.
|
|
39
40
|
*/
|
|
@@ -60,8 +61,17 @@ type RenderOptions = {
|
|
|
60
61
|
* @default "none"
|
|
61
62
|
*/
|
|
62
63
|
dithering?: "none" | "ordered-bayer" | "floyd-steinberg";
|
|
64
|
+
/**
|
|
65
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
66
|
+
* Defaults to all registered families in registration order.
|
|
67
|
+
*/
|
|
68
|
+
fontFamilies?: string[];
|
|
63
69
|
};
|
|
64
|
-
|
|
70
|
+
/**
|
|
71
|
+
* SVG is a vector format, so the raster-only knobs do not apply.
|
|
72
|
+
*/
|
|
73
|
+
type SvgRenderOptions$1 = Omit<RenderOptions$1, "format" | "quality" | "drawDebugBorder" | "devicePixelRatio" | "dithering">;
|
|
74
|
+
type RenderAnimationOptions$1 = {
|
|
65
75
|
scenes: AnimationSceneSource[];
|
|
66
76
|
width: number;
|
|
67
77
|
height: number;
|
|
@@ -71,9 +81,10 @@ type RenderAnimationOptions = {
|
|
|
71
81
|
*/
|
|
72
82
|
quality?: number;
|
|
73
83
|
/**
|
|
74
|
-
*
|
|
84
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
85
|
+
* in place of fetching external `src` URLs during rendering.
|
|
75
86
|
*/
|
|
76
|
-
|
|
87
|
+
images?: ImageSource[];
|
|
77
88
|
drawDebugBorder?: boolean;
|
|
78
89
|
/**
|
|
79
90
|
* CSS stylesheets to apply before rendering.
|
|
@@ -88,8 +99,13 @@ type RenderAnimationOptions = {
|
|
|
88
99
|
* Frames per second for timeline sampling.
|
|
89
100
|
*/
|
|
90
101
|
fps: number;
|
|
102
|
+
/**
|
|
103
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
104
|
+
* Defaults to all registered families in registration order.
|
|
105
|
+
*/
|
|
106
|
+
fontFamilies?: string[];
|
|
91
107
|
};
|
|
92
|
-
type EncodeFramesOptions = {
|
|
108
|
+
type EncodeFramesOptions$1 = {
|
|
93
109
|
width: number;
|
|
94
110
|
height: number;
|
|
95
111
|
format?: "webp" | "apng" | "gif";
|
|
@@ -98,9 +114,10 @@ type EncodeFramesOptions = {
|
|
|
98
114
|
*/
|
|
99
115
|
quality?: number;
|
|
100
116
|
/**
|
|
101
|
-
*
|
|
117
|
+
* Images keyed by `src`, each carrying raw bytes. Provided up front and used
|
|
118
|
+
* in place of fetching external `src` URLs during rendering.
|
|
102
119
|
*/
|
|
103
|
-
|
|
120
|
+
images?: ImageSource[];
|
|
104
121
|
drawDebugBorder?: boolean;
|
|
105
122
|
/**
|
|
106
123
|
* CSS stylesheets to apply before rendering.
|
|
@@ -111,16 +128,28 @@ type EncodeFramesOptions = {
|
|
|
111
128
|
* @default 1.0
|
|
112
129
|
*/
|
|
113
130
|
devicePixelRatio?: number;
|
|
131
|
+
/**
|
|
132
|
+
* Per-render font stack: ordered family names used as the fallback chain.
|
|
133
|
+
* Defaults to all registered families in registration order.
|
|
134
|
+
*/
|
|
135
|
+
fontFamilies?: string[];
|
|
114
136
|
};
|
|
115
137
|
type FontDetails = {
|
|
116
138
|
name?: string;
|
|
117
139
|
data: ByteBuf;
|
|
118
140
|
weight?: number;
|
|
119
141
|
style?: "normal" | "italic" | "oblique" | `oblique ${number}deg` | (string & {});
|
|
142
|
+
/**
|
|
143
|
+
* Logical family this font is a coverage subset of. Subsets sharing a `subsetOf` are
|
|
144
|
+
* kept as distinct families and `font-family: {subsetOf}` expands to all of them, so each
|
|
145
|
+
* script routes to the subset that covers it. Set by {@link loadGoogleFonts}.
|
|
146
|
+
*/
|
|
147
|
+
subsetOf?: string;
|
|
120
148
|
};
|
|
121
149
|
type ImageSource = {
|
|
122
150
|
src: string;
|
|
123
|
-
data: ByteBuf;
|
|
151
|
+
data: ByteBuf; /** Cache policy for the decoded image. Defaults to `"auto"`. */
|
|
152
|
+
cache?: "auto" | "none";
|
|
124
153
|
};
|
|
125
154
|
type KeyframeRule = {
|
|
126
155
|
offsets: number[];
|
|
@@ -131,20 +160,15 @@ type KeyframesRule = {
|
|
|
131
160
|
keyframes: KeyframeRule[];
|
|
132
161
|
};
|
|
133
162
|
type Font = FontDetails | ByteBuf;
|
|
134
|
-
type
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Whether to load the default fonts.
|
|
145
|
-
* If `fonts` are provided, this will be `false` by default.
|
|
146
|
-
*/
|
|
147
|
-
loadDefaultFonts?: boolean;
|
|
163
|
+
type RegisteredFace = {
|
|
164
|
+
weight: number;
|
|
165
|
+
style: string;
|
|
166
|
+
width: number;
|
|
167
|
+
index: number;
|
|
168
|
+
};
|
|
169
|
+
type RegisteredFamily = {
|
|
170
|
+
name: string;
|
|
171
|
+
faces: RegisteredFace[];
|
|
148
172
|
};
|
|
149
173
|
type MeasuredTextRun = {
|
|
150
174
|
text: string;
|
|
@@ -168,68 +192,18 @@ type AnimationSceneSource = {
|
|
|
168
192
|
node: Node$1;
|
|
169
193
|
durationMs: number;
|
|
170
194
|
};
|
|
171
|
-
/**
|
|
172
|
-
* The main renderer for Takumi image rendering engine.
|
|
173
|
-
*
|
|
174
|
-
* State lives behind a lock and every method takes `&self`, mirroring the
|
|
175
|
-
* napi bindings: a panic mid-call can't leave the wasm-bindgen borrow flag
|
|
176
|
-
* permanently set, which would otherwise fail all subsequent calls.
|
|
177
|
-
*/
|
|
178
|
-
declare class Renderer$1 {
|
|
179
|
-
free(): void;
|
|
180
|
-
[Symbol.dispose](): void;
|
|
181
|
-
/**
|
|
182
|
-
* Clears the renderer's internal image store.
|
|
183
|
-
*/
|
|
184
|
-
clearImageStore(): void;
|
|
185
|
-
/**
|
|
186
|
-
* Encodes a precomputed frame sequence into an animated image buffer.
|
|
187
|
-
*/
|
|
188
|
-
encodeFrames(frames: AnimationFrameSource[], options: EncodeFramesOptions): Uint8Array;
|
|
189
|
-
/**
|
|
190
|
-
* Loads a font into the renderer.
|
|
191
|
-
*/
|
|
192
|
-
loadFont(font: Font): void;
|
|
193
|
-
/**
|
|
194
|
-
* Measures a node tree and returns layout information.
|
|
195
|
-
*/
|
|
196
|
-
measure(node: Node$1, options?: RenderOptions | null): MeasuredNode;
|
|
197
|
-
/**
|
|
198
|
-
* Creates a new Renderer instance.
|
|
199
|
-
*/
|
|
200
|
-
constructor(options?: ConstructRendererOptions | null);
|
|
201
|
-
/**
|
|
202
|
-
* Puts a persistent image into the renderer's internal store.
|
|
203
|
-
*/
|
|
204
|
-
putPersistentImage(data: ImageSource): void;
|
|
205
|
-
/**
|
|
206
|
-
* Renders a node tree into an image buffer.
|
|
207
|
-
*/
|
|
208
|
-
render(node: Node$1, options?: RenderOptions | null): Uint8Array;
|
|
209
|
-
/**
|
|
210
|
-
* Renders a sequential animation timeline into a buffer.
|
|
211
|
-
*/
|
|
212
|
-
renderAnimation(options: RenderAnimationOptions): Uint8Array;
|
|
213
|
-
/**
|
|
214
|
-
* Renders a node tree into a data URL.
|
|
215
|
-
*
|
|
216
|
-
* `raw` format is not supported for data URL.
|
|
217
|
-
*/
|
|
218
|
-
renderAsDataUrl(node: Node$1, options: RenderOptions): string;
|
|
219
|
-
}
|
|
220
195
|
type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
|
221
196
|
interface InitOutput {
|
|
222
197
|
readonly memory: WebAssembly.Memory;
|
|
223
198
|
readonly __wbg_renderer_free: (a: number, b: number) => void;
|
|
224
|
-
readonly renderer_clearImageStore: (a: number) => [number, number];
|
|
225
199
|
readonly renderer_encodeFrames: (a: number, b: number, c: number, d: any) => [number, number, number, number];
|
|
226
|
-
readonly renderer_loadFont: (a: number, b: any) => [number, number];
|
|
227
200
|
readonly renderer_measure: (a: number, b: any, c: number) => [number, number, number];
|
|
228
|
-
readonly renderer_new: (
|
|
229
|
-
readonly
|
|
201
|
+
readonly renderer_new: () => [number, number, number];
|
|
202
|
+
readonly renderer_registerFont: (a: number, b: any) => [number, number, number];
|
|
230
203
|
readonly renderer_render: (a: number, b: any, c: number) => [number, number, number, number];
|
|
231
204
|
readonly renderer_renderAnimation: (a: number, b: any) => [number, number, number, number];
|
|
232
205
|
readonly renderer_renderAsDataUrl: (a: number, b: any, c: any) => [number, number, number, number];
|
|
206
|
+
readonly renderer_renderSvg: (a: number, b: any, c: number) => [number, number, number, number];
|
|
233
207
|
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
|
234
208
|
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
235
209
|
readonly __wbindgen_exn_store: (a: number) => void;
|
|
@@ -265,35 +239,73 @@ declare function __wbg_init(module_or_path?: {
|
|
|
265
239
|
} | InitInput | Promise<InitInput>): Promise<InitOutput>;
|
|
266
240
|
//#endregion
|
|
267
241
|
//#region src/export.d.ts
|
|
268
|
-
type ImageSourceLoader = Omit<ImageSource, "data"> & {
|
|
269
|
-
data: ImageSource["data"] | (() => Promise<ImageSource["data"]> | ImageSource["data"]);
|
|
270
|
-
};
|
|
271
242
|
type FontLoader = Font | (Omit<FontDetails, "data"> & {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
243
|
+
data: () => Promise<FontDetails["data"]> | FontDetails["data"];
|
|
244
|
+
} & ({
|
|
245
|
+
key: string;
|
|
246
|
+
} | {
|
|
247
|
+
name: string;
|
|
248
|
+
}));
|
|
249
|
+
type ImageLoaderData = ImageSource["data"];
|
|
250
|
+
type ImageLoader = Omit<ImageSource, "data"> & {
|
|
251
|
+
data: ImageLoaderData | (() => ImageLoaderData | Promise<ImageLoaderData>);
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Output format. Format-specific options live on the variant that supports them,
|
|
255
|
+
* so `quality` cannot be paired with a lossless format. On wasm, WebP is always
|
|
256
|
+
* lossless (lossy WebP is native-only).
|
|
257
|
+
*/
|
|
258
|
+
type OutputFormatOptions = {
|
|
259
|
+
format?: "png";
|
|
260
|
+
} | {
|
|
261
|
+
format: "jpeg";
|
|
262
|
+
quality?: number;
|
|
263
|
+
} | {
|
|
264
|
+
format: "webp";
|
|
265
|
+
} | {
|
|
266
|
+
format: "ico";
|
|
267
|
+
} | {
|
|
268
|
+
format: "raw";
|
|
269
|
+
};
|
|
270
|
+
type RenderOptions = Omit<RenderOptions$1, "images" | "format" | "quality"> & OutputFormatOptions & {
|
|
271
|
+
fonts?: FontLoader[];
|
|
272
|
+
images?: ImageLoader[];
|
|
277
273
|
};
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
274
|
+
/**
|
|
275
|
+
* Animation output format. On wasm, WebP animation is always lossless (lossy
|
|
276
|
+
* WebP is native-only).
|
|
277
|
+
*/
|
|
278
|
+
type AnimationOutputFormatOptions = {
|
|
279
|
+
format?: "webp";
|
|
280
|
+
} | {
|
|
281
|
+
format: "apng";
|
|
282
|
+
} | {
|
|
283
|
+
format: "gif";
|
|
284
|
+
};
|
|
285
|
+
type RenderAnimationOptions = Omit<RenderAnimationOptions$1, "images" | "format"> & AnimationOutputFormatOptions & {
|
|
286
|
+
fonts?: FontLoader[];
|
|
287
|
+
images?: ImageLoader[];
|
|
288
|
+
};
|
|
289
|
+
type EncodeFramesOptions = Omit<EncodeFramesOptions$1, "images" | "format"> & AnimationOutputFormatOptions & {
|
|
290
|
+
fonts?: FontLoader[];
|
|
291
|
+
images?: ImageLoader[];
|
|
292
|
+
};
|
|
293
|
+
type SvgRenderOptions = Omit<SvgRenderOptions$1, "images"> & {
|
|
294
|
+
fonts?: FontLoader[];
|
|
295
|
+
images?: ImageLoader[];
|
|
296
|
+
};
|
|
297
|
+
declare class Renderer {
|
|
298
|
+
private fontMapping;
|
|
299
|
+
private inner;
|
|
300
|
+
private prepareFonts;
|
|
301
|
+
render(node: Node, options?: RenderOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
302
|
+
renderAsDataUrl(node: Node, options?: RenderOptions): Promise<string>;
|
|
303
|
+
renderSvg(node: Node, options?: SvgRenderOptions): Promise<string>;
|
|
304
|
+
measure(node: Node, options?: RenderOptions): Promise<MeasuredNode>;
|
|
305
|
+
renderAnimation(options: RenderAnimationOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
306
|
+
encodeFrames(frames: AnimationFrameSource[], options: EncodeFramesOptions): Promise<Uint8Array<ArrayBufferLike>>;
|
|
307
|
+
free(): void;
|
|
308
|
+
registerFont(font: FontLoader): Promise<any>;
|
|
297
309
|
}
|
|
298
310
|
//#endregion
|
|
299
|
-
export { AnimationFrameSource, AnimationSceneSource, ByteBuf,
|
|
311
|
+
export { AnimationFrameSource, AnimationOutputFormatOptions, AnimationSceneSource, ByteBuf, ContainerNode, EncodeFramesOptions, Font, FontDetails, FontLoader, ImageLoader, ImageNode, ImageSource, InitInput, InitOutput, KeyframeRule, Keyframes, KeyframesMap, KeyframesRule, KeyframesRuleList, MeasuredNode, MeasuredTextRun, type Node, NodeMetadata, OutputFormatOptions, RegisteredFace, RegisteredFamily, RenderAnimationOptions, RenderOptions, Renderer, SvgRenderOptions, SyncInitInput, TextNode, __wbg_init as default, extractResourceUrls, initSync };
|
package/dist/export.mjs
CHANGED
|
@@ -19,13 +19,6 @@ var Renderer$1 = class {
|
|
|
19
19
|
wasm.__wbg_renderer_free(ptr, 0);
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* Clears the renderer's internal image store.
|
|
23
|
-
*/
|
|
24
|
-
clearImageStore() {
|
|
25
|
-
const ret = wasm.renderer_clearImageStore(this.__wbg_ptr);
|
|
26
|
-
if (ret[1]) throw takeFromExternrefTable0(ret[0]);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
22
|
* Encodes a precomputed frame sequence into an animated image buffer.
|
|
30
23
|
* @param {AnimationFrameSource[]} frames
|
|
31
24
|
* @param {EncodeFramesOptions} options
|
|
@@ -41,14 +34,6 @@ var Renderer$1 = class {
|
|
|
41
34
|
return v2;
|
|
42
35
|
}
|
|
43
36
|
/**
|
|
44
|
-
* Loads a font into the renderer.
|
|
45
|
-
* @param {Font} font
|
|
46
|
-
*/
|
|
47
|
-
loadFont(font) {
|
|
48
|
-
const ret = wasm.renderer_loadFont(this.__wbg_ptr, font);
|
|
49
|
-
if (ret[1]) throw takeFromExternrefTable0(ret[0]);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
37
|
* Measures a node tree and returns layout information.
|
|
53
38
|
* @param {Node} node
|
|
54
39
|
* @param {RenderOptions | null} [options]
|
|
@@ -61,22 +46,23 @@ var Renderer$1 = class {
|
|
|
61
46
|
}
|
|
62
47
|
/**
|
|
63
48
|
* Creates a new Renderer instance.
|
|
64
|
-
* @param {ConstructRendererOptions | null} [options]
|
|
65
49
|
*/
|
|
66
|
-
constructor(
|
|
67
|
-
const ret = wasm.renderer_new(
|
|
50
|
+
constructor() {
|
|
51
|
+
const ret = wasm.renderer_new();
|
|
68
52
|
if (ret[2]) throw takeFromExternrefTable0(ret[1]);
|
|
69
53
|
this.__wbg_ptr = ret[0];
|
|
70
54
|
RendererFinalization.register(this, this.__wbg_ptr, this);
|
|
71
55
|
return this;
|
|
72
56
|
}
|
|
73
57
|
/**
|
|
74
|
-
*
|
|
75
|
-
* @param {
|
|
58
|
+
* Registers fonts into the renderer, returning the families each font produced.
|
|
59
|
+
* @param {Font} font
|
|
60
|
+
* @returns {RegisteredFamily[]}
|
|
76
61
|
*/
|
|
77
|
-
|
|
78
|
-
const ret = wasm.
|
|
79
|
-
if (ret[
|
|
62
|
+
registerFont(font) {
|
|
63
|
+
const ret = wasm.renderer_registerFont(this.__wbg_ptr, font);
|
|
64
|
+
if (ret[2]) throw takeFromExternrefTable0(ret[1]);
|
|
65
|
+
return takeFromExternrefTable0(ret[0]);
|
|
80
66
|
}
|
|
81
67
|
/**
|
|
82
68
|
* Renders a node tree into an image buffer.
|
|
@@ -130,6 +116,31 @@ var Renderer$1 = class {
|
|
|
130
116
|
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
131
117
|
}
|
|
132
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Renders a node tree into an SVG document string.
|
|
121
|
+
* @param {Node} node
|
|
122
|
+
* @param {SvgRenderOptions | null} [options]
|
|
123
|
+
* @returns {string}
|
|
124
|
+
*/
|
|
125
|
+
renderSvg(node, options) {
|
|
126
|
+
let deferred2_0;
|
|
127
|
+
let deferred2_1;
|
|
128
|
+
try {
|
|
129
|
+
const ret = wasm.renderer_renderSvg(this.__wbg_ptr, node, isLikeNone(options) ? 0 : addToExternrefTable0(options));
|
|
130
|
+
var ptr1 = ret[0];
|
|
131
|
+
var len1 = ret[1];
|
|
132
|
+
if (ret[3]) {
|
|
133
|
+
ptr1 = 0;
|
|
134
|
+
len1 = 0;
|
|
135
|
+
throw takeFromExternrefTable0(ret[2]);
|
|
136
|
+
}
|
|
137
|
+
deferred2_0 = ptr1;
|
|
138
|
+
deferred2_1 = len1;
|
|
139
|
+
return getStringFromWasm0(ptr1, len1);
|
|
140
|
+
} finally {
|
|
141
|
+
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
133
144
|
};
|
|
134
145
|
if (Symbol.dispose) Renderer$1.prototype[Symbol.dispose] = Renderer$1.prototype.free;
|
|
135
146
|
function __wbg_get_imports() {
|
|
@@ -539,124 +550,118 @@ async function __wbg_init(module_or_path) {
|
|
|
539
550
|
}
|
|
540
551
|
//#endregion
|
|
541
552
|
//#region src/export.ts
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
553
|
+
async function resolveImageLoaders(images) {
|
|
554
|
+
const bySrc = /* @__PURE__ */ new Map();
|
|
555
|
+
for (const image of images) bySrc.set(image.src, image);
|
|
556
|
+
return Promise.all([...bySrc.values()].map(async ({ src, data, cache }) => ({
|
|
557
|
+
src,
|
|
558
|
+
data: typeof data === "function" ? await data() : data,
|
|
559
|
+
cache
|
|
560
|
+
})));
|
|
561
|
+
}
|
|
562
|
+
var Renderer = class {
|
|
563
|
+
fontMapping = /* @__PURE__ */ new Map();
|
|
564
|
+
inner = new Renderer$1();
|
|
565
|
+
async prepareFonts(fonts) {
|
|
566
|
+
if (!fonts) return;
|
|
567
|
+
const families = await Promise.all(fonts.map(this.registerFont.bind(this)));
|
|
568
|
+
return [...new Set(families.flat().map((f) => f.name))];
|
|
569
|
+
}
|
|
570
|
+
async render(node, options) {
|
|
571
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
572
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
573
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
574
|
+
return this.inner.render(node, {
|
|
575
|
+
...rest,
|
|
576
|
+
images: resolvedImages,
|
|
577
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
578
|
+
});
|
|
565
579
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
this.
|
|
569
|
-
|
|
580
|
+
async renderAsDataUrl(node, options) {
|
|
581
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
582
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
583
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
584
|
+
return this.inner.renderAsDataUrl(node, {
|
|
585
|
+
...rest,
|
|
586
|
+
images: resolvedImages,
|
|
587
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
588
|
+
});
|
|
570
589
|
}
|
|
571
|
-
async
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
590
|
+
async renderSvg(node, options) {
|
|
591
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
592
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
593
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
594
|
+
return this.inner.renderSvg(node, {
|
|
595
|
+
...rest,
|
|
596
|
+
images: resolvedImages,
|
|
597
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
598
|
+
});
|
|
575
599
|
}
|
|
576
|
-
|
|
577
|
-
const
|
|
578
|
-
|
|
600
|
+
async measure(node, options) {
|
|
601
|
+
const { fonts, fontFamilies, images, ...rest } = options ?? {};
|
|
602
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
603
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
604
|
+
return this.inner.measure(node, {
|
|
605
|
+
...rest,
|
|
606
|
+
images: resolvedImages,
|
|
607
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
608
|
+
});
|
|
579
609
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
const
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
} catch (error) {
|
|
589
|
-
this.unmarkFont(value);
|
|
590
|
-
throw error;
|
|
591
|
-
}
|
|
610
|
+
async renderAnimation(options) {
|
|
611
|
+
const { fonts, fontFamilies, images, ...rest } = options;
|
|
612
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
613
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
614
|
+
return this.inner.renderAnimation({
|
|
615
|
+
...rest,
|
|
616
|
+
images: resolvedImages,
|
|
617
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
592
618
|
});
|
|
593
|
-
if (!this.checkAndMarkFont(resolved)) return false;
|
|
594
|
-
try {
|
|
595
|
-
super.loadFont(resolved);
|
|
596
|
-
return true;
|
|
597
|
-
} catch (error) {
|
|
598
|
-
this.unmarkFont(resolved);
|
|
599
|
-
throw error;
|
|
600
|
-
}
|
|
601
619
|
}
|
|
602
|
-
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
620
|
+
async encodeFrames(frames, options) {
|
|
621
|
+
const { fonts, fontFamilies, images, ...rest } = options;
|
|
622
|
+
const registeredFamilies = await this.prepareFonts(fonts);
|
|
623
|
+
const resolvedImages = images ? await resolveImageLoaders(images) : void 0;
|
|
624
|
+
return this.inner.encodeFrames(frames, {
|
|
625
|
+
...rest,
|
|
626
|
+
images: resolvedImages,
|
|
627
|
+
fontFamilies: fontFamilies ?? registeredFamilies
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
free() {
|
|
631
|
+
this.inner.free();
|
|
612
632
|
}
|
|
613
|
-
|
|
633
|
+
async registerFont(font) {
|
|
614
634
|
const key = createFontKey(font);
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
635
|
+
const cached = this.fontMapping.get(key);
|
|
636
|
+
if (cached) return cached;
|
|
637
|
+
const extracted = extractFontBuffer(font);
|
|
638
|
+
const register = (data) => this.inner.registerFont(isBuffer(font) ? data : {
|
|
639
|
+
...font,
|
|
640
|
+
data
|
|
641
|
+
});
|
|
642
|
+
if (isBuffer(extracted)) {
|
|
643
|
+
const binded = register(extracted);
|
|
644
|
+
this.fontMapping.set(key, Promise.resolve(binded));
|
|
645
|
+
return binded;
|
|
618
646
|
}
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
647
|
+
const promise = extracted.then(register).catch((error) => {
|
|
648
|
+
this.fontMapping.delete(key);
|
|
649
|
+
throw error;
|
|
650
|
+
});
|
|
651
|
+
this.fontMapping.set(key, promise);
|
|
652
|
+
return promise;
|
|
623
653
|
}
|
|
624
654
|
};
|
|
625
|
-
function
|
|
626
|
-
if ("key" in font && font.key) return font.key;
|
|
655
|
+
function extractFontBuffer(font) {
|
|
627
656
|
if (isBuffer(font)) return font;
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
function resolveFontLoader(font) {
|
|
631
|
-
if ("data" in font && typeof font.data === "function") {
|
|
632
|
-
const resolved = font.data();
|
|
633
|
-
if (isPromise(resolved)) return resolved.then((data) => ({
|
|
634
|
-
...font,
|
|
635
|
-
data
|
|
636
|
-
}));
|
|
637
|
-
return {
|
|
638
|
-
...font,
|
|
639
|
-
data: resolved
|
|
640
|
-
};
|
|
641
|
-
}
|
|
642
|
-
return font;
|
|
643
|
-
}
|
|
644
|
-
function resolveImageLoader(source) {
|
|
645
|
-
if (typeof source.data === "function") {
|
|
646
|
-
const resolved = source.data();
|
|
647
|
-
if (isPromise(resolved)) return resolved.then((data) => ({
|
|
648
|
-
...source,
|
|
649
|
-
data
|
|
650
|
-
}));
|
|
651
|
-
return {
|
|
652
|
-
...source,
|
|
653
|
-
data: resolved
|
|
654
|
-
};
|
|
655
|
-
}
|
|
656
|
-
return source;
|
|
657
|
+
if (typeof font.data !== "function") return font.data;
|
|
658
|
+
return font.data();
|
|
657
659
|
}
|
|
658
|
-
function
|
|
659
|
-
|
|
660
|
+
function createFontKey(font) {
|
|
661
|
+
if (isBuffer(font)) return font;
|
|
662
|
+
if ("key" in font && font.key) return font.key;
|
|
663
|
+
if (typeof font.data === "function") return `${font.name ?? ""}:${font.weight ?? ""}:${font.style ?? ""}`;
|
|
664
|
+
return font.data;
|
|
660
665
|
}
|
|
661
666
|
function isBuffer(data) {
|
|
662
667
|
return data instanceof Uint8Array || data instanceof ArrayBuffer || typeof Buffer !== "undefined" && Buffer.isBuffer(data);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takumi-rs/wasm",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"css",
|
|
6
6
|
"image",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"publish-lint": "attw --pack . && publint --strict ."
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@takumi-rs/helpers": "
|
|
93
|
+
"@takumi-rs/helpers": "2.0.0-beta.1"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
96
|
"@types/bun": "catalog:",
|
package/pkg/takumi_wasm_bg.wasm
CHANGED
|
Binary file
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
/* eslint-disable */
|
|
3
3
|
export const memory: WebAssembly.Memory;
|
|
4
4
|
export const __wbg_renderer_free: (a: number, b: number) => void;
|
|
5
|
-
export const renderer_clearImageStore: (a: number) => [number, number];
|
|
6
5
|
export const renderer_encodeFrames: (a: number, b: number, c: number, d: any) => [number, number, number, number];
|
|
7
|
-
export const renderer_loadFont: (a: number, b: any) => [number, number];
|
|
8
6
|
export const renderer_measure: (a: number, b: any, c: number) => [number, number, number];
|
|
9
|
-
export const renderer_new: (
|
|
10
|
-
export const
|
|
7
|
+
export const renderer_new: () => [number, number, number];
|
|
8
|
+
export const renderer_registerFont: (a: number, b: any) => [number, number, number];
|
|
11
9
|
export const renderer_render: (a: number, b: any, c: number) => [number, number, number, number];
|
|
12
10
|
export const renderer_renderAnimation: (a: number, b: any) => [number, number, number, number];
|
|
13
11
|
export const renderer_renderAsDataUrl: (a: number, b: any, c: any) => [number, number, number, number];
|
|
12
|
+
export const renderer_renderSvg: (a: number, b: any, c: number) => [number, number, number, number];
|
|
14
13
|
export const __wbindgen_malloc: (a: number, b: number) => number;
|
|
15
14
|
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
16
15
|
export const __wbindgen_exn_store: (a: number) => void;
|