pdfnative 1.4.0 → 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tools/font-compiler.ts"],"names":["i"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * pdfnative — Programmatic Font Compilation API\r\n * =============================================\r\n *\r\n * A pure, cross-platform (Node / browser / Deno / Bun / edge) port of the\r\n * `pdfnative-build-font` CLI (`tools/build-font-data.cjs`). It parses a\r\n * TrueType/OpenType font in memory and produces either:\r\n *\r\n * - a registerable font-data object (`parseFontData`), or\r\n * - the ES/CJS module source string (`compileFontData`) that the CLI writes\r\n * to disk.\r\n *\r\n * This unblocks serverless / sandboxed / in-browser workflows where spawning\r\n * the CLI (`child_process` / `npx`) is impossible, while keeping the zero\r\n * runtime-dependency guarantee (no `Buffer`, no `fs`).\r\n *\r\n * The ESM output of {@link compileFontData} is byte-identical to the CLI when\r\n * the same `fontName` is supplied.\r\n *\r\n * @module pdfnative/tools\r\n * @since 1.5.0\r\n */\r\n\r\n// ── Public types ─────────────────────────────────────────────────────\r\n\r\n/** Font metrics extracted from `head` / `hhea` / `maxp` / `OS/2`. */\r\nexport interface CompiledFontMetrics {\r\n readonly unitsPerEm: number;\r\n readonly ascent: number;\r\n readonly descent: number;\r\n readonly capHeight: number;\r\n readonly stemV: number;\r\n readonly bbox: readonly [number, number, number, number];\r\n readonly defaultWidth: number;\r\n readonly numGlyphs: number;\r\n}\r\n\r\n/**\r\n * A fully-parsed, registerable font-data object. Its shape matches the runtime\r\n * exports of a bundled `*-data.js` module, so it can be registered directly:\r\n *\r\n * ```ts\r\n * const fd = parseFontData(ttfBytes);\r\n * registerFont('custom', () => Promise.resolve(fd));\r\n * ```\r\n */\r\nexport interface FontDataObject {\r\n readonly metrics: CompiledFontMetrics;\r\n readonly fontName: string;\r\n /** Unicode code point → glyph ID. */\r\n readonly cmap: Record<number, number>;\r\n readonly defaultWidth: number;\r\n /** Glyph ID → advance width (non-default only). */\r\n readonly widths: Record<number, number>;\r\n /** GSUB SingleSubst: fromGid → substituteGid. */\r\n readonly gsub: Record<number, number>;\r\n /** GSUB LigatureSubst: firstGid → [[resultGid, comp1, …], …]. */\r\n readonly ligatures: Record<number, number[][]>;\r\n /** GPOS MarkToBase anchors. */\r\n readonly markAnchors: {\r\n readonly marks: Record<number, [number, number, number]>;\r\n readonly bases: Record<number, Record<number, [number, number]>>;\r\n };\r\n /** GPOS MarkToMark anchors. */\r\n readonly mark2mark: {\r\n readonly mark1Anchors: Record<number, Record<number, [number, number]>>;\r\n readonly mark2Classes: Record<number, [number, number, number]>;\r\n };\r\n /** Pre-formatted PDF `/W` array string for the CIDFont object. */\r\n readonly pdfWidthArray: string;\r\n /** Raw TTF binary as base64 (for PDF `FontFile2` embedding). */\r\n readonly ttfBase64: string;\r\n}\r\n\r\n/** Options for {@link compileFontData}. */\r\nexport interface CompileFontDataOptions {\r\n /**\r\n * Font name for `/BaseFont` and the module header. Sanitised to\r\n * `[A-Za-z0-9-]`. Defaults to the font's PostScript / family name from the\r\n * `name` table, or `'CustomFont'` when unavailable.\r\n */\r\n readonly fontName?: string;\r\n /** Output module format. Defaults to `'esm'`. */\r\n readonly format?: 'esm' | 'cjs';\r\n}\r\n\r\n/** Options for {@link parseFontData}. */\r\nexport interface ParseFontDataOptions {\r\n /** Override the derived font name (sanitised to `[A-Za-z0-9-]`). */\r\n readonly fontName?: string;\r\n}\r\n\r\n// ── Internal parsed representation (object-anchor form, mirrors the CLI) ──\r\n\r\ninterface MarkAnchorObj { classIdx: number; x: number; y: number; }\r\ninterface RawMarkAnchors {\r\n marks: Record<number, MarkAnchorObj>;\r\n bases: Record<number, Record<number, { x: number; y: number }>>;\r\n mark2mark: {\r\n mark1Anchors: Record<number, Record<number, { x: number; y: number }>>;\r\n mark2Classes: Record<number, MarkAnchorObj>;\r\n };\r\n}\r\ninterface RawParsed {\r\n metrics: {\r\n unitsPerEm: number; ascent: number; descent: number; capHeight: number;\r\n stemV: number; bbox: [number, number, number, number];\r\n defaultWidth: number; numGlyphs: number;\r\n };\r\n cmap: Record<number, number>;\r\n widths: Record<number, number>;\r\n gsub: Record<number, number>;\r\n ligatures: Record<number, number[][]>;\r\n markAnchors: RawMarkAnchors;\r\n name?: string;\r\n}\r\n\r\n// ── TTF binary reader (DataView-based, big-endian) ───────────────────\r\n\r\nclass TTFReader {\r\n private readonly view: DataView;\r\n private readonly bytes: Uint8Array;\r\n pos = 0;\r\n\r\n constructor(bytes: Uint8Array) {\r\n this.bytes = bytes;\r\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n }\r\n\r\n seek(offset: number): void { this.pos = offset; }\r\n skip(n: number): void { this.pos += n; }\r\n\r\n readUint8(): number { return this.view.getUint8(this.pos++); }\r\n readUint16(): number { const v = this.view.getUint16(this.pos); this.pos += 2; return v; }\r\n readInt16(): number { const v = this.view.getInt16(this.pos); this.pos += 2; return v; }\r\n readUint32(): number { const v = this.view.getUint32(this.pos); this.pos += 4; return v; }\r\n readTag(): string {\r\n let t = '';\r\n for (let k = 0; k < 4; k++) t += String.fromCharCode(this.bytes[this.pos + k]);\r\n this.pos += 4;\r\n return t;\r\n }\r\n}\r\n\r\ntype TableDir = Record<string, { offset: number; length: number }>;\r\n\r\n// ── Coverage table (shared by GSUB + GPOS) ───────────────────────────\r\n\r\nfunction readCoverageTable(r: TTFReader, absOffset: number): number[] {\r\n const glyphs: number[] = [];\r\n r.seek(absOffset);\r\n const format = r.readUint16();\r\n if (format === 1) {\r\n const count = r.readUint16();\r\n for (let i = 0; i < count; i++) glyphs.push(r.readUint16());\r\n } else if (format === 2) {\r\n const rangeCount = r.readUint16();\r\n for (let i = 0; i < rangeCount; i++) {\r\n const start = r.readUint16();\r\n const end = r.readUint16();\r\n r.skip(2); // startCoverageIndex\r\n for (let g = start; g <= end; g++) glyphs.push(g);\r\n }\r\n }\r\n return glyphs;\r\n}\r\n\r\n// ── GSUB LookupType 1 (SingleSubst) ──────────────────────────────────\r\n\r\nfunction parseGSUBSingle(r: TTFReader, tables: TableDir): Record<number, number> {\r\n const gsub: Record<number, number> = {};\r\n if (!tables['GSUB']) return gsub;\r\n try {\r\n const base = tables['GSUB'].offset;\r\n r.seek(base);\r\n r.skip(4); // version\r\n r.skip(2); // scriptListOffset\r\n r.skip(2); // featureListOffset\r\n const lookupListOffset = r.readUint16();\r\n\r\n r.seek(base + lookupListOffset);\r\n const lookupCount = r.readUint16();\r\n const lookupOffsets: number[] = [];\r\n for (let i = 0; i < lookupCount; i++) lookupOffsets.push(r.readUint16());\r\n\r\n for (let li = 0; li < lookupCount; li++) {\r\n r.seek(base + lookupListOffset + lookupOffsets[li]);\r\n const lookupType = r.readUint16();\r\n r.skip(2); // lookupFlag\r\n const subtableCount = r.readUint16();\r\n const subtableOffsets: number[] = [];\r\n for (let si = 0; si < subtableCount; si++) subtableOffsets.push(r.readUint16());\r\n if (lookupType !== 1) continue;\r\n\r\n for (const stOffset of subtableOffsets) {\r\n const stBase = base + lookupListOffset + lookupOffsets[li] + stOffset;\r\n r.seek(stBase);\r\n const substFormat = r.readUint16();\r\n const coverageOffset = r.readUint16();\r\n const coverageGlyphs = readCoverageTable(r, stBase + coverageOffset);\r\n // NB: the cursor is intentionally left where readCoverageTable\r\n // ended — this mirrors the reference CLI (tools/build-font-data.cjs)\r\n // exactly so compileFontData is byte-identical to every bundled\r\n // font module. Do NOT seek back to stBase + 4.\r\n if (substFormat === 1) {\r\n const delta = r.readInt16();\r\n for (const gid of coverageGlyphs) {\r\n const sub = (gid + delta) & 0xFFFF;\r\n if (sub > 0) gsub[gid] = sub;\r\n }\r\n } else if (substFormat === 2) {\r\n const glyphCount = r.readUint16();\r\n for (let gi = 0; gi < glyphCount && gi < coverageGlyphs.length; gi++) {\r\n const sub = r.readUint16();\r\n if (sub > 0) gsub[coverageGlyphs[gi]] = sub;\r\n }\r\n }\r\n }\r\n }\r\n } catch {\r\n // Non-fatal: GSUB parse failure degrades gracefully (no shaping).\r\n }\r\n return gsub;\r\n}\r\n\r\n// ── GSUB LookupType 4 (LigatureSubst) ────────────────────────────────\r\n\r\nfunction parseGSUBLigatures(r: TTFReader, tables: TableDir): Record<number, number[][]> {\r\n const ligatures: Record<number, number[][]> = {};\r\n if (!tables['GSUB']) return ligatures;\r\n try {\r\n const base = tables['GSUB'].offset;\r\n r.seek(base);\r\n r.skip(4);\r\n r.skip(2);\r\n r.skip(2);\r\n const lookupListOffset = r.readUint16();\r\n\r\n r.seek(base + lookupListOffset);\r\n const lookupCount = r.readUint16();\r\n const lookupOffsets: number[] = [];\r\n for (let i = 0; i < lookupCount; i++) lookupOffsets.push(r.readUint16());\r\n\r\n for (let li = 0; li < lookupCount; li++) {\r\n const lookupBase = base + lookupListOffset + lookupOffsets[li];\r\n r.seek(lookupBase);\r\n const lookupType = r.readUint16();\r\n r.skip(2);\r\n const subtableCount = r.readUint16();\r\n const subtableOffsets: number[] = [];\r\n for (let si = 0; si < subtableCount; si++) subtableOffsets.push(r.readUint16());\r\n if (lookupType !== 4) continue;\r\n\r\n for (const stOffset of subtableOffsets) {\r\n const stBase = lookupBase + stOffset;\r\n r.seek(stBase);\r\n const substFormat = r.readUint16();\r\n if (substFormat !== 1) continue;\r\n const coverageOffset = r.readUint16();\r\n const ligSetCount = r.readUint16();\r\n const ligSetOffsets: number[] = [];\r\n for (let lsi = 0; lsi < ligSetCount; lsi++) ligSetOffsets.push(r.readUint16());\r\n const coverageGlyphs = readCoverageTable(r, stBase + coverageOffset);\r\n\r\n for (let lsi = 0; lsi < ligSetCount && lsi < coverageGlyphs.length; lsi++) {\r\n const firstGid = coverageGlyphs[lsi];\r\n const ligSetBase = stBase + ligSetOffsets[lsi];\r\n r.seek(ligSetBase);\r\n const ligCount = r.readUint16();\r\n const ligOffsets: number[] = [];\r\n for (let lgi = 0; lgi < ligCount; lgi++) ligOffsets.push(r.readUint16());\r\n\r\n for (const ligOff of ligOffsets) {\r\n r.seek(ligSetBase + ligOff);\r\n const ligatureGlyph = r.readUint16();\r\n const componentCount = r.readUint16();\r\n const components: number[] = [];\r\n for (let ci = 0; ci < componentCount - 1; ci++) components.push(r.readUint16());\r\n if (!ligatures[firstGid]) ligatures[firstGid] = [];\r\n ligatures[firstGid].push([ligatureGlyph, ...components]);\r\n }\r\n }\r\n }\r\n }\r\n for (const gid of Object.keys(ligatures)) {\r\n ligatures[gid as unknown as number].sort((a, b) => b.length - a.length);\r\n }\r\n } catch {\r\n // Non-fatal.\r\n }\r\n return ligatures;\r\n}\r\n\r\n// ── GPOS LookupType 4 (MarkToBase) + 6 (MarkToMark) ──────────────────\r\n\r\nfunction parseGPOS(r: TTFReader, tables: TableDir): RawMarkAnchors {\r\n const result: RawMarkAnchors = { marks: {}, bases: {}, mark2mark: { mark1Anchors: {}, mark2Classes: {} } };\r\n if (!tables['GPOS']) return result;\r\n try {\r\n const base = tables['GPOS'].offset;\r\n r.seek(base);\r\n r.skip(4);\r\n r.skip(2);\r\n r.skip(2);\r\n const lookupListOffset = r.readUint16();\r\n\r\n r.seek(base + lookupListOffset);\r\n const lookupCount = r.readUint16();\r\n const lookupOffsets: number[] = [];\r\n for (let i = 0; i < lookupCount; i++) lookupOffsets.push(r.readUint16());\r\n\r\n for (let li = 0; li < lookupCount; li++) {\r\n r.seek(base + lookupListOffset + lookupOffsets[li]);\r\n const lookupType = r.readUint16();\r\n r.skip(2);\r\n const subtableCount = r.readUint16();\r\n const stOffsets: number[] = [];\r\n for (let si = 0; si < subtableCount; si++) stOffsets.push(r.readUint16());\r\n if (lookupType !== 4 && lookupType !== 6) continue;\r\n\r\n for (const stOff of stOffsets) {\r\n const stBase = base + lookupListOffset + lookupOffsets[li] + stOff;\r\n r.seek(stBase);\r\n r.skip(2); // posFormat\r\n const mark1CoverageOffset = r.readUint16();\r\n const mark2CoverageOffset = r.readUint16();\r\n const markClassCount = r.readUint16();\r\n const mark1ArrayOffset = r.readUint16();\r\n const mark2ArrayOffset = r.readUint16();\r\n\r\n const mark1Glyphs = readCoverageTable(r, stBase + mark1CoverageOffset);\r\n const mark2Glyphs = readCoverageTable(r, stBase + mark2CoverageOffset);\r\n\r\n r.seek(stBase + mark1ArrayOffset);\r\n const markCount = r.readUint16();\r\n const mark1Entries: (MarkAnchorObj & { gid: number })[] = [];\r\n for (let mi = 0; mi < markCount && mi < mark1Glyphs.length; mi++) {\r\n const markClass = r.readUint16();\r\n const anchorOffset = r.readUint16();\r\n const savedPos = r.pos;\r\n r.seek(stBase + mark1ArrayOffset + anchorOffset);\r\n const anchorFormat = r.readUint16();\r\n const ax = anchorFormat >= 1 ? r.readInt16() : 0;\r\n const ay = anchorFormat >= 1 ? r.readInt16() : 0;\r\n r.pos = savedPos;\r\n mark1Entries.push({ gid: mark1Glyphs[mi], classIdx: markClass, x: ax, y: ay });\r\n }\r\n\r\n r.seek(stBase + mark2ArrayOffset);\r\n const baseCount = r.readUint16();\r\n const baseRecords: number[][] = [];\r\n for (let bi = 0; bi < baseCount; bi++) {\r\n const recs: number[] = [];\r\n for (let mc = 0; mc < markClassCount; mc++) recs.push(r.readUint16());\r\n baseRecords.push(recs);\r\n }\r\n\r\n if (lookupType === 4) {\r\n for (const md of mark1Entries) {\r\n result.marks[md.gid] = { classIdx: md.classIdx, x: md.x, y: md.y };\r\n }\r\n for (let bi = 0; bi < baseCount && bi < mark2Glyphs.length; bi++) {\r\n const baseGid = mark2Glyphs[bi];\r\n result.bases[baseGid] = {};\r\n for (let mc = 0; mc < markClassCount; mc++) {\r\n const anchorOff = baseRecords[bi][mc];\r\n if (!anchorOff) continue;\r\n r.seek(stBase + mark2ArrayOffset + anchorOff);\r\n r.skip(2);\r\n const bx = r.readInt16();\r\n const by = r.readInt16();\r\n result.bases[baseGid][mc] = { x: bx, y: by };\r\n }\r\n }\r\n } else {\r\n for (const md of mark1Entries) {\r\n result.mark2mark.mark2Classes[md.gid] = { classIdx: md.classIdx, x: md.x, y: md.y };\r\n }\r\n for (let bi = 0; bi < baseCount && bi < mark2Glyphs.length; bi++) {\r\n const m1Gid = mark2Glyphs[bi];\r\n result.mark2mark.mark1Anchors[m1Gid] = {};\r\n for (let mc = 0; mc < markClassCount; mc++) {\r\n const anchorOff = baseRecords[bi][mc];\r\n if (!anchorOff) continue;\r\n r.seek(stBase + mark2ArrayOffset + anchorOff);\r\n r.skip(2);\r\n const mx = r.readInt16();\r\n const my = r.readInt16();\r\n result.mark2mark.mark1Anchors[m1Gid][mc] = { x: mx, y: my };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch {\r\n // Non-fatal.\r\n }\r\n return result;\r\n}\r\n\r\n// ── `name` table (best-effort font-name derivation) ──────────────────\r\n\r\nfunction parseName(r: TTFReader, tables: TableDir): string | undefined {\r\n if (!tables['name']) return undefined;\r\n try {\r\n const base = tables['name'].offset;\r\n r.seek(base);\r\n r.skip(2); // format\r\n const count = r.readUint16();\r\n const stringOffset = r.readUint16();\r\n let psName: string | undefined;\r\n let fullName: string | undefined;\r\n let familyName: string | undefined;\r\n for (let i = 0; i < count; i++) {\r\n const platformID = r.readUint16();\r\n const encodingID = r.readUint16();\r\n r.skip(2); // languageID\r\n const nameID = r.readUint16();\r\n const length = r.readUint16();\r\n const offset = r.readUint16();\r\n const savedPos = r.pos;\r\n // Decode Windows (platform 3) UTF-16BE or Mac (platform 1) ASCII.\r\n let value = '';\r\n r.seek(base + stringOffset + offset);\r\n if (platformID === 3 || (platformID === 0)) {\r\n for (let k = 0; k < length; k += 2) value += String.fromCharCode(r.readUint16());\r\n } else {\r\n for (let k = 0; k < length; k++) value += String.fromCharCode(r.readUint8());\r\n }\r\n r.pos = savedPos;\r\n void encodingID;\r\n if (nameID === 6) psName = value;\r\n else if (nameID === 4) fullName = value;\r\n else if (nameID === 1) familyName = value;\r\n }\r\n return psName ?? fullName ?? familyName;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ── Core TTF parser ──────────────────────────────────────────────────\r\n\r\nfunction parseTTFRaw(bytes: Uint8Array): RawParsed {\r\n const r = new TTFReader(bytes);\r\n\r\n const sfVersion = r.readUint32();\r\n if (sfVersion !== 0x00010000 && sfVersion !== 0x74727565 && sfVersion !== 0x4F54544F) {\r\n throw new Error(`Not a TrueType/OpenType font (sfVersion: 0x${sfVersion.toString(16)})`);\r\n }\r\n const numTables = r.readUint16();\r\n r.skip(6);\r\n\r\n const tables: TableDir = {};\r\n for (let i = 0; i < numTables; i++) {\r\n const tag = r.readTag();\r\n r.skip(4);\r\n const offset = r.readUint32();\r\n const length = r.readUint32();\r\n tables[tag] = { offset, length };\r\n }\r\n\r\n if (!tables['head']) throw new Error('Missing head table');\r\n r.seek(tables['head'].offset);\r\n r.skip(18);\r\n const unitsPerEm = r.readUint16();\r\n r.skip(16);\r\n const xMin = r.readInt16();\r\n const yMin = r.readInt16();\r\n const xMax = r.readInt16();\r\n const yMax = r.readInt16();\r\n\r\n if (!tables['hhea']) throw new Error('Missing hhea table');\r\n r.seek(tables['hhea'].offset);\r\n r.skip(4);\r\n const ascent = r.readInt16();\r\n const descent = r.readInt16();\r\n r.skip(26);\r\n const numberOfHMetrics = r.readUint16();\r\n\r\n if (!tables['maxp']) throw new Error('Missing maxp table');\r\n r.seek(tables['maxp'].offset);\r\n r.skip(4);\r\n const numGlyphs = r.readUint16();\r\n\r\n let capHeight = Math.round(ascent * 0.7);\r\n let stemV = 80;\r\n if (tables['OS/2']) {\r\n r.seek(tables['OS/2'].offset);\r\n const os2Version = r.readUint16();\r\n r.seek(tables['OS/2'].offset + 68);\r\n r.readInt16(); // sTypoAscender\r\n r.readInt16(); // sTypoDescender\r\n r.skip(4);\r\n if (os2Version >= 2 && tables['OS/2'].length >= 90) {\r\n r.seek(tables['OS/2'].offset + 88);\r\n capHeight = r.readInt16();\r\n }\r\n r.seek(tables['OS/2'].offset + 4);\r\n const weightClass = r.readUint16();\r\n stemV = Math.round(weightClass * 0.12);\r\n }\r\n\r\n if (!tables['hmtx']) throw new Error('Missing hmtx table');\r\n r.seek(tables['hmtx'].offset);\r\n const widths: Record<number, number> = {};\r\n let lastWidth = 0;\r\n for (let i = 0; i < numberOfHMetrics; i++) {\r\n const advanceWidth = r.readUint16();\r\n r.skip(2);\r\n widths[i] = advanceWidth;\r\n lastWidth = advanceWidth;\r\n }\r\n for (let i = numberOfHMetrics; i < numGlyphs; i++) widths[i] = lastWidth;\r\n\r\n if (!tables['cmap']) throw new Error('Missing cmap table');\r\n const cmapOffset = tables['cmap'].offset;\r\n r.seek(cmapOffset);\r\n r.skip(2);\r\n const numSubtables = r.readUint16();\r\n\r\n let bestSubtableOffset = -1;\r\n let bestFormat = 0;\r\n for (let i = 0; i < numSubtables; i++) {\r\n const platformID = r.readUint16();\r\n const encodingID = r.readUint16();\r\n const subtableOffset = r.readUint32();\r\n if ((platformID === 3 && (encodingID === 1 || encodingID === 10)) ||\r\n (platformID === 0 && (encodingID === 3 || encodingID === 4))) {\r\n const savedPos = r.pos;\r\n r.seek(cmapOffset + subtableOffset);\r\n const format = r.readUint16();\r\n r.pos = savedPos;\r\n if (format === 12 && bestFormat < 12) {\r\n bestSubtableOffset = cmapOffset + subtableOffset;\r\n bestFormat = 12;\r\n } else if (format === 4 && bestFormat < 4) {\r\n bestSubtableOffset = cmapOffset + subtableOffset;\r\n bestFormat = 4;\r\n }\r\n }\r\n }\r\n if (bestSubtableOffset === -1) throw new Error('No suitable cmap subtable found (need format 4 or 12)');\r\n\r\n const cmap: Record<number, number> = {};\r\n if (bestFormat === 12) {\r\n r.seek(bestSubtableOffset);\r\n r.skip(2); r.skip(2); r.skip(4); r.skip(4);\r\n const numGroups = r.readUint32();\r\n for (let i = 0; i < numGroups; i++) {\r\n const startCharCode = r.readUint32();\r\n const endCharCode = r.readUint32();\r\n const startGlyphID = r.readUint32();\r\n for (let c = startCharCode; c <= endCharCode; c++) {\r\n const gid = startGlyphID + (c - startCharCode);\r\n if (gid > 0 && gid < numGlyphs) cmap[c] = gid;\r\n }\r\n }\r\n } else {\r\n r.seek(bestSubtableOffset);\r\n r.skip(2); r.skip(2); r.skip(2);\r\n const segCountX2 = r.readUint16();\r\n const segCount = segCountX2 / 2;\r\n r.skip(6);\r\n const endCodes: number[] = [];\r\n for (let i = 0; i < segCount; i++) endCodes.push(r.readUint16());\r\n r.skip(2);\r\n const startCodes: number[] = [];\r\n for (let i = 0; i < segCount; i++) startCodes.push(r.readUint16());\r\n const idDeltas: number[] = [];\r\n for (let i = 0; i < segCount; i++) idDeltas.push(r.readInt16());\r\n const idRangeOffsetPos = r.pos;\r\n const idRangeOffsets: number[] = [];\r\n for (let i = 0; i < segCount; i++) idRangeOffsets.push(r.readUint16());\r\n\r\n for (let i = 0; i < segCount; i++) {\r\n if (startCodes[i] === 0xFFFF) break;\r\n for (let c = startCodes[i]; c <= endCodes[i]; c++) {\r\n let gid: number;\r\n if (idRangeOffsets[i] === 0) {\r\n gid = (c + idDeltas[i]) & 0xFFFF;\r\n } else {\r\n const offset = idRangeOffsetPos + i * 2 + idRangeOffsets[i] + (c - startCodes[i]) * 2;\r\n r.seek(offset);\r\n gid = r.readUint16();\r\n if (gid !== 0) gid = (gid + idDeltas[i]) & 0xFFFF;\r\n }\r\n if (gid > 0 && gid < numGlyphs) cmap[c] = gid;\r\n }\r\n }\r\n }\r\n\r\n const spaceGid = cmap[0x20] || 0;\r\n const defaultWidth = widths[spaceGid] || widths[0] || 600;\r\n\r\n const gsub = parseGSUBSingle(r, tables);\r\n const ligatures = parseGSUBLigatures(r, tables);\r\n const markAnchors = parseGPOS(r, tables);\r\n const name = parseName(r, tables);\r\n\r\n return {\r\n metrics: {\r\n unitsPerEm, ascent, descent, capHeight, stemV,\r\n bbox: [xMin, yMin, xMax, yMax], defaultWidth, numGlyphs,\r\n },\r\n cmap, widths, gsub, ligatures, markAnchors, name,\r\n };\r\n}\r\n\r\n// ── Base64 encoder (cross-platform, no Buffer) ───────────────────────\r\n\r\nconst B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n\r\nfunction encodeBase64(bytes: Uint8Array): string {\r\n let out = '';\r\n const len = bytes.length;\r\n let i = 0;\r\n for (; i + 2 < len; i += 3) {\r\n const n = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\r\n out += B64_ALPHABET[(n >> 18) & 63] + B64_ALPHABET[(n >> 12) & 63] +\r\n B64_ALPHABET[(n >> 6) & 63] + B64_ALPHABET[n & 63];\r\n }\r\n const rem = len - i;\r\n if (rem === 1) {\r\n const n = bytes[i] << 16;\r\n out += B64_ALPHABET[(n >> 18) & 63] + B64_ALPHABET[(n >> 12) & 63] + '==';\r\n } else if (rem === 2) {\r\n const n = (bytes[i] << 16) | (bytes[i + 1] << 8);\r\n out += B64_ALPHABET[(n >> 18) & 63] + B64_ALPHABET[(n >> 12) & 63] +\r\n B64_ALPHABET[(n >> 6) & 63] + '=';\r\n }\r\n return out;\r\n}\r\n\r\n// ── PDF /W array builder ─────────────────────────────────────────────\r\n\r\nfunction buildPDFWidthArray(widths: Record<number, number>, numGlyphs: number, defaultWidth: number): string {\r\n const allWidths: number[] = [];\r\n for (let i = 0; i < numGlyphs; i++) allWidths.push(widths[i] !== undefined ? widths[i] : defaultWidth);\r\n const parts: string[] = [];\r\n let i = 0;\r\n while (i < numGlyphs) {\r\n if (allWidths[i] === defaultWidth) { i++; continue; }\r\n let j = i;\r\n while (j < numGlyphs && allWidths[j] !== defaultWidth) j++;\r\n const ws = allWidths.slice(i, j).join(' ');\r\n parts.push(`${i} [${ws}]`);\r\n i = j;\r\n }\r\n return parts.join(' ');\r\n}\r\n\r\n// ── Module source generator (ESM byte-identical to the CLI) ──────────\r\n\r\nfunction sanitizeFontName(name: string): string {\r\n return name.replace(/[^A-Za-z0-9-]/g, '');\r\n}\r\n\r\nfunction generateEsmModule(fontName: string, parsed: RawParsed, ttfBase64: string): string {\r\n const { metrics, cmap, widths, gsub, ligatures, markAnchors } = parsed;\r\n\r\n const cmapEntries = Object.entries(cmap).map(([k, v]) => `${k}:${v}`).join(',');\r\n const defaultW = metrics.defaultWidth;\r\n const widthEntries = Object.entries(widths).filter(([, w]) => w !== defaultW).map(([k, v]) => `${k}:${v}`).join(',');\r\n const gsubEntries = Object.entries(gsub || {}).map(([k, v]) => `${k}:${v}`).join(',');\r\n const ligaturesEntries = Object.entries(ligatures || {})\r\n .map(([gid, ligs]) => `${gid}:[${ligs.map((lig) => `[${lig.join(',')}]`).join(',')}]`)\r\n .join(',');\r\n const marksEntries = Object.entries(markAnchors.marks || {})\r\n .map(([gid, a]) => `${gid}:[${a.classIdx},${a.x},${a.y}]`).join(',');\r\n const basesEntries = Object.entries(markAnchors.bases || {})\r\n .map(([gid, anchors]) => `${gid}:{${Object.entries(anchors).map(([mc, a]) => `${mc}:[${a.x},${a.y}]`).join(',')}}`)\r\n .join(',');\r\n const m2m = markAnchors.mark2mark || { mark1Anchors: {}, mark2Classes: {} };\r\n const m2mMark1Entries = Object.entries(m2m.mark1Anchors)\r\n .map(([gid, anchors]) => `${gid}:{${Object.entries(anchors).map(([mc, a]) => `${mc}:[${a.x},${a.y}]`).join(',')}}`)\r\n .join(',');\r\n const m2mMark2Entries = Object.entries(m2m.mark2Classes)\r\n .map(([gid, a]) => `${gid}:[${a.classIdx},${a.x},${a.y}]`).join(',');\r\n const wArray = buildPDFWidthArray(widths, metrics.numGlyphs, defaultW);\r\n\r\n return `/**\r\n * PRE-BUILT FONT DATA — ${fontName}\r\n * ===================================\r\n * Generated by: scripts/build-font-data.cjs\r\n * Source: ${fontName}.ttf\r\n * License: SIL Open Font License 1.1\r\n *\r\n * DO NOT EDIT — Regenerate with:\r\n * node scripts/build-font-data.cjs assets/fonts/${fontName}.ttf assets/fonts/${fontName.toLowerCase().replace(/[^a-z0-9]/g, '-')}-data.js\r\n */\r\n\r\n// Font metrics\r\nexport const metrics = ${JSON.stringify(metrics)};\r\n\r\n// Font name for PDF /BaseFont\r\nexport const fontName = '${fontName.replace(/[^A-Za-z0-9-]/g, '')}';\r\n\r\n// Unicode codepoint → Glyph ID mapping (sparse object, ~O(1) lookup)\r\nexport const cmap = {${cmapEntries}};\r\n\r\n// Glyph ID → Advance Width (only non-default widths; default = ${defaultW})\r\nexport const defaultWidth = ${defaultW};\r\nexport const widths = {${widthEntries}};\r\n\r\n// GSUB SingleSubst: fromGid → substituteGid\r\n// Used by the Thai mini-shaper to select below-clash variants of consonants.\r\nexport const gsub = {${gsubEntries}};\r\n\r\n// GSUB LigatureSubst: firstGid → [[resultGid, comp1, comp2, ...], ...]\r\n// Used by Indic shapers for conjunct formation (C + Halant + C → ligature).\r\n// Entries sorted longest-first for greedy matching.\r\nexport const ligatures = {${ligaturesEntries}};\r\n\r\n// GPOS MarkToBase anchors — used by the Thai mini-shaper for mark positioning.\r\n// marks[gid] = [classIdx, anchorX, anchorY] (design units)\r\n// bases[gid] = { classIdx: [anchorX, anchorY] }\r\nexport const markAnchors = {\r\n marks: {${marksEntries}},\r\n bases: {${basesEntries}}\r\n};\r\n\r\n// GPOS MarkToMark anchors — used for Thai vowel+tone stacking.\r\n// mark1Anchors[mark1Gid] = { classIdx: [anchorX, anchorY] } (base mark, e.g. above vowel)\r\n// mark2Classes[mark2Gid] = [classIdx, anchorX, anchorY] (combining mark, e.g. tone)\r\nexport const mark2mark = {\r\n mark1Anchors: {${m2mMark1Entries}},\r\n mark2Classes: {${m2mMark2Entries}}\r\n};\r\n\r\n// PDF /W array string (pre-formatted for CIDFont object)\r\nexport const pdfWidthArray = '${wArray}';\r\n\r\n// Raw TTF binary as base64 (for PDF FontFile2 embedding)\r\nexport const ttfBase64 = '${ttfBase64}';\r\n\r\n// Utility: get glyph width\r\nexport function getGlyphWidth(glyphId) {\r\n return widths[glyphId] !== undefined ? widths[glyphId] : ${defaultW};\r\n}\r\n\r\n// Utility: get glyph ID for unicode code point\r\nexport function getGlyphId(codePoint) {\r\n return cmap[codePoint] || 0;\r\n}\r\n`;\r\n}\r\n\r\nfunction generateCjsModule(fontName: string, parsed: RawParsed, ttfBase64: string): string {\r\n // Reuse the ESM body, then rewrite the export bindings into CommonJS.\r\n const esm = generateEsmModule(fontName, parsed, ttfBase64);\r\n const names = [\r\n 'metrics', 'fontName', 'cmap', 'defaultWidth', 'widths', 'gsub',\r\n 'ligatures', 'markAnchors', 'mark2mark', 'pdfWidthArray', 'ttfBase64',\r\n 'getGlyphWidth', 'getGlyphId',\r\n ];\r\n const body = esm\r\n .replace(/export const /g, 'const ')\r\n .replace(/export function /g, 'function ');\r\n return `${body}\\nmodule.exports = { ${names.join(', ')} };\\n`;\r\n}\r\n\r\n// ── Public API ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse a TrueType/OpenType font from an in-memory byte buffer into a\r\n * registerable {@link FontDataObject} whose shape matches the runtime exports\r\n * of a bundled `*-data.js` module.\r\n *\r\n * @param buffer - Raw `.ttf` / `.otf` bytes.\r\n * @param opts - Optional overrides (`fontName`).\r\n * @throws If the buffer is not a valid TrueType/OpenType font or lacks a usable\r\n * `cmap` subtable (format 4 or 12).\r\n */\r\nexport function parseFontData(buffer: Uint8Array, opts: ParseFontDataOptions = {}): FontDataObject {\r\n const parsed = parseTTFRaw(buffer);\r\n const fontName = sanitizeFontName(opts.fontName ?? parsed.name ?? 'CustomFont') || 'CustomFont';\r\n const ttfBase64 = encodeBase64(buffer);\r\n\r\n // Convert object-anchor form → array form (runtime module shape).\r\n const marks: Record<number, [number, number, number]> = {};\r\n for (const [gid, a] of Object.entries(parsed.markAnchors.marks)) {\r\n marks[gid as unknown as number] = [a.classIdx, a.x, a.y];\r\n }\r\n const bases: Record<number, Record<number, [number, number]>> = {};\r\n for (const [gid, anchors] of Object.entries(parsed.markAnchors.bases)) {\r\n const inner: Record<number, [number, number]> = {};\r\n for (const [mc, a] of Object.entries(anchors)) inner[mc as unknown as number] = [a.x, a.y];\r\n bases[gid as unknown as number] = inner;\r\n }\r\n const mark1Anchors: Record<number, Record<number, [number, number]>> = {};\r\n for (const [gid, anchors] of Object.entries(parsed.markAnchors.mark2mark.mark1Anchors)) {\r\n const inner: Record<number, [number, number]> = {};\r\n for (const [mc, a] of Object.entries(anchors)) inner[mc as unknown as number] = [a.x, a.y];\r\n mark1Anchors[gid as unknown as number] = inner;\r\n }\r\n const mark2Classes: Record<number, [number, number, number]> = {};\r\n for (const [gid, a] of Object.entries(parsed.markAnchors.mark2mark.mark2Classes)) {\r\n mark2Classes[gid as unknown as number] = [a.classIdx, a.x, a.y];\r\n }\r\n\r\n // Filter widths to non-default only (matches module runtime shape).\r\n const filteredWidths: Record<number, number> = {};\r\n for (const [gid, w] of Object.entries(parsed.widths)) {\r\n if (w !== parsed.metrics.defaultWidth) filteredWidths[gid as unknown as number] = w;\r\n }\r\n\r\n return {\r\n metrics: parsed.metrics,\r\n fontName,\r\n cmap: parsed.cmap,\r\n defaultWidth: parsed.metrics.defaultWidth,\r\n widths: filteredWidths,\r\n gsub: parsed.gsub,\r\n ligatures: parsed.ligatures,\r\n markAnchors: { marks, bases },\r\n mark2mark: { mark1Anchors, mark2Classes },\r\n pdfWidthArray: buildPDFWidthArray(parsed.widths, parsed.metrics.numGlyphs, parsed.metrics.defaultWidth),\r\n ttfBase64,\r\n };\r\n}\r\n\r\n/**\r\n * Compile a TrueType/OpenType font from an in-memory byte buffer into an\r\n * ES-module (default) or CommonJS-module source string, identical to what the\r\n * `pdfnative-build-font` CLI writes to disk (ESM output is byte-identical when\r\n * the same `fontName` is supplied).\r\n *\r\n * @param buffer - Raw `.ttf` / `.otf` bytes.\r\n * @param opts - Optional `fontName` and `format` (`'esm'` | `'cjs'`).\r\n * @returns The module source code as a string, ready to write to a `.js` file.\r\n * @throws If the buffer is not a valid TrueType/OpenType font.\r\n */\r\nexport function compileFontData(buffer: Uint8Array, opts: CompileFontDataOptions = {}): string {\r\n const parsed = parseTTFRaw(buffer);\r\n // Pass the raw name through: the generator sanitises only the `export const\r\n // fontName` value, mirroring the CLI's byte-for-byte output.\r\n const fontName = opts.fontName ?? parsed.name ?? 'CustomFont';\r\n const ttfBase64 = encodeBase64(buffer);\r\n return opts.format === 'cjs'\r\n ? generateCjsModule(fontName, parsed, ttfBase64)\r\n : generateEsmModule(fontName, parsed, ttfBase64);\r\n}\r\n"]}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * pdfnative — Programmatic Font Compilation API
3
+ * =============================================
4
+ *
5
+ * A pure, cross-platform (Node / browser / Deno / Bun / edge) port of the
6
+ * `pdfnative-build-font` CLI (`tools/build-font-data.cjs`). It parses a
7
+ * TrueType/OpenType font in memory and produces either:
8
+ *
9
+ * - a registerable font-data object (`parseFontData`), or
10
+ * - the ES/CJS module source string (`compileFontData`) that the CLI writes
11
+ * to disk.
12
+ *
13
+ * This unblocks serverless / sandboxed / in-browser workflows where spawning
14
+ * the CLI (`child_process` / `npx`) is impossible, while keeping the zero
15
+ * runtime-dependency guarantee (no `Buffer`, no `fs`).
16
+ *
17
+ * The ESM output of {@link compileFontData} is byte-identical to the CLI when
18
+ * the same `fontName` is supplied.
19
+ *
20
+ * @module pdfnative/tools
21
+ * @since 1.5.0
22
+ */
23
+ /** Font metrics extracted from `head` / `hhea` / `maxp` / `OS/2`. */
24
+ interface CompiledFontMetrics {
25
+ readonly unitsPerEm: number;
26
+ readonly ascent: number;
27
+ readonly descent: number;
28
+ readonly capHeight: number;
29
+ readonly stemV: number;
30
+ readonly bbox: readonly [number, number, number, number];
31
+ readonly defaultWidth: number;
32
+ readonly numGlyphs: number;
33
+ }
34
+ /**
35
+ * A fully-parsed, registerable font-data object. Its shape matches the runtime
36
+ * exports of a bundled `*-data.js` module, so it can be registered directly:
37
+ *
38
+ * ```ts
39
+ * const fd = parseFontData(ttfBytes);
40
+ * registerFont('custom', () => Promise.resolve(fd));
41
+ * ```
42
+ */
43
+ interface FontDataObject {
44
+ readonly metrics: CompiledFontMetrics;
45
+ readonly fontName: string;
46
+ /** Unicode code point → glyph ID. */
47
+ readonly cmap: Record<number, number>;
48
+ readonly defaultWidth: number;
49
+ /** Glyph ID → advance width (non-default only). */
50
+ readonly widths: Record<number, number>;
51
+ /** GSUB SingleSubst: fromGid → substituteGid. */
52
+ readonly gsub: Record<number, number>;
53
+ /** GSUB LigatureSubst: firstGid → [[resultGid, comp1, …], …]. */
54
+ readonly ligatures: Record<number, number[][]>;
55
+ /** GPOS MarkToBase anchors. */
56
+ readonly markAnchors: {
57
+ readonly marks: Record<number, [number, number, number]>;
58
+ readonly bases: Record<number, Record<number, [number, number]>>;
59
+ };
60
+ /** GPOS MarkToMark anchors. */
61
+ readonly mark2mark: {
62
+ readonly mark1Anchors: Record<number, Record<number, [number, number]>>;
63
+ readonly mark2Classes: Record<number, [number, number, number]>;
64
+ };
65
+ /** Pre-formatted PDF `/W` array string for the CIDFont object. */
66
+ readonly pdfWidthArray: string;
67
+ /** Raw TTF binary as base64 (for PDF `FontFile2` embedding). */
68
+ readonly ttfBase64: string;
69
+ }
70
+ /** Options for {@link compileFontData}. */
71
+ interface CompileFontDataOptions {
72
+ /**
73
+ * Font name for `/BaseFont` and the module header. Sanitised to
74
+ * `[A-Za-z0-9-]`. Defaults to the font's PostScript / family name from the
75
+ * `name` table, or `'CustomFont'` when unavailable.
76
+ */
77
+ readonly fontName?: string;
78
+ /** Output module format. Defaults to `'esm'`. */
79
+ readonly format?: 'esm' | 'cjs';
80
+ }
81
+ /** Options for {@link parseFontData}. */
82
+ interface ParseFontDataOptions {
83
+ /** Override the derived font name (sanitised to `[A-Za-z0-9-]`). */
84
+ readonly fontName?: string;
85
+ }
86
+ /**
87
+ * Parse a TrueType/OpenType font from an in-memory byte buffer into a
88
+ * registerable {@link FontDataObject} whose shape matches the runtime exports
89
+ * of a bundled `*-data.js` module.
90
+ *
91
+ * @param buffer - Raw `.ttf` / `.otf` bytes.
92
+ * @param opts - Optional overrides (`fontName`).
93
+ * @throws If the buffer is not a valid TrueType/OpenType font or lacks a usable
94
+ * `cmap` subtable (format 4 or 12).
95
+ */
96
+ declare function parseFontData(buffer: Uint8Array, opts?: ParseFontDataOptions): FontDataObject;
97
+ /**
98
+ * Compile a TrueType/OpenType font from an in-memory byte buffer into an
99
+ * ES-module (default) or CommonJS-module source string, identical to what the
100
+ * `pdfnative-build-font` CLI writes to disk (ESM output is byte-identical when
101
+ * the same `fontName` is supplied).
102
+ *
103
+ * @param buffer - Raw `.ttf` / `.otf` bytes.
104
+ * @param opts - Optional `fontName` and `format` (`'esm'` | `'cjs'`).
105
+ * @returns The module source code as a string, ready to write to a `.js` file.
106
+ * @throws If the buffer is not a valid TrueType/OpenType font.
107
+ */
108
+ declare function compileFontData(buffer: Uint8Array, opts?: CompileFontDataOptions): string;
109
+
110
+ export { type CompileFontDataOptions, type CompiledFontMetrics, type FontDataObject, type ParseFontDataOptions, compileFontData, parseFontData };
@@ -0,0 +1,110 @@
1
+ /**
2
+ * pdfnative — Programmatic Font Compilation API
3
+ * =============================================
4
+ *
5
+ * A pure, cross-platform (Node / browser / Deno / Bun / edge) port of the
6
+ * `pdfnative-build-font` CLI (`tools/build-font-data.cjs`). It parses a
7
+ * TrueType/OpenType font in memory and produces either:
8
+ *
9
+ * - a registerable font-data object (`parseFontData`), or
10
+ * - the ES/CJS module source string (`compileFontData`) that the CLI writes
11
+ * to disk.
12
+ *
13
+ * This unblocks serverless / sandboxed / in-browser workflows where spawning
14
+ * the CLI (`child_process` / `npx`) is impossible, while keeping the zero
15
+ * runtime-dependency guarantee (no `Buffer`, no `fs`).
16
+ *
17
+ * The ESM output of {@link compileFontData} is byte-identical to the CLI when
18
+ * the same `fontName` is supplied.
19
+ *
20
+ * @module pdfnative/tools
21
+ * @since 1.5.0
22
+ */
23
+ /** Font metrics extracted from `head` / `hhea` / `maxp` / `OS/2`. */
24
+ interface CompiledFontMetrics {
25
+ readonly unitsPerEm: number;
26
+ readonly ascent: number;
27
+ readonly descent: number;
28
+ readonly capHeight: number;
29
+ readonly stemV: number;
30
+ readonly bbox: readonly [number, number, number, number];
31
+ readonly defaultWidth: number;
32
+ readonly numGlyphs: number;
33
+ }
34
+ /**
35
+ * A fully-parsed, registerable font-data object. Its shape matches the runtime
36
+ * exports of a bundled `*-data.js` module, so it can be registered directly:
37
+ *
38
+ * ```ts
39
+ * const fd = parseFontData(ttfBytes);
40
+ * registerFont('custom', () => Promise.resolve(fd));
41
+ * ```
42
+ */
43
+ interface FontDataObject {
44
+ readonly metrics: CompiledFontMetrics;
45
+ readonly fontName: string;
46
+ /** Unicode code point → glyph ID. */
47
+ readonly cmap: Record<number, number>;
48
+ readonly defaultWidth: number;
49
+ /** Glyph ID → advance width (non-default only). */
50
+ readonly widths: Record<number, number>;
51
+ /** GSUB SingleSubst: fromGid → substituteGid. */
52
+ readonly gsub: Record<number, number>;
53
+ /** GSUB LigatureSubst: firstGid → [[resultGid, comp1, …], …]. */
54
+ readonly ligatures: Record<number, number[][]>;
55
+ /** GPOS MarkToBase anchors. */
56
+ readonly markAnchors: {
57
+ readonly marks: Record<number, [number, number, number]>;
58
+ readonly bases: Record<number, Record<number, [number, number]>>;
59
+ };
60
+ /** GPOS MarkToMark anchors. */
61
+ readonly mark2mark: {
62
+ readonly mark1Anchors: Record<number, Record<number, [number, number]>>;
63
+ readonly mark2Classes: Record<number, [number, number, number]>;
64
+ };
65
+ /** Pre-formatted PDF `/W` array string for the CIDFont object. */
66
+ readonly pdfWidthArray: string;
67
+ /** Raw TTF binary as base64 (for PDF `FontFile2` embedding). */
68
+ readonly ttfBase64: string;
69
+ }
70
+ /** Options for {@link compileFontData}. */
71
+ interface CompileFontDataOptions {
72
+ /**
73
+ * Font name for `/BaseFont` and the module header. Sanitised to
74
+ * `[A-Za-z0-9-]`. Defaults to the font's PostScript / family name from the
75
+ * `name` table, or `'CustomFont'` when unavailable.
76
+ */
77
+ readonly fontName?: string;
78
+ /** Output module format. Defaults to `'esm'`. */
79
+ readonly format?: 'esm' | 'cjs';
80
+ }
81
+ /** Options for {@link parseFontData}. */
82
+ interface ParseFontDataOptions {
83
+ /** Override the derived font name (sanitised to `[A-Za-z0-9-]`). */
84
+ readonly fontName?: string;
85
+ }
86
+ /**
87
+ * Parse a TrueType/OpenType font from an in-memory byte buffer into a
88
+ * registerable {@link FontDataObject} whose shape matches the runtime exports
89
+ * of a bundled `*-data.js` module.
90
+ *
91
+ * @param buffer - Raw `.ttf` / `.otf` bytes.
92
+ * @param opts - Optional overrides (`fontName`).
93
+ * @throws If the buffer is not a valid TrueType/OpenType font or lacks a usable
94
+ * `cmap` subtable (format 4 or 12).
95
+ */
96
+ declare function parseFontData(buffer: Uint8Array, opts?: ParseFontDataOptions): FontDataObject;
97
+ /**
98
+ * Compile a TrueType/OpenType font from an in-memory byte buffer into an
99
+ * ES-module (default) or CommonJS-module source string, identical to what the
100
+ * `pdfnative-build-font` CLI writes to disk (ESM output is byte-identical when
101
+ * the same `fontName` is supplied).
102
+ *
103
+ * @param buffer - Raw `.ttf` / `.otf` bytes.
104
+ * @param opts - Optional `fontName` and `format` (`'esm'` | `'cjs'`).
105
+ * @returns The module source code as a string, ready to write to a `.js` file.
106
+ * @throws If the buffer is not a valid TrueType/OpenType font.
107
+ */
108
+ declare function compileFontData(buffer: Uint8Array, opts?: CompileFontDataOptions): string;
109
+
110
+ export { type CompileFontDataOptions, type CompiledFontMetrics, type FontDataObject, type ParseFontDataOptions, compileFontData, parseFontData };