Skip to content

Commit 95c311c

Browse files
committed
fix(rendering): ignore unsupported font glyphs
1 parent f31c164 commit 95c311c

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

packages/rendering/src/font/font-renderer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,10 @@ export class FontRenderer {
244244
const characterSize =
245245
sizes[isAscii ? "ascii" : "unicode"][unicode.toUpperCase()];
246246

247-
const startOffset = characterSize?.start ?? 0;
248-
const width = characterSize?.width ?? 0;
247+
if (!characterSize?.width) return null;
248+
249+
const startOffset = characterSize.start ?? 0;
250+
const width = characterSize.width;
249251

250252
return {
251253
x: (startOffset + x * 16) * scale,

packages/rendering/tests/index.spec.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* https://github.com/Statsify/statsify/blob/main/LICENSE
77
*/
88

9+
import { FontRenderer } from "#font";
10+
import { createCanvas } from "../src/canvas.js";
911
import { createInstructions } from "../src/index.js";
1012
import { expect, it, suite } from "vitest";
1113

@@ -156,3 +158,37 @@ suite("JSX Fragments", () => {
156158
expect(instructions.children?.length).toBe(2);
157159
});
158160
});
161+
162+
suite("FontRenderer", () => {
163+
it("ignores unsupported glyphs with a loaded unicode page", () => {
164+
const page = createCanvas(256, 256);
165+
const pageCtx = page.getContext("2d");
166+
const target = createCanvas(16, 16).getContext("2d");
167+
168+
const renderer = new FontRenderer(false);
169+
170+
Object.assign(renderer, {
171+
images: new Map([["1f", pageCtx]]),
172+
canvases: new WeakMap([[pageCtx, page]]),
173+
scales: new WeakMap([[pageCtx, 1]]),
174+
});
175+
176+
expect(() => renderer.fillText(target, renderer.lex("🌙"), 0, 0)).not.toThrow();
177+
});
178+
179+
it("ignores zero-width glyph metadata", () => {
180+
const page = createCanvas(256, 256);
181+
const pageCtx = page.getContext("2d");
182+
const target = createCanvas(16, 16).getContext("2d");
183+
184+
const renderer = new FontRenderer(false);
185+
186+
Object.assign(renderer, {
187+
images: new Map([["12", pageCtx]]),
188+
canvases: new WeakMap([[pageCtx, page]]),
189+
scales: new WeakMap([[pageCtx, 1]]),
190+
});
191+
192+
expect(() => renderer.fillText(target, renderer.lex("\u1249"), 0, 0)).not.toThrow();
193+
});
194+
});

0 commit comments

Comments
 (0)