Merge pull request #21595 from Snuffleupagus/CompiledFont-Maps

Change the `CompiledFont` glyph/charCode caches to use `Map`s
This commit is contained in:
Tim van der Meij 2026-07-19 13:53:12 +02:00 committed by GitHub
commit 8c3941a0d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -781,6 +781,10 @@ class Commands {
} }
class CompiledFont { class CompiledFont {
#compiledGlyphs = new Map();
#compiledCharCodeToGlyphId = new Map();
constructor(fontMatrix) { constructor(fontMatrix) {
if ( if (
(typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) && (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) &&
@ -789,9 +793,6 @@ class CompiledFont {
unreachable("Cannot initialize CompiledFont."); unreachable("Cannot initialize CompiledFont.");
} }
this.fontMatrix = fontMatrix; this.fontMatrix = fontMatrix;
this.compiledGlyphs = Object.create(null);
this.compiledCharCodeToGlyphId = Object.create(null);
} }
static get NOOP() { static get NOOP() {
@ -807,24 +808,20 @@ class CompiledFont {
getPathJs(unicode) { getPathJs(unicode) {
const { charCode, glyphId } = lookupCmap(this.cmap, unicode); const { charCode, glyphId } = lookupCmap(this.cmap, unicode);
let fn = this.compiledGlyphs[glyphId],
compileEx; const path = this.#compiledGlyphs.getOrInsertComputed(glyphId, () => {
if (fn === undefined) {
try { try {
fn = this.compileGlyph(this.glyphs[glyphId], glyphId); return this.compileGlyph(this.glyphs[glyphId], glyphId);
} catch (ex) { } catch (ex) {
fn = CompiledFont.NOOP; // Avoid attempting to re-compile a corrupt glyph. return ex; // Avoid attempting to re-compile a corrupt glyph.
compileEx = ex;
} }
this.compiledGlyphs[glyphId] = fn; });
} this.#compiledCharCodeToGlyphId.getOrInsert(charCode, glyphId);
this.compiledCharCodeToGlyphId[charCode] ??= glyphId;
if (compileEx) { if (path instanceof Error) {
throw compileEx; throw path;
} }
return fn; return path;
} }
compileGlyph(code, glyphId) { compileGlyph(code, glyphId) {
@ -861,8 +858,8 @@ class CompiledFont {
hasBuiltPath(unicode) { hasBuiltPath(unicode) {
const { charCode, glyphId } = lookupCmap(this.cmap, unicode); const { charCode, glyphId } = lookupCmap(this.cmap, unicode);
return ( return (
this.compiledGlyphs[glyphId] !== undefined && this.#compiledGlyphs.has(glyphId) &&
this.compiledCharCodeToGlyphId[charCode] !== undefined this.#compiledCharCodeToGlyphId.has(charCode)
); );
} }
} }