@hidemikimura/receipt-html-to-pdf 0.3.0 → 0.4.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/font/parse.js", "../src/font/registry.js", "../src/renderer.js", "../src/units.js", "../src/font/gsub.js", "../src/walker/text.js", "../src/walker/image.js", "../src/walker/gradient.js", "../src/walker/svg-path.js", "../src/walker/walk.js", "../src/pdf/compress.js", "../src/pdf/writer.js", "../src/pdf/content.js", "../src/font/subset.js", "../src/font/cid.js", "../src/pdf/image.js", "../src/paginate.js", "../src/pdf/shading.js", "../src/page.js", "../src/pacer.js", "../src/index.js"],
4
- "sourcesContent": ["// @ts-check\n/**\n * TrueType (sfnt / glyf \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3) \u30D5\u30A9\u30F3\u30C8\u306E\u6700\u5C0F\u30D1\u30FC\u30B5\u30FC\u3002\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3068 PDF \u57CB\u3081\u8FBC\u307F\u306B\u5FC5\u8981\u306A\u30C6\u30FC\u30D6\u30EB\u3060\u3051\u3092\u8AAD\u3080\u3002\n */\n\n/**\n * @typedef {object} ParsedFont\n * @property {Uint8Array} data\n * @property {Map<string, {offset: number, length: number}>} tables\n * @property {number} unitsPerEm\n * @property {number} indexToLocFormat\n * @property {[number, number, number, number]} bbox xMin yMin xMax yMax (font units)\n * @property {number} ascender hhea\n * @property {number} descender hhea\uFF08\u8CA0\u5024\uFF09\n * @property {number} lineGap\n * @property {number} numGlyphs\n * @property {Uint16Array} advances \u30B0\u30EA\u30D5\u3054\u3068\u306E advance width (font units)\n * @property {Uint32Array} loca numGlyphs + 1 \u8981\u7D20\n * @property {Map<number, number>} cmap \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8 \u2192 GID\n * @property {number} capHeight OS/2 sCapHeight\uFF08\u306A\u3051\u308C\u3070 ascender * 0.7\uFF09\n * @property {number} italicAngle\n * @property {boolean} useTypoMetrics OS/2 fsSelection bit 7\n * @property {number} typoAscender\n * @property {number} typoDescender\n * @property {number} winAscent\n * @property {number} winDescent\n * @property {string} postScriptName\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {boolean} variable fvar \u30C6\u30FC\u30D6\u30EB\u3092\u6301\u3064\u53EF\u5909\u30D5\u30A9\u30F3\u30C8\u304B\n */\n\n/**\n * @param {ArrayBuffer|Uint8Array} buffer\n * @returns {ParsedFont}\n */\nexport function parseFont(buffer) {\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n const tag = dv.getUint32(0);\n if (tag === 0x4f54544f /* 'OTTO' */) {\n throw new Error('CFF outlines (OpenType/CFF) are not supported. Use a TrueType (glyf) font.');\n }\n if (tag === 0x774f4646 /* 'wOFF' */ || tag === 0x774f4632 /* 'wOF2' */) {\n throw new Error('WOFF/WOFF2 are not supported. Use a raw .ttf file.');\n }\n if (tag === 0x74746366 /* 'ttcf' */) {\n throw new Error('TrueType collections (.ttc) are not supported. Extract a single face first.');\n }\n if (tag !== 0x00010000 && tag !== 0x74727565 /* 'true' */) {\n throw new Error('Not a TrueType font (bad sfnt version)');\n }\n\n const numTables = dv.getUint16(4);\n /** @type {Map<string, {offset: number, length: number}>} */\n const tables = new Map();\n for (let i = 0; i < numTables; i++) {\n const p = 12 + i * 16;\n const name = String.fromCharCode(data[p] ?? 0, data[p + 1] ?? 0, data[p + 2] ?? 0, data[p + 3] ?? 0);\n tables.set(name, { offset: dv.getUint32(p + 8), length: dv.getUint32(p + 12) });\n }\n if (tables.has('CFF ')) throw new Error('CFF outlines are not supported. Use a TrueType (glyf) font.');\n // \u53EF\u5909\u30D5\u30A9\u30F3\u30C8: glyf \u306B\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u306E\u307F\u5165\u3063\u3066\u3044\u308B\u3002\u547C\u3073\u51FA\u3057\u5074\u304C\u8B66\u544A\u3067\u304D\u308B\u3088\u3046\u30D5\u30E9\u30B0\u3092\u7ACB\u3066\u308B\u3002\n const variable = tables.has('fvar');\n for (const req of ['head', 'hhea', 'maxp', 'hmtx', 'loca', 'glyf']) {\n if (!tables.has(req)) throw new Error(`Font is missing required table: ${req}`);\n }\n\n const t = (/** @type {string} */ name) => /** @type {{offset: number, length: number}} */ (tables.get(name));\n\n // head\n const head = t('head');\n const unitsPerEm = dv.getUint16(head.offset + 18);\n const bbox = /** @type {[number, number, number, number]} */ ([\n dv.getInt16(head.offset + 36),\n dv.getInt16(head.offset + 38),\n dv.getInt16(head.offset + 40),\n dv.getInt16(head.offset + 42),\n ]);\n const macStyle = dv.getUint16(head.offset + 44);\n const indexToLocFormat = dv.getInt16(head.offset + 50);\n\n // hhea\n const hhea = t('hhea');\n const ascender = dv.getInt16(hhea.offset + 4);\n const descender = dv.getInt16(hhea.offset + 6);\n const lineGap = dv.getInt16(hhea.offset + 8);\n const numberOfHMetrics = dv.getUint16(hhea.offset + 34);\n\n // maxp\n const numGlyphs = dv.getUint16(t('maxp').offset + 4);\n\n // hmtx\n const hmtx = t('hmtx');\n const advances = new Uint16Array(numGlyphs);\n let lastAdvance = 0;\n for (let g = 0; g < numGlyphs; g++) {\n if (g < numberOfHMetrics) lastAdvance = dv.getUint16(hmtx.offset + g * 4);\n advances[g] = lastAdvance;\n }\n\n // loca\n const locaT = t('loca');\n const loca = new Uint32Array(numGlyphs + 1);\n for (let g = 0; g <= numGlyphs; g++) {\n loca[g] = indexToLocFormat === 0 ? dv.getUint16(locaT.offset + g * 2) * 2 : dv.getUint32(locaT.offset + g * 4);\n }\n\n // cmap\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u51FA\u529B\u306B\u306F\u542B\u307E\u308C\u306A\u3044\u305F\u3081\u7701\u7565\u53EF\u3002\u7121\u3051\u308C\u3070\u7A7A\uFF09\n const cmapT = tables.get('cmap');\n const cmap = cmapT ? parseCmap(dv, cmapT.offset) : new Map();\n\n // OS/2 (optional)\n let capHeight = Math.round(ascender * 0.7);\n let useTypoMetrics = false;\n let typoAscender = ascender;\n let typoDescender = descender;\n let winAscent = ascender;\n let winDescent = -descender;\n let bold = (macStyle & 1) !== 0;\n let italic = (macStyle & 2) !== 0;\n const os2 = tables.get('OS/2');\n if (os2) {\n const version = dv.getUint16(os2.offset);\n const fsSelection = dv.getUint16(os2.offset + 62);\n useTypoMetrics = (fsSelection & (1 << 7)) !== 0;\n bold = bold || (fsSelection & (1 << 5)) !== 0;\n italic = italic || (fsSelection & 1) !== 0;\n typoAscender = dv.getInt16(os2.offset + 68);\n typoDescender = dv.getInt16(os2.offset + 70);\n winAscent = dv.getUint16(os2.offset + 74);\n winDescent = dv.getUint16(os2.offset + 76);\n if (version >= 2 && os2.length >= 90) {\n const ch = dv.getInt16(os2.offset + 88);\n if (ch > 0) capHeight = ch;\n }\n }\n\n // post (optional) \u2014 italicAngle\n let italicAngle = 0;\n const post = tables.get('post');\n if (post) italicAngle = dv.getInt32(post.offset + 4) / 65536;\n\n const postScriptName = parsePostScriptName(dv, data, tables.get('name')) ?? 'Embedded';\n\n return {\n data,\n tables,\n unitsPerEm,\n indexToLocFormat,\n bbox,\n ascender,\n descender,\n lineGap,\n numGlyphs,\n advances,\n loca,\n cmap,\n capHeight,\n italicAngle,\n useTypoMetrics,\n typoAscender,\n typoDescender,\n winAscent,\n winDescent,\n postScriptName,\n bold,\n italic,\n variable,\n };\n}\n\n/**\n * cmap \u30C6\u30FC\u30D6\u30EB\u304B\u3089 Unicode \u30B5\u30D6\u30C6\u30FC\u30D6\u30EB\uFF08format 12 \u512A\u5148\u3001\u306A\u3051\u308C\u3070 4\uFF09\u3092\u8AAD\u3080\u3002\n * @param {DataView} dv\n * @param {number} base\n * @returns {Map<number, number>}\n */\nfunction parseCmap(dv, base) {\n const n = dv.getUint16(base + 2);\n let best = -1;\n let bestScore = -1;\n for (let i = 0; i < n; i++) {\n const p = base + 4 + i * 8;\n const platform = dv.getUint16(p);\n const encoding = dv.getUint16(p + 2);\n const offset = dv.getUint32(p + 4);\n const format = dv.getUint16(base + offset);\n let score = -1;\n if (platform === 3 && encoding === 10 && format === 12) score = 4;\n else if (platform === 0 && (encoding === 4 || encoding === 6) && format === 12) score = 3;\n else if (platform === 3 && encoding === 1 && format === 4) score = 2;\n else if (platform === 0 && format === 4) score = 1;\n if (score > bestScore) {\n bestScore = score;\n best = base + offset;\n }\n }\n if (best < 0) throw new Error('Font has no usable Unicode cmap subtable (format 4 or 12)');\n\n /** @type {Map<number, number>} */\n const map = new Map();\n const format = dv.getUint16(best);\n if (format === 4) {\n const segCountX2 = dv.getUint16(best + 6);\n const segCount = segCountX2 / 2;\n const endP = best + 14;\n const startP = endP + segCountX2 + 2;\n const deltaP = startP + segCountX2;\n const rangeP = deltaP + segCountX2;\n for (let s = 0; s < segCount; s++) {\n const end = dv.getUint16(endP + s * 2);\n const start = dv.getUint16(startP + s * 2);\n const delta = dv.getInt16(deltaP + s * 2);\n const rangeOffset = dv.getUint16(rangeP + s * 2);\n if (start === 0xffff) continue;\n for (let c = start; c <= end; c++) {\n let gid;\n if (rangeOffset === 0) {\n gid = (c + delta) & 0xffff;\n } else {\n const gp = rangeP + s * 2 + rangeOffset + (c - start) * 2;\n if (gp + 2 > dv.byteLength) continue;\n gid = dv.getUint16(gp);\n if (gid !== 0) gid = (gid + delta) & 0xffff;\n }\n if (gid !== 0) map.set(c, gid);\n }\n }\n } else if (format === 12) {\n const nGroups = dv.getUint32(best + 12);\n let p = best + 16;\n for (let i = 0; i < nGroups; i++, p += 12) {\n const start = dv.getUint32(p);\n const end = dv.getUint32(p + 4);\n const startGid = dv.getUint32(p + 8);\n for (let c = start; c <= end && c - start < 0x10000; c++) {\n const gid = startGid + (c - start);\n if (gid !== 0) map.set(c, gid);\n }\n }\n }\n return map;\n}\n\n/**\n * name \u30C6\u30FC\u30D6\u30EB\u304B\u3089 PostScript \u540D (nameID 6) \u3092\u53D6\u308A\u51FA\u3059\u3002\n * @param {DataView} dv\n * @param {Uint8Array} data\n * @param {{offset: number, length: number}|undefined} nameT\n * @returns {string|null}\n */\nfunction parsePostScriptName(dv, data, nameT) {\n if (!nameT) return null;\n const count = dv.getUint16(nameT.offset + 2);\n const stringOffset = dv.getUint16(nameT.offset + 4);\n let fallback = null;\n for (let i = 0; i < count; i++) {\n const p = nameT.offset + 6 + i * 12;\n const platform = dv.getUint16(p);\n const nameId = dv.getUint16(p + 6);\n const length = dv.getUint16(p + 8);\n const offset = dv.getUint16(p + 10);\n if (nameId !== 6) continue;\n const start = nameT.offset + stringOffset + offset;\n if (platform === 1) {\n // Macintosh Roman: ASCII \u3068\u307F\u306A\u3059\n return sanitizePsName(String.fromCharCode(...data.subarray(start, start + length)));\n }\n if (platform === 3 || platform === 0) {\n let s = '';\n for (let j = 0; j + 1 < length; j += 2) s += String.fromCharCode(dv.getUint16(start + j));\n fallback = sanitizePsName(s);\n }\n }\n return fallback;\n}\n\n/** @param {string} s */\nfunction sanitizePsName(s) {\n return s.replace(/[^\\x21-\\x7e]/g, '').replace(/[\\[\\]\\(\\)\\{\\}<>\\/%#]/g, '') || 'Embedded';\n}\n\n/**\n * \u30B0\u30EA\u30D5\u306E\u751F\u30D0\u30A4\u30C8\u5217\u3092\u8FD4\u3059\uFF08\u7A7A\u30B0\u30EA\u30D5\u306F\u9577\u3055 0\uFF09\u3002\n * @param {ParsedFont} font\n * @param {number} gid\n * @returns {Uint8Array}\n */\nexport function glyphData(font, gid) {\n const glyf = /** @type {{offset: number, length: number}} */ (font.tables.get('glyf'));\n const start = font.loca[gid] ?? 0;\n const end = font.loca[gid + 1] ?? start;\n return font.data.subarray(glyf.offset + start, glyf.offset + end);\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u8FD4\u3059\uFF08\u5358\u7D14\u30B0\u30EA\u30D5\u306A\u3089\u7A7A\uFF09\u3002\n * @param {Uint8Array} g\n * @returns {number[]}\n */\nexport function componentGids(g) {\n if (g.length < 10) return [];\n const dv = new DataView(g.buffer, g.byteOffset, g.byteLength);\n const numberOfContours = dv.getInt16(0);\n if (numberOfContours >= 0) return [];\n /** @type {number[]} */\n const out = [];\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const glyphIndex = dv.getUint16(p + 2);\n out.push(glyphIndex);\n p += 4;\n p += flags & 0x0001 /* ARG_1_AND_2_ARE_WORDS */ ? 4 : 2;\n if (flags & 0x0008 /* WE_HAVE_A_SCALE */) p += 2;\n else if (flags & 0x0040 /* WE_HAVE_AN_X_AND_Y_SCALE */) p += 4;\n else if (flags & 0x0080 /* WE_HAVE_A_TWO_BY_TWO */) p += 8;\n if (!(flags & 0x0020 /* MORE_COMPONENTS */)) break;\n if (p >= g.length) break;\n }\n return out;\n}\n\n/**\n * \u30D6\u30E9\u30A6\u30B6\u304C\u884C\u30DC\u30C3\u30AF\u30B9\u8A08\u7B97\u306B\u4F7F\u3046\u30A2\u30BB\u30F3\u30C8\uFF0F\u30C7\u30A3\u30BB\u30F3\u30C8\u306B\u8FD1\u3044\u5024\uFF08font units\uFF09\u3092\u8FD4\u3059\u3002\n * Chrome/Firefox \u306F OS/2 USE_TYPO_METRICS \u304C\u7ACB\u3063\u3066\u3044\u308C\u3070 typo\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 hhea \u3092\u4F7F\u3046\u3002\n * @param {ParsedFont} font\n * @returns {{ascent: number, descent: number}} descent \u306F\u6B63\u5024\n */\nexport function browserMetrics(font) {\n if (font.useTypoMetrics) return { ascent: font.typoAscender, descent: -font.typoDescender };\n return { ascent: font.ascender, descent: -font.descender };\n}\n", "// @ts-check\n/**\n * \u767B\u9332\u30D5\u30A9\u30F3\u30C8\u306E\u7BA1\u7406\u3068 CSS font-family / font-weight / font-style \u304B\u3089\u306E\u30D5\u30A9\u30F3\u30C8\u9078\u629E\u3002\n */\nimport { parseFont } from './parse.js';\n\n/**\n * @typedef {object} RegisteredFont\n * @property {string} family \u6B63\u898F\u5316\u6E08\u307F\uFF08\u5C0F\u6587\u5B57\u30FB\u5F15\u7528\u7B26\u306A\u3057\uFF09\n * @property {string} displayFamily\n * @property {number} weight\n * @property {'normal'|'italic'} style\n * @property {import('./parse.js').ParsedFont} parsed\n */\n\nexport class FontRegistry {\n constructor() {\n /** @type {RegisteredFont[]} */\n this.fonts = [];\n }\n\n /**\n * @param {import('../index.js').FontSource} source\n * @returns {Promise<RegisteredFont>}\n */\n async register(source) {\n const bytes = await loadBytes(source.src);\n const parsed = parseFont(bytes);\n const entry = {\n family: normalizeFamily(source.family),\n displayFamily: source.family,\n weight: source.weight ?? 400,\n style: source.style ?? 'normal',\n parsed,\n };\n const idx = this.fonts.findIndex(\n (f) => f.family === entry.family && f.weight === entry.weight && f.style === entry.style,\n );\n if (idx >= 0) this.fonts[idx] = entry;\n else this.fonts.push(entry);\n return entry;\n }\n\n /** @param {string} family */\n hasFamily(family) {\n const n = normalizeFamily(family);\n return this.fonts.some((f) => f.family === n);\n }\n\n /**\n * CSS \u306E\u6307\u5B9A\u306B\u6700\u3082\u8FD1\u3044\u767B\u9332\u30D5\u30A9\u30F3\u30C8\u3092\u8FD4\u3059\u3002\n * @param {string[]} families font-family \u30EA\u30B9\u30C8\uFF08\u512A\u5148\u9806\uFF09\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @param {number} [codePoint] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u30D5\u30A9\u30F3\u30C8\u306B\u9650\u5B9A\u3059\u308B\n * @returns {RegisteredFont|null}\n */\n match(families, weight, style, codePoint) {\n for (const fam of families) {\n const n = normalizeFamily(fam);\n let candidates = this.fonts.filter((f) => f.family === n);\n if (codePoint !== undefined) candidates = candidates.filter((f) => f.parsed.cmap.has(codePoint));\n if (!candidates.length) continue;\n return pickFace(candidates, weight, style);\n }\n return null;\n }\n\n /**\n * \u767B\u9332\u6E08\u307F\u306E\u5168\u30D5\u30A1\u30DF\u30EA\u30FC\u306E\u4E2D\u304B\u3089\u3001\u6307\u5B9A\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u3082\u306E\u3092\u63A2\u3059\uFF08\u6700\u7D42\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF09\u3002\n * @param {number} codePoint\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont|null}\n */\n anyWithGlyph(codePoint, weight, style) {\n const candidates = this.fonts.filter((f) => f.parsed.cmap.has(codePoint));\n return candidates.length ? pickFace(candidates, weight, style) : null;\n }\n}\n\n/**\n * CSS Fonts Level 4 \u306E\u30D5\u30A9\u30F3\u30C8\u30DE\u30C3\u30C1\u30F3\u30B0\u3092\u7C21\u7565\u5316\u3057\u305F\u3082\u306E\u3002\n * 1. style \u304C\u4E00\u81F4\u3059\u308B\u3082\u306E\u3092\u512A\u5148\uFF08\u306A\u3051\u308C\u3070\u7121\u8996\uFF09\n * 2. weight: 400 \u306F 500 \u3092\u5148\u306B\u898B\u308B\u3002400\u301C500 \u306F\u4E0A\u2192\u4E0B\u3001<400 \u306F\u4E0B\u2192\u4E0A\u3001>500 \u306F\u4E0A\u2192\u4E0B\u3002\n * @param {RegisteredFont[]} candidates\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont}\n */\nfunction pickFace(candidates, weight, style) {\n const styled = candidates.filter((f) => f.style === style);\n const pool = styled.length ? styled : candidates;\n const exact = pool.find((f) => f.weight === weight);\n if (exact) return exact;\n\n const sorted = [...pool].sort((a, b) => a.weight - b.weight);\n const heavier = sorted.filter((f) => f.weight > weight);\n const lighter = sorted.filter((f) => f.weight < weight).reverse();\n\n if (weight >= 400 && weight <= 500) {\n const mid = heavier.find((f) => f.weight <= 500);\n if (mid) return mid;\n if (lighter.length) return /** @type {RegisteredFont} */ (lighter[0]);\n return /** @type {RegisteredFont} */ (heavier[0]);\n }\n if (weight < 400) {\n return /** @type {RegisteredFont} */ (lighter[0] ?? heavier[0]);\n }\n return /** @type {RegisteredFont} */ (heavier[0] ?? lighter[0]);\n}\n\n/**\n * @param {string} family\n * @returns {string}\n */\nexport function normalizeFamily(family) {\n return family.trim().replace(/^[\"']|[\"']$/g, '').trim().toLowerCase();\n}\n\n/**\n * getComputedStyle().fontFamily\uFF08'\"BIZ UDPGothic\", sans-serif'\uFF09\u3092\u30EA\u30B9\u30C8\u306B\u5206\u5272\u3059\u308B\u3002\n * @param {string} value\n * @returns {string[]}\n */\nexport function splitFamilies(value) {\n /** @type {string[]} */\n const out = [];\n let cur = '';\n let quote = '';\n for (const ch of value) {\n if (quote) {\n if (ch === quote) quote = '';\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === ',') {\n if (cur.trim()) out.push(cur.trim());\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\n/**\n * getComputedStyle().fontWeight\uFF08'400' / '700' / 'bold'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function parseWeight(value) {\n if (value === 'bold') return 700;\n if (value === 'normal') return 400;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : 400;\n}\n\n/**\n * @param {string|ArrayBuffer|Uint8Array} src\n * @returns {Promise<Uint8Array>}\n */\nasync function loadBytes(src) {\n if (src instanceof Uint8Array) return src;\n if (src instanceof ArrayBuffer) return new Uint8Array(src);\n const res = await fetch(src);\n if (!res.ok) throw new Error(`Failed to fetch font ${src}: ${res.status} ${res.statusText}`);\n return new Uint8Array(await res.arrayBuffer());\n}\n", "// @ts-check\n/**\n * \u975E\u8868\u793A iframe \u306B HTML \u3092\u63CF\u753B\u3057\u3001\u30EC\u30A4\u30A2\u30A6\u30C8\u8A08\u6E2C\u53EF\u80FD\u306A Document \u3092\u7528\u610F\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} RenderedDocument\n * @property {HTMLIFrameElement} iframe\n * @property {Document} doc\n * @property {Window} win\n * @property {HTMLElement} root \u8D70\u67FB\u306E\u8D77\u70B9\uFF08body\uFF09\n * @property {() => void} destroy\n */\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{widthPx: number, stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {Promise<RenderedDocument>}\n */\nexport async function renderDocument(input, opts) {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.cssText = `position:fixed;left:-100000px;top:0;width:${opts.widthPx}px;height:1000px;border:0;visibility:hidden;pointer-events:none;`;\n document.body.appendChild(iframe);\n\n const win = iframe.contentWindow;\n const doc = iframe.contentDocument;\n if (!win || !doc) throw new Error('Failed to create rendering iframe');\n\n const html = buildHtml(input, opts);\n doc.open();\n doc.write(html);\n doc.close();\n\n // \u5BA3\u8A00\u7684\u30B7\u30E3\u30C9\u30A6 DOM \u3067\u5FA9\u5143\u3057\u305F\u8981\u7D20\u306F\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3055\u308C\u306A\u3044\u305F\u3081 :defined \u304C\u30DE\u30C3\u30C1\u3057\u306A\u3044\u3002\n // \u4E2D\u8EAB\u306E\u7121\u3044\u30B9\u30BF\u30D6\u3092\u5B9A\u7FA9\u3057\u3066\u30DE\u30C3\u30C1\u3055\u305B\u308B\uFF08\u63CF\u753B\u306B\u306F\u5F71\u97FF\u3057\u306A\u3044\uFF09\u3002\n defineStubElements(doc, win);\n\n // \u9AD8\u3055\u3092\u5185\u5BB9\u306B\u5408\u308F\u305B\u308B\uFF08\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u767A\u751F\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B\uFF09\n const fit = () => {\n iframe.style.height = `${Math.max(doc.documentElement.scrollHeight, doc.body.scrollHeight, 100)}px`;\n };\n fit();\n\n await waitForStylesheets(doc);\n fit();\n await waitForFonts(doc);\n await waitForImages(doc);\n materializePseudoElements(doc, opts.warn ?? (() => {}));\n fit();\n // \u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u78BA\u5B9A\u3055\u305B\u308B\n void doc.body.offsetHeight;\n warnIfTooWide(doc, opts.widthPx, opts.warn ?? (() => {}));\n\n return {\n iframe,\n doc,\n win,\n root: doc.body,\n destroy: () => iframe.remove(),\n };\n}\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {string}\n */\nfunction buildHtml(input, opts) {\n const baseUrl = opts.baseUrl ?? document.baseURI;\n const base = `<base href=\"${escapeAttr(baseUrl)}\">`;\n // \u89AA\u6587\u66F8\u306E body \u30DE\u30FC\u30B8\u30F3\u304C PDF \u306B\u6301\u3061\u8FBC\u307E\u308C\u308B\u3068\u5185\u5BB9\u304C\u53F3\u3078\u305A\u308C\u3066\u53F3\u7AEF\u304C\u5207\u308C\u308B\u306E\u3067\u3001\n // !important \u3067\u78BA\u5B9F\u306B\u6253\u3061\u6D88\u3059\uFF08\u7528\u7D19\u306E\u4F59\u767D\u306F options.page.margin \u304C\u53D7\u3051\u6301\u3064\uFF09\u3002\n const reset = `<style data-rhtp-reset>html,body{margin:0 !important;padding:0 !important;background:transparent}html{-webkit-text-size-adjust:100%}</style>`;\n\n if (typeof input === 'string') {\n // \u5B8C\u5168\u306A HTML \u6587\u66F8\u306A\u3089\u305D\u306E\u307E\u307E\u3002<head> \u306E\u76F4\u5F8C\u306B base \u3068\u30EA\u30BB\u30C3\u30C8\u3092\u5DEE\u3057\u8FBC\u3080\u3002\n if (/<html[\\s>]/i.test(input)) {\n let html = input;\n html = /<head[^>]*>/i.test(html)\n ? html.replace(/<head[^>]*>/i, (m) => `${m}${base}${reset}`)\n : html.replace(/<html[^>]*>/i, (m) => `${m}<head>${base}${reset}</head>`);\n return opts.mediaPrint ? expandPrintMedia(html) : html;\n }\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint);\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body>${input}</body></html>`;\n }\n\n // \u8981\u7D20: outerHTML \u3068\u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u6301\u3061\u8FBC\u3080\u3002\n // <html> / <body> \u306E\u5C5E\u6027\uFF08class, lang, data-* \u2026\uFF09\u3082\u5199\u3057\u3001`body.reissue .x` \u306E\u3088\u3046\u306A\u7956\u5148\u4F9D\u5B58\u306E\u30BB\u30EC\u30AF\u30BF\u3092\u52B9\u304B\u305B\u308B\u3002\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint) + shadowHostStyles(input, opts.stylesheets, opts.mediaPrint);\n const htmlAttrs = copyAttrs(document.documentElement);\n const bodyAttrs = copyAttrs(document.body);\n const body = serializeElement(input, opts.warn ?? (() => {}));\n return `<!DOCTYPE html><html${htmlAttrs}><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body${bodyAttrs}>${body}</body></html>`;\n}\n\n/**\n * @param {'inherit'|'none'|string[]} stylesheets\n * @param {boolean} mediaPrint\n * @returns {string}\n */\nfunction collectStyles(stylesheets, mediaPrint) {\n if (stylesheets === 'none') return '';\n /** @type {string[]} */\n const parts = [];\n if (stylesheets === 'inherit') {\n for (const el of document.querySelectorAll('style, link[rel~=\"stylesheet\"]')) {\n if (el.hasAttribute('data-rhtp-reset')) continue;\n if (el instanceof HTMLStyleElement) {\n const css = el.textContent ?? '';\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(css) : css}</style>`);\n } else if (el instanceof HTMLLinkElement) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(el.href)}\"${el.media ? ` media=\"${escapeAttr(el.media)}\"` : ''}>`);\n }\n }\n // document.adoptedStyleSheets\uFF08CSSOM \u3067\u7D44\u307F\u7ACB\u3066\u305F\u30B9\u30BF\u30A4\u30EB\uFF09\u306F <style> \u306B\u51FA\u3066\u3053\u306A\u3044\u306E\u3067\u53D6\u308A\u51FA\u3059\n const adopted = cssTextOf(document.adoptedStyleSheets);\n if (adopted) parts.push(`<style>${mediaPrint ? expandPrintMediaCss(adopted) : adopted}</style>`);\n return parts.join('');\n }\n for (const s of stylesheets) {\n if (/^(https?:)?\\/\\/|^\\.{0,2}\\/|\\.css(\\?|$)/i.test(s) && !s.includes('{')) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(s)}\">`);\n } else {\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(s) : s}</style>`);\n }\n }\n return parts.join('');\n}\n\n/**\n * \u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u306E\u8981\u7D20\u3092\u6E21\u3055\u308C\u305F\u3068\u304D\u3001\u305D\u306E\u8981\u7D20\u304C\u5C5E\u3059\u308B\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\n * \uFF08\u304A\u3088\u3073\u305D\u306E\u5916\u5074\u306E\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\uFF09\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u53D6\u308A\u51FA\u3059\u3002\n * \u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u306F\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306B\u5C4A\u304B\u306A\u3044\u305F\u3081\u3001`stylesheets: 'inherit'` \u3067\u306F\u62FE\u3048\u306A\u3044\u3002\n *\n * @param {Element} input\n * @param {'inherit'|'none'|string[]} stylesheets\n * @param {boolean} mediaPrint\n * @returns {string}\n */\nfunction shadowHostStyles(input, stylesheets, mediaPrint) {\n if (stylesheets !== 'inherit') return '';\n /** @type {string[]} */\n const parts = [];\n let node = /** @type {Node|null} */ (input.getRootNode());\n // \u5185\u5074\u306E\u30C4\u30EA\u30FC\u304B\u3089\u9806\u306B\u96C6\u3081\u3001\u5916\u5074\u307B\u3069\u5148\uFF08\u512A\u5148\u5EA6\u304C\u4F4E\u3044\u4F4D\u7F6E\uFF09\u306B\u7F6E\u304F\n while (node && node !== document && 'host' in node) {\n const root = /** @type {ShadowRoot} */ (node);\n const css = [...root.querySelectorAll('style')].map((el) => el.textContent ?? '').join('\\n') + '\\n' + cssTextOf(root.adoptedStyleSheets);\n if (css.trim()) parts.unshift(css);\n node = root.host.getRootNode();\n }\n return parts.map((css) => `<style>${mediaPrint ? expandPrintMediaCss(css) : css}</style>`).join('');\n}\n\n/**\n * \u5185\u5BB9\u304C\u672C\u6587\u9818\u57DF\u3088\u308A\u6A2A\u306B\u5E83\u3044\u3068\u3001\u53F3\u5074\u304C\u5207\u308C\u305F\u307E\u307E\u6C17\u3065\u304B\u308C\u306B\u304F\u3044\u306E\u3067\u8B66\u544A\u3059\u308B\u3002\n * \u56FA\u5B9A\u5E45 + `box-sizing: content-box` \u3084\u3001\u7573\u3081\u306A\u3044\u8868\u304C\u539F\u56E0\u306B\u306A\u308A\u3084\u3059\u3044\u3002\n *\n * @param {Document} doc\n * @param {number} widthPx \u672C\u6587\u9818\u57DF\u306E\u5E45\uFF08px\uFF09\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n */\nfunction warnIfTooWide(doc, widthPx, warn) {\n const width = Math.max(doc.documentElement.scrollWidth, doc.body.scrollWidth);\n const over = width - widthPx;\n // 1px \u672A\u6E80\u306F\u4E38\u3081\u8AA4\u5DEE\u3068\u307F\u306A\u3059\n if (over < 1) return;\n const mm = (/** @type {number} */ px) => Math.round((px / 96) * 25.4 * 10) / 10;\n warn({\n code: 'other',\n message:\n `Content is ${Math.round(over)}px (${mm(over)}mm) wider than the page content area ` +\n `(${Math.round(width)}px vs ${Math.round(widthPx)}px); the right side will be clipped. ` +\n 'Common causes: a fixed width plus padding/border without box-sizing: border-box, or a table that cannot shrink.',\n });\n}\n\n/** \u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3092\u6301\u3066\u306A\u3044\u8981\u7D20\uFF08void \u8981\u7D20\uFF09\u3002outerHTML \u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3002 */\nconst VOID_TAGS = new Set(['AREA', 'BASE', 'BR', 'COL', 'EMBED', 'HR', 'IMG', 'INPUT', 'LINK', 'META', 'SOURCE', 'TRACK', 'WBR']);\n\n/**\n * \u8981\u7D20\u3092 outerHTML \u76F8\u5F53\u306E\u6587\u5B57\u5217\u306B\u3059\u308B\u3002\u958B\u3044\u3066\u3044\u308B\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306F\n * `<template shadowrootmode>`\uFF08\u5BA3\u8A00\u7684\u30B7\u30E3\u30C9\u30A6 DOM\uFF09\u3068\u3057\u3066\u4E00\u7DD2\u306B\u76F4\u5217\u5316\u3057\u3001\n * iframe \u5074\u306E\u30D1\u30FC\u30B5\u306B\u672C\u7269\u306E ShadowRoot \u3068\u3057\u3066\u5FA9\u5143\u3055\u305B\u308B\u3002\n *\n * `adoptedStyleSheets` \u306F\u76F4\u5217\u5316\u3055\u308C\u306A\u3044\u306E\u3067\u3001\u4E00\u6642\u7684\u306B `<style>` \u3068\u3057\u3066\u5DEE\u3057\u8FBC\u3093\u3067\u304B\u3089\u76F4\u5217\u5316\u3059\u308B\n * \uFF08\u540C\u671F\u51E6\u7406\u306E\u3046\u3061\u306B\u5143\u3078\u623B\u3059\u306E\u3067\u753B\u9762\u306B\u306F\u5F71\u97FF\u3057\u306A\u3044\uFF09\u3002\n *\n * @param {Element} input\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n * @returns {string}\n */\nfunction serializeElement(input, warn) {\n const whole = input === document.body || input === document.documentElement;\n const roots = collectShadowRoots(whole ? document.body : input);\n if (!roots.length) return whole ? document.body.innerHTML : input.outerHTML;\n\n const host = whole ? document.body : input;\n if (typeof (/** @type {any} */ (host).getHTML) !== 'function') {\n warn({\n code: 'unsupported-css',\n message:\n 'This browser lacks Element.getHTML(); shadow DOM content cannot be serialized and will be missing from the PDF. ' +\n 'Pass an element inside the shadow root instead.',\n element: input,\n });\n return whole ? document.body.innerHTML : input.outerHTML;\n }\n\n const restore = inlineAdoptedStyleSheets(roots);\n try {\n const opts = { serializableShadowRoots: true, shadowRoots: roots };\n const inner = /** @type {string} */ (/** @type {any} */ (host).getHTML(opts));\n if (whole) return inner;\n const tag = input.tagName.toLowerCase();\n // void \u8981\u7D20\u306F\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3082\u5B50\u3082\u6301\u305F\u306A\u3044\u306E\u3067\u901A\u5E38\u306E outerHTML \u3067\u3088\u3044\n if (VOID_TAGS.has(input.tagName)) return input.outerHTML;\n return `<${tag}${copyAttrs(input)}>${inner}</${tag}>`;\n } finally {\n restore();\n }\n}\n\n/**\n * root \u4EE5\u4E0B\uFF08\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u3082\u542B\u3080\uFF09\u306E open \u306A\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3092\u96C6\u3081\u308B\u3002\n * closed \u306A\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306F\u53C2\u7167\u3067\u304D\u306A\u3044\u305F\u3081\u5BFE\u8C61\u5916\u3002\n * @param {Element|ShadowRoot} root\n * @returns {ShadowRoot[]}\n */\nfunction collectShadowRoots(root) {\n /** @type {ShadowRoot[]} */\n const out = [];\n /** @param {Element|ShadowRoot} node */\n const walk = (node) => {\n if (node instanceof Element && node.shadowRoot) {\n out.push(node.shadowRoot);\n walk(node.shadowRoot);\n }\n for (const child of node.children) walk(child);\n };\n walk(root);\n return out;\n}\n\n/**\n * \u5404\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306E adoptedStyleSheets \u3092\u4E00\u6642\u7684\u306B `<style>` \u3068\u3057\u3066\u5DEE\u3057\u8FBC\u3080\u3002\n * \u623B\u308A\u5024\u3092\u547C\u3076\u3068\u53D6\u308A\u9664\u304F\u3002\n * @param {ShadowRoot[]} roots\n * @returns {() => void}\n */\nfunction inlineAdoptedStyleSheets(roots) {\n /** @type {HTMLStyleElement[]} */\n const added = [];\n for (const root of roots) {\n const css = cssTextOf(root.adoptedStyleSheets);\n if (!css) continue;\n const style = document.createElement('style');\n style.setAttribute('data-rhtp-adopted', '');\n style.textContent = css;\n root.insertBefore(style, root.firstChild);\n added.push(style);\n }\n return () => {\n for (const style of added) style.remove();\n };\n}\n\n/**\n * CSSStyleSheet \u306E\u914D\u5217\u3092 CSS \u30C6\u30AD\u30B9\u30C8\u306B\u3059\u308B\u3002\u8AAD\u3081\u306A\u3044\u3082\u306E\uFF08\u30AF\u30ED\u30B9\u30AA\u30EA\u30B8\u30F3\uFF09\u306F\u98DB\u3070\u3059\u3002\n * @param {readonly CSSStyleSheet[]|undefined} sheets\n * @returns {string}\n */\nfunction cssTextOf(sheets) {\n if (!sheets || !sheets.length) return '';\n const parts = [];\n for (const sheet of sheets) {\n try {\n for (const rule of sheet.cssRules) parts.push(rule.cssText);\n } catch {\n // \u30AF\u30ED\u30B9\u30AA\u30EA\u30B8\u30F3\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u306F\u8AAD\u3081\u306A\u3044\n }\n }\n return parts.join('\\n');\n}\n\n/**\n * iframe \u5185\u306B\u3001\u6587\u66F8\u306B\u51FA\u3066\u304F\u308B\u30AB\u30B9\u30BF\u30E0\u8981\u7D20\u540D\u306E\u7A7A\u306E\u30B9\u30BF\u30D6\u3092\u5B9A\u7FA9\u3059\u308B\u3002\n * \u3053\u308C\u3092\u3057\u306A\u3044\u3068\u8981\u7D20\u304C\u672A\u5B9A\u7FA9\u306E\u307E\u307E\u3067 `:defined` \u304C\u30DE\u30C3\u30C1\u305B\u305A\u3001\u65E2\u5B9A\u306E `display: inline` \u3067\u7D44\u307E\u308C\u3066\u3057\u307E\u3046\u3002\n * @param {Document} doc\n * @param {Window} win\n */\nfunction defineStubElements(doc, win) {\n const registry = /** @type {CustomElementRegistry|undefined} */ (/** @type {any} */ (win).customElements);\n const Base = /** @type {typeof HTMLElement|undefined} */ (/** @type {any} */ (win).HTMLElement);\n if (!registry || !Base) return;\n /** @type {Set<string>} */\n const names = new Set();\n /** @param {ParentNode} node */\n const scan = (node) => {\n for (const el of node.querySelectorAll('*')) {\n // `is=` \u306B\u3088\u308B\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u30C9\u7D44\u307F\u8FBC\u307F\u8981\u7D20\u306F\u5BFE\u8C61\u5916\uFF08\u5B9A\u7FA9\u306B extends \u304C\u5FC5\u8981\u306A\u305F\u3081\uFF09\n if (el.tagName.includes('-') && !el.hasAttribute('is')) names.add(el.tagName.toLowerCase());\n if (el.shadowRoot) scan(el.shadowRoot);\n }\n };\n scan(doc);\n for (const name of names) {\n if (registry.get(name)) continue;\n try {\n registry.define(name, class extends Base {});\n } catch {\n // \u4E0D\u6B63\u306A\u540D\u524D\u306A\u3069\u306F\u7121\u8996\u3059\u308B\n }\n }\n}\n\n/**\n * HTML \u6587\u5B57\u5217\u4E2D\u306E <style> \u5185\u306E @media print \u3092\u5C55\u958B\u3059\u308B\u3002\n * @param {string} html\n */\nfunction expandPrintMedia(html) {\n return html.replace(/<style([^>]*)>([\\s\\S]*?)<\\/style>/gi, (_m, attrs, css) => `<style${attrs}>${expandPrintMediaCss(css)}</style>`);\n}\n\n/**\n * `@media print { ... }` \u30D6\u30ED\u30C3\u30AF\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u5C55\u958B\u3057\u3001`@media screen { ... }` \u3092\u9664\u53BB\u3059\u308B\u3002\n * \u5358\u7D14\u306A\u62EC\u5F27\u306E\u5BFE\u5FDC\u3067\u51E6\u7406\u3059\u308B\uFF08\u30CD\u30B9\u30C8\u3057\u305F @media \u306F\u60F3\u5B9A\u3057\u306A\u3044\uFF09\u3002\n * @param {string} css\n * @returns {string}\n */\nexport function expandPrintMediaCss(css) {\n let out = '';\n let i = 0;\n while (i < css.length) {\n const m = /@media\\s*([^{]+)\\{/g;\n m.lastIndex = i;\n const hit = m.exec(css);\n if (!hit) {\n out += css.slice(i);\n break;\n }\n out += css.slice(i, hit.index);\n // \u30D6\u30ED\u30C3\u30AF\u306E\u7D42\u308F\u308A\u3092\u63A2\u3059\n let depth = 1;\n let j = m.lastIndex;\n while (j < css.length && depth > 0) {\n if (css[j] === '{') depth++;\n else if (css[j] === '}') depth--;\n j++;\n }\n const query = /** @type {string} */ (hit[1]).trim();\n const body = css.slice(m.lastIndex, j - 1);\n if (/\\bprint\\b/.test(query)) out += body;\n else if (/^\\s*(only\\s+)?screen\\b/.test(query) && !/\\band\\b/.test(query)) out += '';\n else out += css.slice(hit.index, j);\n i = j;\n }\n return out;\n}\n\n/**\n * \u8981\u7D20\u306E\u5C5E\u6027\u3092 ` name=\"value\"` \u306E\u4E26\u3073\u306B\u3059\u308B\uFF08\u30A4\u30D9\u30F3\u30C8\u30CF\u30F3\u30C9\u30E9\u5C5E\u6027\u306F\u9664\u304F\uFF09\u3002\n * @param {Element} el\n */\nfunction copyAttrs(el) {\n let out = '';\n for (const a of el.attributes) {\n if (/^on/i.test(a.name)) continue;\n out += ` ${a.name}=\"${escapeAttr(a.value)}\"`;\n }\n return out;\n}\n\n/** @param {string} s */\nfunction escapeAttr(s) {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n}\n\n/** @param {Document} doc */\nasync function waitForStylesheets(doc) {\n const links = [...doc.querySelectorAll('link[rel~=\"stylesheet\"]')];\n await Promise.all(\n links.map(\n (l) =>\n new Promise((resolve) => {\n const link = /** @type {HTMLLinkElement} */ (l);\n if (link.sheet) return resolve(undefined);\n link.addEventListener('load', () => resolve(undefined), { once: true });\n link.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/** @param {Document} doc */\nasync function waitForFonts(doc) {\n // \u4F7F\u7528\u4E2D\u306E\u30D5\u30A9\u30F3\u30C8\u8AAD\u307F\u8FBC\u307F\u3092\u8D77\u52D5\u3055\u305B\u308B\u305F\u3081\u306B\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u5F37\u5236\n void doc.body.offsetHeight;\n if (doc.fonts) {\n await doc.fonts.ready;\n // ready \u5F8C\u306B\u65B0\u305F\u306B\u8AAD\u307F\u8FBC\u307F\u304C\u59CB\u307E\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001loading \u72B6\u614B\u306E\u3082\u306E\u3092\u5F85\u3064\n const loading = [...doc.fonts].filter((f) => f.status === 'loading').map((f) => f.loaded.catch(() => undefined));\n if (loading.length) await Promise.all(loading);\n await doc.fonts.ready;\n }\n}\n\n/** @param {Document} doc */\nasync function waitForImages(doc) {\n const imgs = [...doc.images];\n await Promise.all(\n imgs.map((img) =>\n img.complete\n ? img.decode().catch(() => undefined)\n : new Promise((resolve) => {\n img.addEventListener('load', () => img.decode().catch(() => undefined).then(resolve), { once: true });\n img.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/**\n * ::before / ::after \u3092\u5B9F\u4F53\u306E <span> \u306B\u7F6E\u304D\u63DB\u3048\u308B\u3002\n * \u64EC\u4F3C\u8981\u7D20\u306F DOM \u30CE\u30FC\u30C9\u3092\u6301\u305F\u305A Range \u3067\u8A08\u6E2C\u3067\u304D\u306A\u3044\u305F\u3081\u3001computed style \u3092\u3059\u3079\u3066\u5199\u3057\u305F span \u3092\n * \u540C\u3058\u4F4D\u7F6E\u306B\u633F\u5165\u3057\u3001\u5143\u306E\u64EC\u4F3C\u8981\u7D20\u306F content: none \u3067\u6D88\u3059\u3002\u6587\u5B57\u5217 content \u306E\u307F\u5BFE\u5FDC\uFF08counter / url \u306F\u8B66\u544A\uFF09\u3002\n * @param {Document} doc\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n */\nexport function materializePseudoElements(doc, warn) {\n const win = doc.defaultView;\n if (!win) return;\n /** @type {{el: Element, pseudo: 'before'|'after', text: string, styles: [string, string][]}[]} */\n const jobs = [];\n for (const el of deepQueryAll(doc.body)) {\n for (const pseudo of /** @type {('before'|'after')[]} */ (['before', 'after'])) {\n const ps = win.getComputedStyle(el, `::${pseudo}`);\n const content = ps.content;\n if (!content || content === 'none' || content === 'normal' || ps.display === 'none') continue;\n const text = parseContentString(content);\n if (text === null) {\n warn({\n code: 'unsupported-css',\n message: `::${pseudo} content \"${content}\" is not supported (only quoted strings are); the pseudo-element is skipped`,\n element: el,\n property: 'content',\n });\n continue;\n }\n /** @type {[string, string][]} */\n const styles = [];\n for (let i = 0; i < ps.length; i++) {\n const prop = /** @type {string} */ (ps[i]);\n if (prop === 'content' || prop.startsWith('-webkit-') || prop.startsWith('-moz-')) continue;\n styles.push([prop, ps.getPropertyValue(prop)]);\n }\n jobs.push({ el, pseudo, text, styles });\n }\n }\n if (!jobs.length) return;\n\n const disableCss =\n '[data-rhtp-pseudo-host~=\"before\"]::before{content:none!important;display:none!important}' +\n '[data-rhtp-pseudo-host~=\"after\"]::after{content:none!important;display:none!important}';\n const style = doc.createElement('style');\n style.setAttribute('data-rhtp-pseudo', '');\n style.textContent = disableCss;\n doc.head.appendChild(style);\n // \u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u306F\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306B\u5C4A\u304B\u306A\u3044\u306E\u3067\u3001\u5BFE\u8C61\u3092\u542B\u3080\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306B\u3082\u540C\u3058\u898F\u5247\u3092\u5165\u308C\u308B\n for (const root of new Set(jobs.map((j) => j.el.getRootNode()).filter((r) => r !== doc))) {\n const inner = doc.createElement('style');\n inner.setAttribute('data-rhtp-pseudo', '');\n inner.textContent = disableCss;\n /** @type {ShadowRoot} */ (root).appendChild(inner);\n }\n\n for (const job of jobs) {\n const span = doc.createElement('span');\n span.setAttribute('data-rhtp-pseudo', job.pseudo);\n for (const [prop, value] of job.styles) span.style.setProperty(prop, value);\n span.textContent = job.text;\n const hosts = (job.el.getAttribute('data-rhtp-pseudo-host') ?? '').split(' ').filter(Boolean);\n hosts.push(job.pseudo);\n job.el.setAttribute('data-rhtp-pseudo-host', hosts.join(' '));\n if (job.pseudo === 'before') job.el.insertBefore(span, job.el.firstChild);\n else job.el.appendChild(span);\n }\n}\n\n/**\n * root \u4EE5\u4E0B\u306E\u3059\u3079\u3066\u306E\u8981\u7D20\u3092\u3001\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u3082\u542B\u3081\u3066\u5217\u6319\u3059\u308B\u3002\n * @param {Element|ShadowRoot} root\n * @returns {Element[]}\n */\nfunction deepQueryAll(root) {\n /** @type {Element[]} */\n const out = [];\n /** @param {Element|ShadowRoot} node */\n const walk = (node) => {\n for (const el of node.querySelectorAll('*')) {\n out.push(el);\n if (el.shadowRoot) walk(el.shadowRoot);\n }\n };\n walk(root);\n return out;\n}\n\n/**\n * computed content \u5024\uFF08'\"\u203B \"' / '\"a\" \"b\"' / 'counter(x)' \u2026\uFF09\u304B\u3089\u6587\u5B57\u5217\u3092\u53D6\u308A\u51FA\u3059\u3002\n * \u6587\u5B57\u5217\u4EE5\u5916\u306E\u30C8\u30FC\u30AF\u30F3\u304C\u542B\u307E\u308C\u308B\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseContentString(value) {\n let out = '';\n let i = 0;\n const v = value.trim();\n while (i < v.length) {\n const ch = v[i];\n if (ch === ' ' || ch === '\\t') {\n i++;\n continue;\n }\n if (ch !== '\"' && ch !== \"'\") return null;\n const quote = ch;\n i++;\n while (i < v.length && v[i] !== quote) {\n if (v[i] === '\\\\') {\n i++;\n const hex = /^[0-9a-fA-F]{1,6}/.exec(v.slice(i));\n if (hex) {\n out += String.fromCodePoint(parseInt(hex[0], 16));\n i += hex[0].length;\n if (v[i] === ' ') i++;\n } else {\n out += v[i] ?? '';\n i++;\n }\n } else {\n out += v[i];\n i++;\n }\n }\n i++; // closing quote\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u5358\u4F4D\u30FB\u8272\u306E\u5909\u63DB\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u3002\n * \u5185\u90E8\u5EA7\u6A19\u306F CSS px\uFF08\u30D6\u30E9\u30A6\u30B6\u8A08\u6E2C\u5024\uFF09\u3067\u6301\u3061\u3001PDF \u51FA\u529B\u6642\u306B pt \u3078\u5909\u63DB\u3059\u308B\u3002\n */\n\n/** 1 CSS px = 0.75 pt\uFF0896dpi \u57FA\u6E96\uFF09 */\nexport const PX_TO_PT = 0.75;\n/** 1 mm = 72 / 25.4 pt */\nexport const MM_TO_PT = 72 / 25.4;\n\n/** @type {Record<string, {width: number, height: number}>} \u7528\u7D19\u30B5\u30A4\u30BA\uFF08pt\uFF09 */\nexport const PAGE_SIZES = {\n A3: { width: 297 * MM_TO_PT, height: 420 * MM_TO_PT },\n A4: { width: 210 * MM_TO_PT, height: 297 * MM_TO_PT },\n A5: { width: 148 * MM_TO_PT, height: 210 * MM_TO_PT },\n B4: { width: 257 * MM_TO_PT, height: 364 * MM_TO_PT },\n B5: { width: 182 * MM_TO_PT, height: 257 * MM_TO_PT },\n Letter: { width: 612, height: 792 },\n Legal: { width: 612, height: 1008 },\n};\n\n/**\n * CSS \u9577\u3055\u6587\u5B57\u5217\uFF08'15mm', '1in', '12pt', '100px', '2cm'\uFF09\u3092 pt \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u5358\u4F4D\u306A\u3057\u306E\u6570\u5024\u306F px \u3068\u307F\u306A\u3059\u3002\n * @param {string|number} value\n * @returns {number}\n */\nexport function lengthToPt(value) {\n if (typeof value === 'number') return value * PX_TO_PT;\n const m = /^\\s*(-?[\\d.]+)\\s*([a-z%]*)\\s*$/i.exec(value);\n if (!m) throw new Error(`Invalid CSS length: ${value}`);\n const n = parseFloat(/** @type {string} */ (m[1]));\n switch ((m[2] ?? '').toLowerCase()) {\n case '':\n case 'px':\n return n * PX_TO_PT;\n case 'pt':\n return n;\n case 'mm':\n return n * MM_TO_PT;\n case 'cm':\n return n * MM_TO_PT * 10;\n case 'in':\n return n * 72;\n case 'pc':\n return n * 12;\n default:\n throw new Error(`Unsupported CSS unit: ${value}`);\n }\n}\n\n/** @param {number} pt @returns {number} */\nexport function ptToPx(pt) {\n return pt / PX_TO_PT;\n}\n\n/**\n * getComputedStyle \u304C\u8FD4\u3059 px \u6587\u5B57\u5217\uFF08'12px'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function cssPx(value) {\n const n = parseFloat(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * @typedef {{r: number, g: number, b: number, a: number}} Rgba \u5404\u6210\u5206 0\u301C1\n */\n\n/**\n * getComputedStyle \u306E\u8272\u6587\u5B57\u5217\uFF08'rgb(34, 34, 34)' / 'rgba(0, 0, 0, 0.5)' / 'transparent'\n * / 'color(srgb ...)'\uFF09\u3092\u30D1\u30FC\u30B9\u3059\u308B\u3002\u30D1\u30FC\u30B9\u3067\u304D\u306A\u3044\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {Rgba|null}\n */\nexport function parseColor(value) {\n if (!value) return null;\n const v = value.trim();\n if (v === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n let m = /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1])) / 255),\n g: clamp01(parseFloat(/** @type {string} */ (m[2])) / 255),\n b: clamp01(parseFloat(/** @type {string} */ (m[3])) / 255),\n a: clamp01(a),\n };\n }\n m = /^color\\(srgb\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*(?:\\/\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1]))),\n g: clamp01(parseFloat(/** @type {string} */ (m[2]))),\n b: clamp01(parseFloat(/** @type {string} */ (m[3]))),\n a: clamp01(a),\n };\n }\n m = /^#([0-9a-f]{3,8})$/i.exec(v);\n if (m) {\n let h = /** @type {string} */ (m[1]);\n if (h.length === 3 || h.length === 4) h = h.split('').map((c) => c + c).join('');\n const n = parseInt(h.padEnd(8, 'f'), 16);\n return { r: ((n >>> 24) & 255) / 255, g: ((n >>> 16) & 255) / 255, b: ((n >>> 8) & 255) / 255, a: (n & 255) / 255 };\n }\n return null;\n}\n\n/** @param {number} n */\nfunction clamp01(n) {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * PDF \u7528\u306B\u6570\u5024\u3092\u4E38\u3081\u3066\u6587\u5B57\u5217\u5316\u3059\u308B\uFF08\u5C0F\u6570\u7B2C 3 \u4F4D\u307E\u3067\u3001\u672B\u5C3E\u30BC\u30ED\u9664\u53BB\uFF09\u3002\n * @param {number} n\n * @returns {string}\n */\nexport function num(n) {\n if (!Number.isFinite(n)) return '0';\n const s = n.toFixed(3);\n const t = s.includes('.') ? s.replace(/\\.?0+$/, '') : s;\n return t === '' || t === '-0' || t === '-' ? '0' : t;\n}\n", "// @ts-check\n/**\n * GSUB\uFF08\u30B0\u30EA\u30D5\u7F6E\u63DB\uFF09\u306E\u5358\u4E00\u7F6E\u63DB\u3060\u3051\u3092\u8AAD\u3080\u3002\n *\n * \u30D6\u30E9\u30A6\u30B6\u304C `font-variant-*` / `font-feature-settings` \u3067\u6709\u52B9\u306B\u3057\u305F\u6A5F\u80FD\u3092\u3001\n * \u540C\u3058\u7D50\u679C\u306B\u306A\u308B\u3088\u3046\u306B gid \u2192 gid \u306E\u7F6E\u63DB\u3068\u3057\u3066\u518D\u73FE\u3059\u308B\u3002\n * \u7F6E\u63DB\u306F\u57CB\u3081\u8FBC\u307F\u524D\u306B\u89E3\u6C7A\u3059\u308B\u306E\u3067\u3001PDF \u306B GSUB \u30C6\u30FC\u30D6\u30EB\u81EA\u4F53\u306F\u5165\u3089\u306A\u3044\u3002\n *\n * \u5BFE\u5FDC\u3059\u308B\u306E\u306F Lookup \u30BF\u30A4\u30D7 1\uFF08\u5358\u4E00\u7F6E\u63DB\u3001\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 1 / 2\uFF09\u3068\u3001\n * \u305D\u308C\u3092\u5305\u3080\u30BF\u30A4\u30D7 7\uFF08\u62E1\u5F35\uFF09\u3060\u3051\u3002\u30BF\u30A4\u30D7 4\uFF08\u5408\u5B57\uFF09\u306F\u30B0\u30EA\u30D5\u6570\u304C\u5909\u308F\u308B\u305F\u3081\u3001\n * 1 \u6587\u5B57\u305A\u3064\u4F4D\u7F6E\u3092\u5B9F\u6E2C\u3059\u308B\u8D70\u67FB\u30E2\u30C7\u30EB\u3067\u306F\u6271\u3048\u306A\u3044\u3002\n */\n\n/**\n * @typedef {object} GsubTable\n * @property {Map<string, number[]>} features \u6A5F\u80FD\u30BF\u30B0 \u2192 Lookup \u756A\u53F7\n * @property {(index: number) => Map<number, number>|null} lookup \u5358\u4E00\u7F6E\u63DB\u306E Lookup \u3092\u8AAD\u3080\uFF08\u5BFE\u5FDC\u5916\u306A\u3089 null\uFF09\n */\n\n/**\n * GSUB \u3092\u8AAD\u3080\u3002\u7121\u3044\u30FB\u58CA\u308C\u3066\u3044\u308B\u5834\u5408\u306F null\u3002\n * @param {import('./parse.js').ParsedFont} font\n * @returns {GsubTable|null}\n */\nexport function parseGsub(font) {\n const t = font.tables.get('GSUB');\n if (!t || t.length < 10) return null;\n const dv = new DataView(font.data.buffer, font.data.byteOffset, font.data.byteLength);\n const base = t.offset;\n try {\n const featureListOff = base + dv.getUint16(base + 6);\n const lookupListOff = base + dv.getUint16(base + 8);\n\n /** @type {Map<string, number[]>} */\n const features = new Map();\n const featureCount = dv.getUint16(featureListOff);\n for (let i = 0; i < featureCount; i++) {\n const rec = featureListOff + 2 + i * 6;\n const tag = String.fromCharCode(dv.getUint8(rec), dv.getUint8(rec + 1), dv.getUint8(rec + 2), dv.getUint8(rec + 3));\n const featureOff = featureListOff + dv.getUint16(rec + 4);\n const count = dv.getUint16(featureOff + 2);\n const list = features.get(tag) ?? [];\n for (let j = 0; j < count; j++) list.push(dv.getUint16(featureOff + 4 + j * 2));\n features.set(tag, list);\n }\n\n const lookupCount = dv.getUint16(lookupListOff);\n /** @type {Map<number, Map<number, number>|null>} */\n const cache = new Map();\n /** @param {number} index */\n const lookup = (index) => {\n if (cache.has(index)) return /** @type {Map<number, number>|null} */ (cache.get(index) ?? null);\n let result = null;\n if (index >= 0 && index < lookupCount) {\n const off = lookupListOff + dv.getUint16(lookupListOff + 2 + index * 2);\n result = readLookup(dv, off, dv.getUint16(off), dv.getUint16(off + 4), off + 6);\n }\n cache.set(index, result);\n return result;\n };\n\n return { features, lookup };\n } catch {\n return null; // \u58CA\u308C\u305F GSUB \u306F\u7121\u3044\u3082\u306E\u3068\u3057\u3066\u6271\u3046\n }\n}\n\n/**\n * @param {DataView} dv\n * @param {number} lookupOff\n * @param {number} type\n * @param {number} subTableCount\n * @param {number} offsetsAt \u30B5\u30D6\u30C6\u30FC\u30D6\u30EB\u30AA\u30D5\u30BB\u30C3\u30C8\u914D\u5217\u306E\u4F4D\u7F6E\n * @returns {Map<number, number>|null}\n */\nfunction readLookup(dv, lookupOff, type, subTableCount, offsetsAt) {\n if (type !== 1 && type !== 7) return null;\n /** @type {Map<number, number>} */\n const map = new Map();\n for (let i = 0; i < subTableCount; i++) {\n let sub = lookupOff + dv.getUint16(offsetsAt + i * 2);\n if (type === 7) {\n // \u62E1\u5F35: \u5B9F\u4F53\u306E\u578B\u3068\u30AA\u30D5\u30BB\u30C3\u30C8\u3092\u8AAD\u307F\u76F4\u3059\n if (dv.getUint16(sub) !== 1) continue;\n if (dv.getUint16(sub + 2) !== 1) continue; // \u5358\u4E00\u7F6E\u63DB\u4EE5\u5916\u306F\u5BFE\u8C61\u5916\n sub += dv.getUint32(sub + 4);\n }\n readSingleSubst(dv, sub, map);\n }\n return map.size ? map : null;\n}\n\n/**\n * SingleSubst\uFF08\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 1 / 2\uFF09\u3092 map \u306B\u8AAD\u307F\u8FBC\u3080\u3002\n * @param {DataView} dv\n * @param {number} off\n * @param {Map<number, number>} map\n */\nfunction readSingleSubst(dv, off, map) {\n const format = dv.getUint16(off);\n const coverage = readCoverage(dv, off + dv.getUint16(off + 2));\n if (format === 1) {\n const delta = dv.getInt16(off + 4);\n for (const gid of coverage) map.set(gid, (gid + delta) & 0xffff);\n } else if (format === 2) {\n const count = dv.getUint16(off + 4);\n for (let i = 0; i < coverage.length && i < count; i++) {\n map.set(/** @type {number} */ (coverage[i]), dv.getUint16(off + 6 + i * 2));\n }\n }\n}\n\n/**\n * Coverage \u30C6\u30FC\u30D6\u30EB\u3092\u3001\u30AB\u30D0\u30EC\u30C3\u30B8\u756A\u53F7\u9806\u306E\u30B0\u30EA\u30D5\u914D\u5217\u3068\u3057\u3066\u8AAD\u3080\u3002\n * @param {DataView} dv\n * @param {number} off\n * @returns {number[]}\n */\nfunction readCoverage(dv, off) {\n const format = dv.getUint16(off);\n /** @type {number[]} */\n const out = [];\n if (format === 1) {\n const count = dv.getUint16(off + 2);\n for (let i = 0; i < count; i++) out.push(dv.getUint16(off + 4 + i * 2));\n } else if (format === 2) {\n const count = dv.getUint16(off + 2);\n for (let i = 0; i < count; i++) {\n const rec = off + 4 + i * 6;\n const start = dv.getUint16(rec);\n const end = dv.getUint16(rec + 2);\n const startIndex = dv.getUint16(rec + 4);\n for (let g = start; g <= end; g++) out[startIndex + (g - start)] = g;\n }\n }\n return out;\n}\n\n/**\n * \u6A5F\u80FD\u30BF\u30B0\u306E\u96C6\u5408\u304B\u3089\u7F6E\u63DB\u95A2\u6570\u3092\u4F5C\u308B\u3002Lookup \u756A\u53F7\u306E\u5C0F\u3055\u3044\u9806\u306B\u9069\u7528\u3059\u308B\u3002\n * @param {import('./parse.js').ParsedFont} font\n * @param {string[]} tags\n * @returns {((gid: number) => number)|null} \u7F6E\u63DB\u304C 1 \u3064\u3082\u7121\u3051\u308C\u3070 null\n */\nexport function buildSubstitution(font, tags) {\n const gsub = parseGsub(font);\n if (!gsub) return null;\n /** @type {number[]} */\n const indices = [];\n for (const tag of tags) for (const i of gsub.features.get(tag) ?? []) if (!indices.includes(i)) indices.push(i);\n if (!indices.length) return null;\n indices.sort((a, b) => a - b);\n /** @type {Map<number, number>[]} */\n const maps = [];\n for (const i of indices) {\n const m = gsub.lookup(i);\n if (m) maps.push(m);\n }\n if (!maps.length) return null;\n /** @type {Map<number, number>} */\n const memo = new Map();\n return (gid) => {\n const hit = memo.get(gid);\n if (hit !== undefined) return hit;\n let g = gid;\n for (const m of maps) g = m.get(g) ?? g;\n memo.set(gid, g);\n return g;\n };\n}\n\n/** CSS \u306E\u30AD\u30FC\u30EF\u30FC\u30C9 \u2192 OpenType \u306E\u6A5F\u80FD\u30BF\u30B0 */\nconst VARIANT_TAGS = /** @type {Record<string, string>} */ ({\n // font-variant-numeric\n 'lining-nums': 'lnum',\n 'oldstyle-nums': 'onum',\n 'proportional-nums': 'pnum',\n 'tabular-nums': 'tnum',\n 'diagonal-fractions': 'frac',\n 'stacked-fractions': 'afrc',\n ordinal: 'ordn',\n 'slashed-zero': 'zero',\n // font-variant-caps\n 'small-caps': 'smcp',\n 'all-small-caps': 'c2sc',\n 'petite-caps': 'pcap',\n 'all-petite-caps': 'c2pc',\n unicase: 'unic',\n 'titling-caps': 'titl',\n // font-variant-east-asian\n jis78: 'jp78',\n jis83: 'jp83',\n jis90: 'jp90',\n jis04: 'jp04',\n simplified: 'smpl',\n traditional: 'trad',\n 'full-width': 'fwid',\n 'proportional-width': 'pwid',\n ruby: 'ruby',\n});\n\n/**\n * computed style \u304B\u3089\u3001\u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u3066\u3044\u308B\u6A5F\u80FD\u30BF\u30B0\u3092\u96C6\u3081\u308B\u3002\n * \u65E2\u5B9A\u3067\u6709\u52B9\u306A\u6A5F\u80FD\uFF08ccmp / liga / calt\uFF09\u306F\u542B\u3081\u306A\u3044\uFF08\u5408\u5B57\u306F\u6271\u3048\u306A\u3044\u305F\u3081\uFF09\u3002\n *\n * @param {CSSStyleDeclaration} style\n * @returns {string[]}\n */\nexport function featureTagsOf(style) {\n /** @type {Set<string>} */\n const tags = new Set();\n const words = `${style.fontVariantNumeric ?? ''} ${style.fontVariantCaps ?? ''} ${style.fontVariantEastAsian ?? ''}`.split(/\\s+/);\n for (const w of words) {\n const tag = VARIANT_TAGS[w];\n if (tag) tags.add(tag);\n }\n // font-feature-settings: \"zero\" 1, \"jp90\"\n const ffs = style.fontFeatureSettings ?? '';\n if (ffs && ffs !== 'normal') {\n for (const part of ffs.split(',')) {\n const m = /^\\s*[\"']([A-Za-z0-9]{4})[\"']\\s*(.*)$/.exec(part);\n if (!m) continue;\n const value = /** @type {string} */ (m[2]).trim();\n if (value === '0' || value === 'off') continue;\n tags.add(/** @type {string} */ (m[1]));\n }\n }\n return [...tags];\n}\n", "// @ts-check\n/**\n * \u30C6\u30AD\u30B9\u30C8\u30CE\u30FC\u30C9\u306E\u8A08\u6E2C\u3002\n * Range \u3092 1 \u6587\u5B57\u305A\u3064\u5F35\u3063\u3066\u5404\u30B0\u30EA\u30D5\u306E\u77E9\u5F62\u3092\u5B9F\u6E2C\u3057\u3001\u884C\u3054\u3068\u306B\u30B0\u30EA\u30D5\u5217\uFF08GID\u30FB\u30DA\u30F3\u4F4D\u7F6E\uFF09\u3092\u8FD4\u3059\u3002\n * \u30D6\u30E9\u30A6\u30B6\u306E\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u7981\u5247\u30FB\u4E21\u7AEF\u63C3\u3048\u306E\u7D50\u679C\u304C\u305D\u306E\u307E\u307E\u4F4D\u7F6E\u306B\u53CD\u6620\u3055\u308C\u308B\u3002\n */\nimport { buildSubstitution } from '../font/gsub.js';\n\n/**\n * @typedef {object} MeasuredLine\n * @property {import('../font/registry.js').RegisteredFont} font\n * @property {number} baseline \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y\uFF08\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u5EA7\u6A19 px\uFF09\n * @property {number} top \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0A\u7AEF\n * @property {number} bottom \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0B\u7AEF\n * @property {import('./walk.js').Glyph[]} glyphs\n */\n\n/**\n * @typedef {object} MeasureOptions\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} families\n * @property {string[]} fallback\n * @property {import('../font/registry.js').RegisteredFont} primary\n * @property {number} weight\n * @property {'normal'|'italic'} fstyle\n * @property {number} size px\n * @property {'font'|'measure'|'auto'} textMeasure\n * @property {string[]} features \u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u3066\u3044\u308B OpenType \u6A5F\u80FD\u30BF\u30B0\uFF08GSUB \u306E\u5358\u4E00\u7F6E\u63DB\u3092\u518D\u73FE\u3059\u308B\uFF09\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {Element} element\n */\n\nconst WHITESPACE = new Set([0x20, 0x09, 0x0a, 0x0d, 0x0c, 0xa0, 0x3000, 0x2002, 0x2003, 0x2009, 0x200a, 0x202f, 0x205f]);\n\n/**\n * @param {Text} node\n * @param {CSSStyleDeclaration} style\n * @param {MeasureOptions} o\n * @returns {MeasuredLine[]}\n */\nexport function measureText(node, style, o) {\n const doc = node.ownerDocument;\n const text = applyTextTransform(node.data, style.textTransform);\n const range = doc.createRange();\n const baselineOffset = probeBaseline(doc, style);\n\n /** @type {MeasuredLine[]} */\n const lines = [];\n /** @type {MeasuredLine|null} */\n let cur = null;\n let curTop = NaN;\n /** @type {Set<number>} */\n const warnedCps = new Set();\n\n for (let i = 0; i < text.length; ) {\n const cp = /** @type {number} */ (text.codePointAt(i));\n const len = cp > 0xffff ? 2 : 1;\n const end = i + len;\n\n range.setStart(node, i);\n range.setEnd(node, Math.min(end, node.data.length));\n const rect = pickRect(range.getClientRects());\n i = end;\n if (!rect) continue; // \u6298\u308A\u7573\u307E\u308C\u305F\u7A7A\u767D\u30FB\u6539\u884C\n\n const resolved = resolveGlyph(cp, o, warnedCps);\n if (!resolved) continue;\n const { font, gid, cpForUnicode } = resolved;\n\n const top = rect.top;\n if (!cur || cur.font !== font || Math.abs(top - curTop) > 0.5) {\n cur = { font, baseline: top + baselineOffset, top, bottom: rect.bottom, glyphs: [] };\n curTop = top;\n lines.push(cur);\n }\n cur.top = Math.min(cur.top, top);\n cur.bottom = Math.max(cur.bottom, rect.bottom);\n // GSUB\uFF08\u5358\u4E00\u7F6E\u63DB\uFF09: \u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u305F\u6A5F\u80FD\u3068\u540C\u3058\u7F6E\u63DB\u3092\u9069\u7528\u3059\u308B\n const subst = o.features.length ? substitutionFor(font.parsed, o.features) : null;\n const outGid = subst ? subst(gid) : gid;\n const advance = ((font.parsed.advances[outGid] ?? 0) * o.size) / font.parsed.unitsPerEm;\n cur.glyphs.push({ gid: outGid, cp: cpForUnicode, x: rect.left, advance });\n }\n return lines;\n}\n\n/** @type {WeakMap<import('../font/parse.js').ParsedFont, Map<string, ((gid: number) => number)|null>>} */\nconst substCache = new WeakMap();\n\n/**\n * (\u30D5\u30A9\u30F3\u30C8, \u6A5F\u80FD\u96C6\u5408) \u3054\u3068\u306E\u7F6E\u63DB\u95A2\u6570\u3002\u7D50\u679C\u306F null \u3082\u542B\u3081\u3066\u30AD\u30E3\u30C3\u30B7\u30E5\u3059\u308B\u3002\n * @param {import('../font/parse.js').ParsedFont} parsed\n * @param {string[]} features\n * @returns {((gid: number) => number)|null}\n */\nfunction substitutionFor(parsed, features) {\n let byKey = substCache.get(parsed);\n if (!byKey) {\n byKey = new Map();\n substCache.set(parsed, byKey);\n }\n const key = [...features].sort().join(',');\n if (byKey.has(key)) return byKey.get(key) ?? null;\n const fn = buildSubstitution(parsed, features);\n byKey.set(key, fn);\n return fn;\n}\n\n/**\n * 1 \u6587\u5B57\u5206\u306E\u77E9\u5F62\u306E\u3046\u3061\u5E45\u3092\u6301\u3064\u3082\u306E\u3092\u9078\u3076\u3002\u884C\u672B\u306E\u6298\u308A\u8FD4\u3057\u4F4D\u7F6E\u3067\u306F 2 \u3064\u8FD4\u308B\u3053\u3068\u304C\u3042\u308B\u3002\n * @param {DOMRectList} rects\n * @returns {DOMRect|null}\n */\nfunction pickRect(rects) {\n /** @type {DOMRect|null} */\n let best = null;\n for (const r of rects) {\n if (r.width > 0.01 && (!best || r.width > best.width)) best = r;\n }\n return best;\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u5BFE\u5FDC\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u3068 GID \u3092\u6C7A\u3081\u308B\u3002\n * @param {number} cp\n * @param {MeasureOptions} o\n * @param {Set<number>} warnedCps\n * @returns {{font: import('../font/registry.js').RegisteredFont, gid: number, cpForUnicode: number}|null}\n */\nfunction resolveGlyph(cp, o, warnedCps) {\n const tryFont = (/** @type {import('../font/registry.js').RegisteredFont|null} */ f, /** @type {number} */ c) => {\n const gid = f?.parsed.cmap.get(c);\n return f && gid ? { font: f, gid, cpForUnicode: cp } : null;\n };\n\n // \u7A7A\u767D\u985E: \u4E3B\u30D5\u30A9\u30F3\u30C8\u306E\u540C\u3058\u6587\u5B57 \u2192 U+0020 \u3067\u4EE3\u66FF\uFF08\u4F4D\u7F6E\u306F\u5B9F\u6E2C\u5024\u3067\u88DC\u6B63\u3055\u308C\u308B\u306E\u3067\u5E45\u306F\u554F\u308F\u306A\u3044\uFF09\n if (WHITESPACE.has(cp)) {\n return tryFont(o.primary, cp) ?? tryFont(o.primary, 0x20) ?? tryFont(o.registry.anyWithGlyph(0x20, o.weight, o.fstyle), 0x20);\n }\n\n let hit = tryFont(o.primary, cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.families, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.fallback, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.anyWithGlyph(cp, o.weight, o.fstyle), cp);\n if (hit) return hit;\n\n if (!warnedCps.has(cp)) {\n warnedCps.add(cp);\n o.warn({\n code: 'missing-glyph',\n message: `No registered font has a glyph for U+${cp.toString(16).toUpperCase().padStart(4, '0')} \"${String.fromCodePoint(cp)}\"; substituted with U+25A1`,\n element: o.element,\n text: String.fromCodePoint(cp),\n });\n }\n // \u8C46\u8150\uFF08\u25A1\uFF09\u3067\u4EE3\u66FF\u3002ToUnicode \u306B\u306F\u5143\u306E\u6587\u5B57\u3092\u6B8B\u3059\n const sub = tryFont(o.primary, 0x25a1) ?? tryFont(o.registry.anyWithGlyph(0x25a1, o.weight, o.fstyle), 0x25a1);\n return sub ? { ...sub, cpForUnicode: cp } : null;\n}\n\n/**\n * @param {string} s\n * @param {string} transform computed text-transform\n * @returns {string}\n */\nfunction applyTextTransform(s, transform) {\n if (!transform || transform === 'none') return s;\n let out = s;\n if (transform.includes('uppercase')) out = s.toUpperCase();\n else if (transform.includes('lowercase')) out = s.toLowerCase();\n else if (transform.includes('capitalize')) out = s.replace(/(^|\\s)(\\p{L})/gu, (m, sp, ch) => sp + ch.toUpperCase());\n // \u9577\u3055\u304C\u5909\u308F\u308B\u5909\u63DB\uFF08\u00DF \u2192 SS \u306A\u3069\uFF09\u306F Range \u306E\u30AA\u30D5\u30BB\u30C3\u30C8\u3068\u5BFE\u5FDC\u304C\u53D6\u308C\u306A\u3044\u306E\u3067\u8AE6\u3081\u308B\n return out.length === s.length ? out : s;\n}\n\n/** @type {WeakMap<Document, Map<string, number>>} */\nconst probeCache = new WeakMap();\n\n/**\n * \u3053\u306E font \u6307\u5B9A\u3067\u63CF\u3044\u305F\u30C6\u30AD\u30B9\u30C8\u306E Range \u77E9\u5F62\u306E\u4E0A\u7AEF\u304B\u3089\u3001\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u307E\u3067\u306E\u8DDD\u96E2\uFF08px\uFF09\u3092\u5B9F\u6E2C\u3059\u308B\u3002\n * inline-block\uFF08vertical-align: baseline\uFF09\u306E\u4E0B\u7AEF\u304C\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u4F4D\u7F6E\u306B\u4E00\u81F4\u3059\u308B\u3053\u3068\u3092\u5229\u7528\u3059\u308B\u3002\n * @param {Document} doc\n * @param {CSSStyleDeclaration} style\n * @returns {number}\n */\nfunction probeBaseline(doc, style) {\n const key = [style.fontFamily, style.fontSize, style.fontWeight, style.fontStyle, style.fontStretch, style.fontVariant, style.fontFeatureSettings].join('|');\n let cache = probeCache.get(doc);\n if (!cache) {\n cache = new Map();\n probeCache.set(doc, cache);\n }\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n\n const probe = doc.createElement('div');\n probe.setAttribute('data-rhtp-probe', '');\n probe.style.cssText = 'position:absolute;left:0;top:0;visibility:hidden;white-space:pre;line-height:normal;margin:0;padding:0;border:0;letter-spacing:0;text-indent:0;';\n probe.style.fontFamily = style.fontFamily;\n probe.style.fontSize = style.fontSize;\n probe.style.fontWeight = style.fontWeight;\n probe.style.fontStyle = style.fontStyle;\n probe.style.fontStretch = style.fontStretch;\n probe.style.fontVariant = style.fontVariant;\n probe.style.fontFeatureSettings = style.fontFeatureSettings;\n const textNode = doc.createTextNode('Ag\u3042');\n probe.appendChild(textNode);\n const mark = doc.createElement('span');\n mark.style.cssText = 'display:inline-block;width:0;height:0;vertical-align:baseline;margin:0;padding:0;border:0;';\n probe.appendChild(mark);\n doc.body.appendChild(probe);\n\n const range = doc.createRange();\n range.selectNodeContents(textNode);\n const textRect = range.getBoundingClientRect();\n const markRect = mark.getBoundingClientRect();\n const offset = markRect.bottom - textRect.top;\n probe.remove();\n\n const result = Number.isFinite(offset) && offset > 0 ? offset : parseFloat(style.fontSize) * 0.8;\n cache.set(key, result);\n return result;\n}\n", "// @ts-check\n/**\n * \u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u3068\u30C7\u30B3\u30FC\u30C9\u3002\n * - JPEG \u306F\u5143\u30D0\u30A4\u30C8\u5217\u3092\u305D\u306E\u307E\u307E DCTDecode \u3067\u57CB\u3081\u8FBC\u3080\uFF08\u518D\u5727\u7E2E\u3057\u306A\u3044\uFF09\n * - \u305D\u308C\u4EE5\u5916\uFF08PNG, GIF, WebP, SVG \u2026\uFF09\u306F <canvas> \u3067\u30C7\u30B3\u30FC\u30C9\u3057\u3066 RGB + \u30A2\u30EB\u30D5\u30A1\u306B\u5206\u96E2\u3059\u308B\n * \u540C\u3058 URL \u306F 1 \u56DE\u3060\u3051\u30C7\u30B3\u30FC\u30C9\u3057\u3001PDF \u4E0A\u3067\u3082 1 \u3064\u306E XObject \u3092\u5171\u6709\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} DecodedImage\n * @property {string} key \u91CD\u8907\u6392\u9664\u30AD\u30FC\uFF08URL\uFF09\n * @property {number} width \u30D4\u30AF\u30BB\u30EB\n * @property {number} height\n * @property {Uint8Array|null} jpeg JPEG \u306E\u751F\u30D0\u30A4\u30C8\u5217\uFF08DCTDecode\uFF09\n * @property {Uint8Array|null} rgb \u5E45\u00D7\u9AD8\u3055\u00D73\n * @property {Uint8Array|null} alpha \u5E45\u00D7\u9AD8\u3055\uFF08\u5B8C\u5168\u4E0D\u900F\u660E\u306A\u3089 null\uFF09\n */\n\n/** @type {Map<string, Promise<DecodedImage|null>>} */\nconst cache = new Map();\n\n/**\n * @param {string} url \u7D76\u5BFE URL\uFF08img.currentSrc \u307E\u305F\u306F background-image \u306E url()\uFF09\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nexport function loadImage(url, warn, element) {\n let p = cache.get(url);\n if (!p) {\n p = decode(url, warn, element).catch((e) => {\n warn({ code: 'image-failed', message: `Failed to load image ${url}: ${e instanceof Error ? e.message : String(e)}`, element });\n return null;\n });\n cache.set(url, p);\n }\n return p;\n}\n\n/**\n * @param {string} url\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nasync function decode(url, warn, element) {\n // 1. \u30D0\u30A4\u30C8\u5217\u3092\u53D6\u5F97\u3067\u304D\u308C\u3070 JPEG \u5224\u5B9A\n /** @type {Uint8Array|null} */\n let bytes = null;\n try {\n const res = await fetch(url, { mode: 'cors', credentials: 'same-origin' });\n if (res.ok) bytes = new Uint8Array(await res.arrayBuffer());\n } catch {\n bytes = null; // CORS \u7B49\u3067\u8AAD\u3081\u306A\u3044\u5834\u5408\u306F canvas \u7D4C\u7531\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\n }\n\n if (bytes && bytes[0] === 0xff && bytes[1] === 0xd8) {\n const dims = jpegDimensions(bytes);\n if (dims && dims.components === 3) {\n return { key: url, width: dims.width, height: dims.height, jpeg: bytes, rgb: null, alpha: null };\n }\n // CMYK / \u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB JPEG \u306F canvas \u7D4C\u7531\u3067 RGB \u5316\u3059\u308B\n }\n\n // 2. canvas \u3067\u30C7\u30B3\u30FC\u30C9\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'sync';\n const loaded = new Promise((resolve, reject) => {\n img.onload = () => resolve(undefined);\n img.onerror = () => reject(new Error('image failed to load'));\n });\n if (bytes) {\n const blobUrl = URL.createObjectURL(new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)]));\n img.src = blobUrl;\n try {\n await loaded;\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n } else {\n img.src = url;\n await loaded;\n }\n const w = img.naturalWidth;\n const h = img.naturalHeight;\n if (!w || !h) throw new Error('image has no intrinsic size');\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) throw new Error('2D canvas unavailable');\n ctx.drawImage(img, 0, 0);\n /** @type {ImageData} */\n let data;\n try {\n data = ctx.getImageData(0, 0, w, h);\n } catch {\n warn({\n code: 'image-failed',\n message: `Image ${url} is cross-origin without CORS headers; add crossorigin=\"anonymous\" and Access-Control-Allow-Origin. Skipped.`,\n element,\n });\n return null;\n }\n const px = data.data;\n const rgb = new Uint8Array(w * h * 3);\n const alpha = new Uint8Array(w * h);\n let opaque = true;\n for (let i = 0, j = 0, k = 0; i < px.length; i += 4, j += 3, k++) {\n const a = /** @type {number} */ (px[i + 3]);\n // getImageData \u306F\u975E\u30D7\u30EA\u30DE\u30EB\u30C1\u30D7\u30E9\u30A4\u3002\u900F\u660E\u30D4\u30AF\u30BB\u30EB\u306E\u8272\u306F\u30CE\u30A4\u30BA\u306B\u306A\u308A\u3046\u308B\u306E\u3067\u767D\u306B\u5BC4\u305B\u308B\n if (a === 0) {\n rgb[j] = rgb[j + 1] = rgb[j + 2] = 255;\n } else {\n rgb[j] = /** @type {number} */ (px[i]);\n rgb[j + 1] = /** @type {number} */ (px[i + 1]);\n rgb[j + 2] = /** @type {number} */ (px[i + 2]);\n }\n alpha[k] = a;\n if (a !== 255) opaque = false;\n }\n return { key: url, width: w, height: h, jpeg: null, rgb, alpha: opaque ? null : alpha };\n}\n\n/**\n * JPEG \u306E SOF \u30DE\u30FC\u30AB\u30FC\u304B\u3089\u5BF8\u6CD5\u3068\u6210\u5206\u6570\u3092\u8AAD\u3080\u3002\n * @param {Uint8Array} b\n * @returns {{width: number, height: number, components: number}|null}\n */\nexport function jpegDimensions(b) {\n let p = 2;\n while (p + 9 < b.length) {\n if (b[p] !== 0xff) {\n p++;\n continue;\n }\n const marker = /** @type {number} */ (b[p + 1]);\n if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01 || marker === 0xff) {\n p += marker === 0xff ? 1 : 2;\n continue;\n }\n const len = ((/** @type {number} */ (b[p + 2])) << 8) | /** @type {number} */ (b[p + 3]);\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n height: ((/** @type {number} */ (b[p + 5])) << 8) | /** @type {number} */ (b[p + 6]),\n width: ((/** @type {number} */ (b[p + 7])) << 8) | /** @type {number} */ (b[p + 8]),\n components: /** @type {number} */ (b[p + 9]),\n };\n }\n if (marker === 0xda) break; // SOS: \u4EE5\u964D\u306F\u753B\u50CF\u30C7\u30FC\u30BF\n p += 2 + len;\n }\n return null;\n}\n\n/**\n * computed background-image \u306E `url(\"...\")` \u3092\u53D6\u308A\u51FA\u3059\u3002\u8907\u6570\u6307\u5B9A\u30FB\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseBackgroundUrl(value) {\n if (!value || value === 'none') return null;\n const parts = splitTopLevelCommas(value);\n if (parts.length !== 1) return null;\n const m = /^url\\((?:\"([^\"]*)\"|'([^']*)'|([^)]*))\\)$/.exec(/** @type {string} */ (parts[0]).trim());\n if (!m) return null;\n return m[1] ?? m[2] ?? m[3] ?? null;\n}\n\n/** @param {string} s */\nfunction splitTopLevelCommas(s) {\n /** @type {string[]} */\n const out = [];\n let depth = 0;\n let cur = '';\n for (const ch of s) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n out.push(cur);\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur);\n return out;\n}\n\n/**\n * background-size / background-position / object-fit / object-position \u304B\u3089\u63CF\u753B\u77E9\u5F62\u3092\u8A08\u7B97\u3059\u308B\u3002\n * @param {{x: number, y: number, w: number, h: number}} box \u63CF\u753B\u9818\u57DF\uFF08px\uFF09\n * @param {number} iw \u753B\u50CF\u306E\u56FA\u6709\u5E45\n * @param {number} ih\n * @param {string} size 'auto' | 'cover' | 'contain' | '<w> <h>'\uFF08computed \u5024\u3001px \u307E\u305F\u306F %\uFF09\n * @param {string} position '0% 0%' | '50% 50%' | '10px 20px' \u2026\uFF08computed \u5024\u30012 \u5024\uFF09\n * @returns {{x: number, y: number, w: number, h: number}}\n */\nexport function fitImage(box, iw, ih, size, position) {\n let w;\n let h;\n const s = size.trim();\n if (s === 'cover' || s === 'contain') {\n const scale = s === 'cover' ? Math.max(box.w / iw, box.h / ih) : Math.min(box.w / iw, box.h / ih);\n w = iw * scale;\n h = ih * scale;\n } else {\n const [sw = 'auto', sh = 'auto'] = s.split(/\\s+/);\n const rw = sizeComponent(sw, box.w);\n const rh = sizeComponent(sh, box.h);\n if (rw === null && rh === null) {\n w = iw;\n h = ih;\n } else if (rw === null) {\n h = /** @type {number} */ (rh);\n w = (iw * h) / ih;\n } else if (rh === null) {\n w = rw;\n h = (ih * w) / iw;\n } else {\n w = rw;\n h = rh;\n }\n }\n const [px = '0%', py = '0%'] = position.trim().split(/\\s+/);\n const x = box.x + positionComponent(px, box.w - w);\n const y = box.y + positionComponent(py, box.h - h);\n return { x, y, w, h };\n}\n\n/** @param {string} v @param {number} ref @returns {number|null} */\nfunction sizeComponent(v, ref) {\n if (v === 'auto') return null;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * ref;\n return parseFloat(v) || 0;\n}\n\n/** @param {string} v @param {number} free */\nfunction positionComponent(v, free) {\n if (v === 'left' || v === 'top') return 0;\n if (v === 'center') return free / 2;\n if (v === 'right' || v === 'bottom') return free;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * free;\n return parseFloat(v) || 0;\n}\n\n/**\n * object-fit \u3092 background-size \u76F8\u5F53\u306E\u5024\u306B\u5909\u63DB\u3059\u308B\u3002\n * @param {string} fit\n * @returns {string}\n */\nexport function objectFitToSize(fit) {\n switch (fit) {\n case 'contain':\n case 'scale-down':\n return 'contain';\n case 'cover':\n return 'cover';\n case 'none':\n return 'auto';\n default:\n return '100% 100%';\n }\n}\n\n/**\n * `background-repeat` \u306E computed \u5024\u3092\u8EF8\u3054\u3068\u306B\u5206\u3051\u308B\u3002\n * `repeat-x` / `repeat-y` \u306F 2 \u5024\u8868\u8A18\u306B\u5C55\u958B\u3059\u308B\u3002\n * @param {string} value\n * @returns {['repeat'|'no-repeat'|'space'|'round', 'repeat'|'no-repeat'|'space'|'round']}\n */\nexport function splitRepeat(value) {\n const v = (value || 'repeat').trim();\n if (v === 'repeat-x') return ['repeat', 'no-repeat'];\n if (v === 'repeat-y') return ['no-repeat', 'repeat'];\n const parts = v.split(/\\s+/);\n const norm = (/** @type {string} */ s) => (s === 'repeat' || s === 'no-repeat' || s === 'space' || s === 'round' ? s : 'repeat');\n const a = norm(/** @type {string} */ (parts[0] ?? 'repeat'));\n const b = norm(/** @type {string} */ (parts[1] ?? parts[0] ?? 'repeat'));\n return [a, b];\n}\n\n/**\n * 1 \u8EF8\u3076\u3093\u306E\u30BF\u30A4\u30EB\u4F4D\u7F6E\u3092\u6C42\u3081\u308B\u3002\n *\n * - `repeat`: \u6307\u5B9A\u4F4D\u7F6E\u3092\u57FA\u6E96\u306B\u3001\u63CF\u753B\u9818\u57DF\u3092\u8986\u3046\u307E\u3067\u4E21\u65B9\u5411\u3078\u4E26\u3079\u308B\n * - `no-repeat`: \u6307\u5B9A\u4F4D\u7F6E\u306B 1 \u679A\n * - `round`: \u63CF\u753B\u9818\u57DF\u306B\u6574\u6570\u500B\u53CE\u307E\u308B\u3088\u3046\u30BF\u30A4\u30EB\u306E\u5927\u304D\u3055\u3092\u8ABF\u6574\u3057\u3066\u4E26\u3079\u308B\uFF08\u5927\u304D\u3055\u304C\u5909\u308F\u308B\uFF09\n * - `space`: \u6574\u6570\u500B\u3092\u7B49\u9593\u9694\u306B\u7F6E\u304D\u3001\u4F59\u308A\u3092\u9699\u9593\u306B\u914D\u308B\u30021 \u679A\u3057\u304B\u5165\u3089\u306A\u3044\u306A\u3089\u5148\u982D\u306B 1 \u679A\n *\n * @param {'repeat'|'no-repeat'|'space'|'round'} mode\n * @param {number} start \u6307\u5B9A\u4F4D\u7F6E\uFF08background-position \u306E\u7D50\u679C\uFF09\n * @param {number} size \u30BF\u30A4\u30EB\u306E\u5927\u304D\u3055\n * @param {number} areaStart \u63CF\u753B\u9818\u57DF\u306E\u958B\u59CB\n * @param {number} areaEnd \u63CF\u753B\u9818\u57DF\u306E\u7D42\u308F\u308A\n * @returns {{positions: number[], size: number}}\n */\nexport function tileAxis(mode, start, size, areaStart, areaEnd) {\n if (!(size > 0)) return { positions: [start], size };\n const area = areaEnd - areaStart;\n if (mode === 'no-repeat') return { positions: [start], size };\n\n if (mode === 'round') {\n const n = Math.max(1, Math.round(area / size));\n const s = area / n;\n return { positions: Array.from({ length: n }, (_, i) => areaStart + i * s), size: s };\n }\n\n if (mode === 'space') {\n const n = Math.floor(area / size);\n if (n < 2) return { positions: [areaStart], size };\n const gap = (area - n * size) / (n - 1);\n return { positions: Array.from({ length: n }, (_, i) => areaStart + i * (size + gap)), size };\n }\n\n // repeat: \u6307\u5B9A\u4F4D\u7F6E\u304B\u3089\u524D\u5F8C\u3078\u4F38\u3070\u3059\n const first = start - Math.ceil((start - areaStart) / size) * size;\n /** @type {number[]} */\n const positions = [];\n for (let p = first; p < areaEnd; p += size) {\n if (p + size > areaStart) positions.push(p);\n if (positions.length > 10000) break; // \u7570\u5E38\u306A\u7E70\u308A\u8FD4\u3057\u306E\u4FDD\u967A\n }\n return { positions: positions.length ? positions : [start], size };\n}\n\n/**\n * \u57CB\u3081\u8FBC\u307F\u304C\u6E08\u3093\u3060\u753B\u50CF\u306E\u30D4\u30AF\u30BB\u30EB\u30C7\u30FC\u30BF\u3092\u624B\u653E\u3059\u3002\n * \u30C7\u30B3\u30FC\u30C9\u7D50\u679C\uFF08RGB\u30FB\u30A2\u30EB\u30D5\u30A1\u30FBJPEG \u306E\u30D0\u30A4\u30C8\u5217\uFF09\u306F\u5143\u753B\u50CF\u3088\u308A\u6841\u9055\u3044\u306B\u5927\u304D\u3044\u306E\u3067\u3001\n * PDF \u306B\u66F8\u304D\u51FA\u3057\u305F\u3042\u3068\u3082\u62B1\u3048\u3066\u3044\u308B\u3068\u5927\u304D\u306A\u6587\u66F8\u3067\u30D4\u30FC\u30AF\u4F7F\u7528\u91CF\u304C\u8DF3\u306D\u4E0A\u304C\u308B\u3002\n *\n * \u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u3082\u5916\u3059\u306E\u3067\u3001\u6B21\u306E\u5909\u63DB\u3067\u306F\u8AAD\u307F\u76F4\u3057\u306B\u306A\u308B\uFF08\u901F\u5EA6\u3088\u308A\u30E1\u30E2\u30EA\u3092\u512A\u5148\u3059\u308B\uFF09\u3002\n *\n * @param {DecodedImage} img\n */\nexport function releasePixels(img) {\n img.jpeg = null;\n img.rgb = null;\n img.alpha = null;\n cache.delete(img.key);\n}\n", "// @ts-check\n/**\n * CSS \u306E linear-gradient \u3092 PDF \u306E\u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\uFF08ShadingType 2\uFF09\u306B\u843D\u3068\u3059\u305F\u3081\u306E\u89E3\u6790\u3002\n *\n * \u5165\u529B\u306F computed style \u306E\u5024\u306A\u306E\u3067\u3001\u8272\u306F rgb()/rgba() \u306B\u3001\u89D2\u5EA6\u306F deg \u306B\u6B63\u898F\u5316\u6E08\u307F\u3002\n * \u51FA\u529B\u306F\u7BB1\u306E\u30ED\u30FC\u30AB\u30EB\u5EA7\u6A19\uFF08\u5DE6\u4E0A\u539F\u70B9\u30FBy \u4E0B\u5411\u304D\u30FBCSS px\uFF09\u3067\u306E\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u3068\u3001\n * 0\u301C1 \u306B\u6B63\u898F\u5316\u3057\u305F\u8272\u6B62\u3081\u3002\n */\nimport { parseColor } from '../units.js';\n\n/**\n * @typedef {{t: number, color: import('../units.js').Rgba}} GradientStop\n * @typedef {{x0: number, y0: number, x1: number, y1: number, stops: GradientStop[]}} LinearGradient\n */\n\n/**\n * computed \u306E background-image \u304C\u5358\u4E00\u306E linear-gradient \u306A\u3089\u305D\u308C\u3092\u89E3\u6790\u3059\u308B\u3002\n * \u5BFE\u5FDC\u3057\u306A\u3044\u66F8\u5F0F\uFF08repeating / radial / conic / \u8907\u6570\u30EC\u30A4\u30E4\u30FC\uFF09\u306F null\u3002\n *\n * @param {string} value computed \u306E background-image\n * @param {number} width \u7BB1\u306E\u5E45\uFF08px\uFF09\n * @param {number} height \u7BB1\u306E\u9AD8\u3055\uFF08px\uFF09\n * @returns {LinearGradient|null}\n */\nexport function parseLinearGradient(value, width, height) {\n const m = /^linear-gradient\\((.*)\\)$/s.exec(value.trim());\n if (!m) return null;\n const args = splitTopLevelCommas(/** @type {string} */ (m[1]));\n if (args.length < 2) return null;\n\n let i = 0;\n let angle = 180; // \u65E2\u5B9A\u306F\u300Cto bottom\u300D\n const first = /** @type {string} */ (args[0]).trim();\n // `in oklab` \u306A\u3069\u306E\u88DC\u9593\u6307\u5B9A\u306F\u7121\u8996\u3057\u3066 sRGB \u3067\u8FD1\u4F3C\u3059\u308B\n const head = first.replace(/^in\\s+\\S+(\\s+\\S+\\s+hue)?\\s*/i, '').trim();\n const dir = parseDirection(head);\n if (dir !== null) {\n angle = dir;\n i = 1;\n } else if (/^in\\s/i.test(first) && head === '') {\n i = 1;\n }\n\n const rawStops = args.slice(i).map((s) => s.trim());\n if (rawStops.length < 2) return null;\n\n // \u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u306E\u9577\u3055\uFF08CSS \u4ED5\u69D8: |W\u00B7sin \u03B8| + |H\u00B7cos \u03B8|\uFF09\n const rad = (angle * Math.PI) / 180;\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const length = Math.abs(width * sin) + Math.abs(height * cos);\n if (!(length > 0)) return null;\n\n /** @type {GradientStop[]} */\n const stops = [];\n for (const raw of rawStops) {\n // \"rgb(255, 0, 0) 30%\" / \"rgba(0, 0, 0, 0.5)\" / \"red 10px 20px\"\uFF08\u4E8C\u91CD\u6307\u5B9A\uFF09\n const sp = splitColorAndPositions(raw);\n if (!sp) return null;\n const color = parseColor(sp.color);\n if (!color) return null;\n if (!sp.positions.length) {\n stops.push({ t: NaN, color });\n continue;\n }\n for (const pos of sp.positions) {\n const t = resolvePosition(pos, length);\n if (t === null) return null;\n stops.push({ t, color });\n }\n }\n if (stops.length < 2) return null;\n\n fillMissingPositions(stops);\n\n // \u4E2D\u5FC3\u3092\u901A\u308B\u7DDA\u5206\u3002CSS \u306E\u89D2\u5EA6\u306F 0deg = \u4E0A\u5411\u304D\u3001\u6642\u8A08\u56DE\u308A\u3002y \u306F\u4E0B\u5411\u304D\u306A\u306E\u3067 cos \u3092\u53CD\u8EE2\u3059\u308B\u3002\n const cx = width / 2;\n const cy = height / 2;\n const dx = sin;\n const dy = -cos;\n return {\n x0: cx - (dx * length) / 2,\n y0: cy - (dy * length) / 2,\n x1: cx + (dx * length) / 2,\n y1: cy + (dy * length) / 2,\n stops,\n };\n}\n\n/**\n * `45deg` / `to right` / `to right bottom` \u3092 CSS \u89D2\u5EA6\uFF080 = \u4E0A\u3001\u6642\u8A08\u56DE\u308A\uFF09\u306B\u3059\u308B\u3002\n * \u65B9\u5411\u6307\u5B9A\u3067\u306A\u3051\u308C\u3070 null\u3002\n * @param {string} s\n * @returns {number|null}\n */\nfunction parseDirection(s) {\n const deg = /^(-?[\\d.]+)deg$/.exec(s);\n if (deg) return ((parseFloat(/** @type {string} */ (deg[1])) % 360) + 360) % 360;\n const to = /^to\\s+(.+)$/.exec(s);\n if (!to) return null;\n const words = /** @type {string} */ (to[1]).trim().split(/\\s+/).sort().join(' ');\n /** @type {Record<string, number>} */\n const table = {\n top: 0,\n right: 90,\n bottom: 180,\n left: 270,\n 'right top': 45,\n 'bottom right': 135,\n 'bottom left': 225,\n 'left top': 315,\n };\n return table[words] ?? null;\n}\n\n/**\n * \u8272\u6B62\u3081\u3092\u300C\u8272\u300D\u3068\u300C\u4F4D\u7F6E\uFF080\u301C2 \u500B\uFF09\u300D\u306B\u5206\u3051\u308B\u3002\n * @param {string} s\n * @returns {{color: string, positions: string[]}|null}\n */\nfunction splitColorAndPositions(s) {\n // \u95A2\u6570\u8A18\u6CD5\uFF08rgb(...)\uFF09\u3092\u5148\u306B\u5207\u308A\u51FA\u3059\n const fn = /^([a-z-]+\\([^()]*\\))\\s*(.*)$/i.exec(s);\n if (fn) return { color: /** @type {string} */ (fn[1]), positions: splitWords(/** @type {string} */ (fn[2])) };\n const kw = /^(\\S+)\\s*(.*)$/.exec(s);\n if (!kw) return null;\n return { color: /** @type {string} */ (kw[1]), positions: splitWords(/** @type {string} */ (kw[2])) };\n}\n\n/** @param {string} s */\nfunction splitWords(s) {\n const t = s.trim();\n return t ? t.split(/\\s+/) : [];\n}\n\n/**\n * \u4F4D\u7F6E\u6307\u5B9A\uFF0830% / 10px\uFF09\u3092\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u4E0A\u306E 0\u301C1 \u306B\u3059\u308B\u3002\n * @param {string} pos\n * @param {number} length\n * @returns {number|null}\n */\nfunction resolvePosition(pos, length) {\n const pct = /^(-?[\\d.]+)%$/.exec(pos);\n if (pct) return parseFloat(/** @type {string} */ (pct[1])) / 100;\n const px = /^(-?[\\d.]+)px$/.exec(pos);\n if (px) return parseFloat(/** @type {string} */ (px[1])) / length;\n return null;\n}\n\n/**\n * \u4F4D\u7F6E\u306E\u7121\u3044\u8272\u6B62\u3081\u3092\u57CB\u3081\u308B\u3002\u4E21\u7AEF\u306F 0 \u3068 1\u3001\u9593\u306F\u7B49\u9593\u9694\u3002\n * \u3055\u3089\u306B\u524D\u306E\u4F4D\u7F6E\u3092\u4E0B\u56DE\u3089\u306A\u3044\u3088\u3046\u5358\u8ABF\u306B\u3059\u308B\uFF08CSS \u4ED5\u69D8\uFF09\u3002\n * @param {GradientStop[]} stops\n */\nfunction fillMissingPositions(stops) {\n const last = stops.length - 1;\n if (Number.isNaN(/** @type {number} */ (stops[0]?.t))) /** @type {GradientStop} */ (stops[0]).t = 0;\n if (Number.isNaN(/** @type {number} */ (stops[last]?.t))) /** @type {GradientStop} */ (stops[last]).t = 1;\n for (let i = 1; i < last; i++) {\n if (!Number.isNaN(/** @type {number} */ (stops[i]?.t))) continue;\n // \u6B21\u306B\u4F4D\u7F6E\u304C\u6C7A\u307E\u3063\u3066\u3044\u308B\u8272\u6B62\u3081\u307E\u3067\u3092\u7B49\u5206\u3059\u308B\n let j = i + 1;\n while (j < last && Number.isNaN(/** @type {number} */ (stops[j]?.t))) j++;\n const from = /** @type {number} */ (stops[i - 1]?.t);\n const to = /** @type {number} */ (stops[j]?.t);\n for (let k = i; k < j; k++) {\n /** @type {GradientStop} */ (stops[k]).t = from + ((to - from) * (k - i + 1)) / (j - i + 1);\n }\n i = j - 1;\n }\n for (let i = 1; i < stops.length; i++) {\n const prev = /** @type {number} */ (stops[i - 1]?.t);\n if (/** @type {number} */ (stops[i]?.t) < prev) /** @type {GradientStop} */ (stops[i]).t = prev;\n }\n}\n\n/** @param {string} s */\nfunction splitTopLevelCommas(s) {\n /** @type {string[]} */\n const out = [];\n let depth = 0;\n let cur = '';\n for (const ch of s) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n out.push(cur);\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur);\n return out;\n}\n", "// @ts-check\n/**\n * SVG \u306E\u30D1\u30B9\u30C7\u30FC\u30BF\u3068\u57FA\u672C\u56F3\u5F62\u3092\u3001PDF \u306B\u51FA\u305B\u308B\u5F62\uFF08\u7D76\u5BFE\u5EA7\u6A19\u306E M / L / C / Z\uFF09\u3078\u6B63\u898F\u5316\u3059\u308B\u3002\n *\n * \u5186\u5F27\uFF08A\uFF09\u306F 3 \u6B21\u30D9\u30B8\u30A7\u3078\u3001\u4E8C\u6B21\u30D9\u30B8\u30A7\uFF08Q / T\uFF09\u3082 3 \u6B21\u3078\u5909\u63DB\u3059\u308B\u3002\n * \u5EA7\u6A19\u306F\u8981\u7D20\u306E\u30E6\u30FC\u30B6\u30FC\u5358\u4F4D\u306E\u307E\u307E\uFF08\u5909\u63DB\u884C\u5217\u306F\u63CF\u753B\u6642\u306B cm \u3067\u9069\u7528\u3059\u308B\uFF09\u3002\n */\n\n/**\n * @typedef {['M', number, number]|['L', number, number]|['C', number, number, number, number, number, number]|['Z']} PathSeg\n */\n\n/**\n * `d` \u5C5E\u6027\u3092\u7D76\u5BFE\u5EA7\u6A19\u306E M / L / C / Z \u5217\u306B\u3059\u308B\u3002\n * @param {string} d\n * @returns {PathSeg[]}\n */\nexport function parsePathData(d) {\n /** @type {PathSeg[]} */\n const out = [];\n const tokens = tokenize(d);\n let i = 0;\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n // \u76F4\u524D\u306E\u5236\u5FA1\u70B9\uFF08S / T \u306E\u53CD\u5C04\u7528\uFF09\n /** @type {[number, number]|null} */\n let lastC = null;\n /** @type {[number, number]|null} */\n let lastQ = null;\n let cmd = '';\n\n const num = () => {\n const t = tokens[i++];\n return typeof t === 'number' ? t : NaN;\n };\n const hasNum = () => typeof tokens[i] === 'number';\n\n while (i < tokens.length) {\n if (typeof tokens[i] === 'string') cmd = /** @type {string} */ (tokens[i++]);\n else if (!cmd) break; // \u6570\u5024\u304B\u3089\u59CB\u307E\u308B\u4E0D\u6B63\u306A\u30C7\u30FC\u30BF\n const rel = cmd === cmd.toLowerCase();\n const C = cmd.toUpperCase();\n const ox = rel ? x : 0;\n const oy = rel ? y : 0;\n\n if (C === 'M') {\n x = num() + ox;\n y = num() + oy;\n out.push(['M', x, y]);\n startX = x;\n startY = y;\n lastC = lastQ = null;\n // \u7D9A\u304F\u5EA7\u6A19\u5BFE\u306F L / l \u6271\u3044\n cmd = rel ? 'l' : 'L';\n continue;\n }\n if (C === 'Z') {\n out.push(['Z']);\n x = startX;\n y = startY;\n lastC = lastQ = null;\n continue;\n }\n if (C === 'L') {\n x = num() + ox;\n y = num() + oy;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'H') {\n x = num() + ox;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'V') {\n y = num() + oy;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'C') {\n const x1 = num() + ox;\n const y1 = num() + oy;\n const x2 = num() + ox;\n const y2 = num() + oy;\n x = num() + ox;\n y = num() + oy;\n out.push(['C', x1, y1, x2, y2, x, y]);\n lastC = [x2, y2];\n lastQ = null;\n } else if (C === 'S') {\n const rx = lastC ? 2 * x - lastC[0] : x;\n const ry = lastC ? 2 * y - lastC[1] : y;\n const x2 = num() + ox;\n const y2 = num() + oy;\n x = num() + ox;\n y = num() + oy;\n out.push(['C', rx, ry, x2, y2, x, y]);\n lastC = [x2, y2];\n lastQ = null;\n } else if (C === 'Q' || C === 'T') {\n let qx;\n let qy;\n if (C === 'Q') {\n qx = num() + ox;\n qy = num() + oy;\n } else {\n qx = lastQ ? 2 * x - lastQ[0] : x;\n qy = lastQ ? 2 * y - lastQ[1] : y;\n }\n const px = num() + ox;\n const py = num() + oy;\n // \u4E8C\u6B21 \u2192 \u4E09\u6B21\n out.push(['C', x + (2 / 3) * (qx - x), y + (2 / 3) * (qy - y), px + (2 / 3) * (qx - px), py + (2 / 3) * (qy - py), px, py]);\n x = px;\n y = py;\n lastQ = [qx, qy];\n lastC = null;\n } else if (C === 'A') {\n const rx = num();\n const ry = num();\n const rot = num();\n const large = num();\n const sweep = num();\n const px = num() + ox;\n const py = num() + oy;\n for (const seg of arcToCurves(x, y, px, py, rx, ry, rot, large !== 0, sweep !== 0)) out.push(seg);\n x = px;\n y = py;\n lastC = lastQ = null;\n } else {\n break; // \u672A\u77E5\u306E\u30B3\u30DE\u30F3\u30C9\n }\n if (!hasNum() && typeof tokens[i] !== 'string') break;\n }\n return out;\n}\n\n/**\n * `d` \u3092\u6570\u5024\u3068\u30B3\u30DE\u30F3\u30C9\u6587\u5B57\u306B\u5206\u89E3\u3059\u308B\u3002\n * @param {string} d\n * @returns {(string|number)[]}\n */\nfunction tokenize(d) {\n /** @type {(string|number)[]} */\n const out = [];\n const re = /([MmLlHhVvCcSsQqTtAaZz])|(-?(?:\\d*\\.\\d+|\\d+)(?:[eE][-+]?\\d+)?)/g;\n let m;\n while ((m = re.exec(d))) {\n if (m[1]) out.push(m[1]);\n else out.push(parseFloat(/** @type {string} */ (m[2])));\n }\n return out;\n}\n\n/**\n * \u6955\u5186\u5186\u5F27\u3092 3 \u6B21\u30D9\u30B8\u30A7\u5217\u306B\u3059\u308B\uFF08SVG \u4ED5\u69D8 F.6 \u306E\u5B9F\u88C5\uFF09\u3002\n * @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2\n * @param {number} rx @param {number} ry @param {number} rotDeg\n * @param {boolean} large @param {boolean} sweep\n * @returns {PathSeg[]}\n */\nexport function arcToCurves(x1, y1, x2, y2, rx, ry, rotDeg, large, sweep) {\n if (x1 === x2 && y1 === y2) return [];\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n if (rx === 0 || ry === 0) return [['L', x2, y2]];\n\n const phi = (rotDeg * Math.PI) / 180;\n const cosP = Math.cos(phi);\n const sinP = Math.sin(phi);\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosP * dx + sinP * dy;\n const y1p = -sinP * dx + cosP * dy;\n\n // \u534A\u5F84\u304C\u5C0F\u3055\u3059\u304E\u308B\u5834\u5408\u306F\u5E83\u3052\u308B\uFF08\u4ED5\u69D8 F.6.6\uFF09\n const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n if (lambda > 1) {\n const s = Math.sqrt(lambda);\n rx *= s;\n ry *= s;\n }\n\n const sign = large === sweep ? -1 : 1;\n const num = rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p;\n const den = rx * rx * y1p * y1p + ry * ry * x1p * x1p;\n const co = sign * Math.sqrt(Math.max(0, num / den));\n const cxp = (co * rx * y1p) / ry;\n const cyp = (-co * ry * x1p) / rx;\n const cx = cosP * cxp - sinP * cyp + (x1 + x2) / 2;\n const cy = sinP * cxp + cosP * cyp + (y1 + y2) / 2;\n\n const angle = (/** @type {number} */ ux, /** @type {number} */ uy, /** @type {number} */ vx, /** @type {number} */ vy) => {\n const dot = ux * vx + uy * vy;\n const len = Math.hypot(ux, uy) * Math.hypot(vx, vy);\n let a = Math.acos(Math.min(1, Math.max(-1, dot / (len || 1))));\n if (ux * vy - uy * vx < 0) a = -a;\n return a;\n };\n const theta1 = angle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);\n let dTheta = angle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry);\n if (!sweep && dTheta > 0) dTheta -= 2 * Math.PI;\n if (sweep && dTheta < 0) dTheta += 2 * Math.PI;\n\n // 1 \u533A\u9593\u3042\u305F\u308A 90 \u5EA6\u4EE5\u4E0B\u306B\u306A\u308B\u3088\u3046\u5206\u5272\u3059\u308B\n const parts = Math.max(1, Math.ceil(Math.abs(dTheta / (Math.PI / 2))));\n const delta = dTheta / parts;\n const t = ((4 / 3) * Math.tan(delta / 4));\n /** @type {PathSeg[]} */\n const out = [];\n let th = theta1;\n for (let i = 0; i < parts; i++) {\n const th2 = th + delta;\n const cos1 = Math.cos(th);\n const sin1 = Math.sin(th);\n const cos2 = Math.cos(th2);\n const sin2 = Math.sin(th2);\n /** \u6955\u5186\u4E0A\u306E\u70B9\u3068\u305D\u306E\u63A5\u7DDA\u304B\u3089\u5236\u5FA1\u70B9\u3092\u4F5C\u308B */\n const map = (/** @type {number} */ ex, /** @type {number} */ ey) => [cosP * rx * ex - sinP * ry * ey + cx, sinP * rx * ex + cosP * ry * ey + cy];\n const [px1, py1] = map(cos1, sin1);\n const [px2, py2] = map(cos2, sin2);\n const [c1x, c1y] = map(cos1 - t * sin1, sin1 + t * cos1);\n const [c2x, c2y] = map(cos2 + t * sin2, sin2 - t * cos2);\n void px1;\n void py1;\n out.push(['C', /** @type {number} */ (c1x), /** @type {number} */ (c1y), /** @type {number} */ (c2x), /** @type {number} */ (c2y), /** @type {number} */ (px2), /** @type {number} */ (py2)]);\n th = th2;\n }\n return out;\n}\n\n/**\n * \u57FA\u672C\u56F3\u5F62\u3092\u30D1\u30B9\u306B\u3059\u308B\u3002\u5BFE\u5FDC\u3057\u306A\u3044\u8981\u7D20\u306F null\u3002\n * @param {Element} el\n * @param {(name: string) => string} attr \u5C5E\u6027\u5024\uFF08\u30D7\u30EC\u30BC\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u5C5E\u6027\u306F computed style \u3092\u512A\u5148\u3057\u306A\u3044\u7D14\u7C8B\u306A\u5E7E\u4F55\u5C5E\u6027\uFF09\n * @returns {PathSeg[]|null}\n */\nexport function shapeToPath(el, attr) {\n const n = (/** @type {string} */ name, /** @type {number} */ dflt = 0) => {\n const v = parseFloat(attr(name));\n return Number.isFinite(v) ? v : dflt;\n };\n switch (el.tagName) {\n case 'path': {\n const d = attr('d');\n return d ? parsePathData(d) : [];\n }\n case 'rect': {\n const x = n('x');\n const y = n('y');\n const w = n('width');\n const h = n('height');\n if (w <= 0 || h <= 0) return [];\n let rx = attr('rx') === '' || attr('rx') === 'auto' ? NaN : n('rx');\n let ry = attr('ry') === '' || attr('ry') === 'auto' ? NaN : n('ry');\n if (Number.isNaN(rx) && Number.isNaN(ry)) return rectPath(x, y, w, h);\n if (Number.isNaN(rx)) rx = /** @type {number} */ (ry);\n if (Number.isNaN(ry)) ry = /** @type {number} */ (rx);\n rx = Math.min(rx, w / 2);\n ry = Math.min(ry, h / 2);\n if (rx <= 0 || ry <= 0) return rectPath(x, y, w, h);\n return roundRectPath(x, y, w, h, rx, ry);\n }\n case 'circle': {\n const r = n('r');\n if (r <= 0) return [];\n return ellipsePath(n('cx'), n('cy'), r, r);\n }\n case 'ellipse': {\n const rx = n('rx');\n const ry = n('ry');\n if (rx <= 0 || ry <= 0) return [];\n return ellipsePath(n('cx'), n('cy'), rx, ry);\n }\n case 'line':\n return [\n ['M', n('x1'), n('y1')],\n ['L', n('x2'), n('y2')],\n ];\n case 'polyline':\n case 'polygon': {\n const pts = attr('points')\n .split(/[\\s,]+/)\n .map(parseFloat)\n .filter((v) => Number.isFinite(v));\n if (pts.length < 4) return [];\n /** @type {PathSeg[]} */\n const out = [['M', /** @type {number} */ (pts[0]), /** @type {number} */ (pts[1])]];\n for (let i = 2; i + 1 < pts.length; i += 2) out.push(['L', /** @type {number} */ (pts[i]), /** @type {number} */ (pts[i + 1])]);\n if (el.tagName === 'polygon') out.push(['Z']);\n return out;\n }\n default:\n return null;\n }\n}\n\n/** @returns {PathSeg[]} */\nfunction rectPath(/** @type {number} */ x, /** @type {number} */ y, /** @type {number} */ w, /** @type {number} */ h) {\n return [\n ['M', x, y],\n ['L', x + w, y],\n ['L', x + w, y + h],\n ['L', x, y + h],\n ['Z'],\n ];\n}\n\nconst K = 0.5522847498307936; // 4/3\u00B7(\u221A2\u22121)\n\n/** @returns {PathSeg[]} */\nfunction roundRectPath(/** @type {number} */ x, /** @type {number} */ y, /** @type {number} */ w, /** @type {number} */ h, /** @type {number} */ rx, /** @type {number} */ ry) {\n const cx = rx * K;\n const cy = ry * K;\n const r = x + w;\n const b = y + h;\n return [\n ['M', x + rx, y],\n ['L', r - rx, y],\n ['C', r - rx + cx, y, r, y + ry - cy, r, y + ry],\n ['L', r, b - ry],\n ['C', r, b - ry + cy, r - rx + cx, b, r - rx, b],\n ['L', x + rx, b],\n ['C', x + rx - cx, b, x, b - ry + cy, x, b - ry],\n ['L', x, y + ry],\n ['C', x, y + ry - cy, x + rx - cx, y, x + rx, y],\n ['Z'],\n ];\n}\n\n/** @returns {PathSeg[]} */\nfunction ellipsePath(/** @type {number} */ cx, /** @type {number} */ cy, /** @type {number} */ rx, /** @type {number} */ ry) {\n const ox = rx * K;\n const oy = ry * K;\n return [\n ['M', cx + rx, cy],\n ['C', cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry],\n ['C', cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy],\n ['C', cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry],\n ['C', cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy],\n ['Z'],\n ];\n}\n", "// @ts-check\n/**\n * DOM Walker \u2014 \u30D6\u30E9\u30A6\u30B6\u304C\u30EC\u30A4\u30A2\u30A6\u30C8\u3057\u305F Document \u3092\u8D70\u67FB\u3057\u3001DisplayList\uFF08\u63CF\u753B\u547D\u4EE4\u306E\u914D\u5217\uFF09\u3092\u4F5C\u308B\u3002\n * \u5EA7\u6A19\u306F\u3059\u3079\u3066 CSS px\u3001iframe \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08\u5DE6\u4E0A\u539F\u70B9\u3001y \u4E0B\u5411\u304D\uFF09\u3002\n */\nimport { parseColor, cssPx } from '../units.js';\nimport { splitFamilies, parseWeight } from '../font/registry.js';\nimport { measureText } from './text.js';\nimport { featureTagsOf } from '../font/gsub.js';\nimport { loadImage, parseBackgroundUrl, fitImage, objectFitToSize, splitRepeat, tileAxis } from './image.js';\nimport { parseLinearGradient } from './gradient.js';\nimport { shapeToPath } from './svg-path.js';\n\n/**\n * @typedef {import('../units.js').Rgba} Rgba\n * @typedef {[number, number, number, number]} Radius [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] px\n * @typedef {{x: number, y: number, w: number, h: number, radius?: Radius}} Box\n *\n * @typedef {{type: 'rect', x: number, y: number, w: number, h: number, color: Rgba, radius?: Radius, z: number, seq: number}} RectItem\n * @typedef {{type: 'line', x1: number, y1: number, x2: number, y2: number, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} LineItem\n * @typedef {{type: 'stroke-rrect', x: number, y: number, w: number, h: number, radius: Radius, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} StrokeRRectItem\n * @typedef {{type: 'image', x: number, y: number, w: number, h: number, image: import('./image.js').DecodedImage, clip: Box|null, alpha: number, z: number, seq: number}} ImageItem\n * @typedef {{gid: number, cp: number, x: number, advance: number}} Glyph advance \u306F px\n * @typedef {{type: 'text', x: number, y: number, top: number, bottom: number, size: number, color: Rgba, font: import('../font/registry.js').RegisteredFont, glyphs: Glyph[], z: number, seq: number}} TextItem\n * @typedef {{type: 'group', matrix: [number, number, number, number, number, number], origin: {x: number, y: number}, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} GroupItem\n * @typedef {{type: 'clip', box: Box, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} ClipItem overflow: hidden\n * @typedef {{type: 'gradient', box: Box, clip: Box, gradient: import('./gradient.js').LinearGradient, alpha: number, z: number, seq: number}} GradientItem linear-gradient\uFF08box \u306F\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u306E\u57FA\u6E96\u9818\u57DF\u3001clip \u306F\u63CF\u753B\u7BC4\u56F2\uFF09\n * @typedef {{color: Rgba, width: number, cap: 0|1|2, join: 0|1|2, miter: number, dash: number[]|null, dashOffset: number}} PathStroke\n * @typedef {{type: 'path', segs: import('./svg-path.js').PathSeg[], matrix: [number, number, number, number, number, number], fill: Rgba|null, evenOdd: boolean, stroke: PathStroke|null, top: number, bottom: number, z: number, seq: number}} PathItem \u30A4\u30F3\u30E9\u30A4\u30F3 SVG \u306E\u56F3\u5F62\uFF08matrix \u306F\u30E6\u30FC\u30B6\u30FC\u5358\u4F4D \u2192 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @typedef {RectItem|LineItem|StrokeRRectItem|ImageItem|TextItem|GroupItem|ClipItem|GradientItem|PathItem} DisplayItem\n *\n * @typedef {{top: number, bottom: number}} Atom \u30DA\u30FC\u30B8\u5883\u754C\u3092\u8DE8\u3044\u3067\u306F\u3044\u3051\u306A\u3044\u7E26\u7BC4\u56F2\uFF08\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\n * @typedef {{top: number, bottom: number, headTop: number, headBottom: number, headItems: DisplayItem[], footTop: number, footBottom: number, footItems: DisplayItem[]}} TableInfo\n * @typedef {{start: number, end: number, pullTo: number}} Join break-before/after: avoid \u2014 [start, end] \u306B\u5883\u754C\u3092\u7F6E\u304B\u305A\u3001\u7F6E\u304D\u305D\u3046\u306A\u3089 pullTo \u307E\u3067\u623B\u3059\n * @typedef {{items: DisplayItem[], atoms: Atom[], breaks: number[], joins: Join[], tables: TableInfo[], height: number}} WalkResult\n */\n\n/**\n * @typedef {object} WalkContext\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} fontFallback\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {'font'|'measure'|'auto'} textMeasure\n * @property {import('../pacer.js').Pacer} [pacer] \u9577\u3044\u8D70\u67FB\u3067\u9014\u4E2D\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u305F\u3081\u306E\u8B72\u6E21\n */\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEMPLATE', 'HEAD', 'META', 'LINK', 'TITLE', 'BASE', 'IFRAME', 'CANVAS', 'VIDEO', 'AUDIO', 'OBJECT', 'EMBED']);\n\n/** background-repeat \u3067\u4E26\u3079\u308B\u30BF\u30A4\u30EB\u306E\u4E0A\u9650\u3002\u3053\u308C\u3092\u8D85\u3048\u305F\u3089 1 \u679A\u3060\u3051\u63CF\u3044\u3066\u8B66\u544A\u3059\u308B\u3002 */\nconst MAX_BG_TILES = 4000;\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n/** \u63CF\u753B\u3055\u308C\u306A\u3044 SVG \u8981\u7D20\uFF08\u5B9A\u7FA9\u3084\u8AAC\u660E\uFF09\u3002\u9ED9\u3063\u3066\u98DB\u3070\u3059\u3002 */\nconst SVG_NON_RENDERED = new Set(['defs', 'symbol', 'marker', 'clipPath', 'mask', 'pattern', 'filter', 'linearGradient', 'radialGradient', 'style', 'title', 'desc', 'metadata', 'script']);\n/** \u5B50\u3092\u305F\u3069\u308B\u3060\u3051\u306E SVG \u8981\u7D20 */\nconst SVG_CONTAINERS = new Set(['g', 'a', 'svg', 'switch']);\n\n/**\n * flat tree\uFF08\u30B7\u30E3\u30C9\u30A6 DOM \u3092\u5C55\u958B\u3057\u305F\u6728\uFF09\u3067\u306E\u5B50\u30CE\u30FC\u30C9\u3092\u8FD4\u3059\u3002\n *\n * - \u30B7\u30E3\u30C9\u30A6\u30DB\u30B9\u30C8 \u2192 \u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306E\u5B50\uFF08light DOM \u306E\u5B50\u306F `<slot>` \u7D4C\u7531\u3067\u73FE\u308C\u308B\uFF09\n * - `<slot>` \u2192 \u5272\u308A\u5F53\u3066\u3089\u308C\u305F\u30CE\u30FC\u30C9\uFF08\u7121\u3051\u308C\u3070\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5185\u5BB9\uFF09\n * - \u305D\u308C\u4EE5\u5916 \u2192 \u901A\u5E38\u306E\u5B50\u30CE\u30FC\u30C9\n *\n * @param {Element} el\n * @returns {ChildNode[]}\n */\nfunction flatChildNodes(el) {\n const shadow = el.shadowRoot;\n if (shadow) return [...shadow.childNodes];\n if (el.tagName === 'SLOT') {\n const slot = /** @type {HTMLSlotElement} */ (/** @type {unknown} */ (el));\n if (typeof slot.assignedNodes === 'function') {\n return /** @type {ChildNode[]} */ (slot.assignedNodes({ flatten: true }));\n }\n }\n return [...el.childNodes];\n}\n\n/** \u672A\u5BFE\u5FDC CSS \u30D7\u30ED\u30D1\u30C6\u30A3: [computedStyle \u306E\u30AD\u30FC, \u300C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u300D\u5224\u5B9A] */\nconst UNSUPPORTED = /** @type {[keyof CSSStyleDeclaration & string, (v: string) => boolean][]} */ ([\n ['boxShadow', (v) => v !== 'none'],\n ['textShadow', (v) => v !== 'none'],\n ['filter', (v) => v !== 'none'],\n ['backdropFilter', (v) => v !== 'none' && v !== ''],\n ['writingMode', (v) => v.startsWith('vertical')],\n ['outlineStyle', (v) => v !== 'none'],\n ['clipPath', (v) => v !== 'none'],\n ['mixBlendMode', (v) => v !== 'normal'],\n]);\n\n/**\n * @param {HTMLElement} root\n * @param {WalkContext} ctx\n * @returns {Promise<WalkResult>}\n */\nexport async function walk(root, ctx) {\n const win = /** @type {Window} */ (root.ownerDocument.defaultView);\n const sx = win.scrollX;\n const sy = win.scrollY;\n /** @type {DisplayItem[]} \u73FE\u5728\u306E\u51FA\u529B\u5148\uFF08transform \u30B0\u30EB\u30FC\u30D7\u5185\u3067\u306F\u5DEE\u3057\u66FF\u308F\u308B\uFF09 */\n let out = [];\n const rootItems = out;\n /** @type {Atom[]} */\n const atoms = [];\n /** @type {number[]} */\n const breaks = [];\n /** @type {Join[]} */\n const joins = [];\n /** @type {TableInfo[]} */\n const tables = [];\n /** @type {TableInfo|null} \u8D70\u67FB\u4E2D\u306E\u30C6\u30FC\u30D6\u30EB\uFF08thead \u306E\u63CF\u753B\u547D\u4EE4\u3092\u8A18\u9332\u3059\u308B\u5148\uFF09 */\n let currentTable = null;\n let seq = 0;\n /** @type {Set<string>} */\n const warned = new Set();\n /** @type {Set<string>} */\n const missingFamilies = new Set();\n\n /**\n * @param {string} key\n * @param {import('../index.js').ConversionWarning} w\n */\n function warnOnce(key, w) {\n if (warned.has(key)) return;\n warned.add(key);\n ctx.warn(w);\n }\n\n /**\n * @typedef {{z: number, alpha: number, decorations: {line: string, color: Rgba}[]}} Inherited\n */\n\n /**\n * @param {Element} el\n * @param {Inherited} inherited\n */\n async function visit(el, inherited) {\n if (SKIP_TAGS.has(el.tagName)) return;\n if (ctx.pacer) await ctx.pacer();\n const style = win.getComputedStyle(el);\n if (style.display === 'none') return;\n\n // transform: \u4E00\u6642\u7684\u306B\u7121\u52B9\u5316\u3057\u3066\u7121\u5909\u5F62\u306E\u5EA7\u6A19\u3067\u8D70\u67FB\u3057\u3001\u30B0\u30EB\u30FC\u30D7\u3068\u3057\u3066\u5305\u3080\n const matrix = parseTransform(style.transform);\n // \u6CE8\u610F: iframe \u5185\u306E\u8981\u7D20\u306F\u89AA\u30A6\u30A3\u30F3\u30C9\u30A6\u306E HTMLElement \u306E instanceof \u306B\u5931\u6557\u3059\u308B\u306E\u3067\u3001\u30BF\u30B0\u540D\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u5224\u5B9A\u3059\u308B\n if (matrix && 'style' in el) {\n const hel = /** @type {HTMLElement} */ (el);\n const transformedRect = hel.getBoundingClientRect();\n const prev = hel.style.transform;\n hel.style.transform = 'none';\n void hel.offsetWidth;\n const plainRect = hel.getBoundingClientRect();\n const [ox, oy] = parseOrigin(style.transformOrigin);\n const origin = { x: plainRect.left + ox + sx, y: plainRect.top + oy + sy };\n\n const saved = out;\n out = [];\n await visitInner(el, win.getComputedStyle(el), inherited);\n const items = out;\n out = saved;\n hel.style.transform = prev;\n void hel.offsetWidth;\n\n out.push({\n type: 'group',\n matrix,\n origin,\n items,\n top: transformedRect.top + sy,\n bottom: transformedRect.bottom + sy,\n z: zOf(style, inherited.z),\n seq: seq++,\n });\n return;\n }\n await visitInner(el, style, inherited);\n }\n\n /** @param {CSSStyleDeclaration} style @param {number} inheritedZ */\n function zOf(style, inheritedZ) {\n if (style.position !== 'static' && style.zIndex !== 'auto') {\n const zi = parseInt(style.zIndex, 10);\n if (Number.isFinite(zi)) return zi;\n }\n return inheritedZ;\n }\n\n /**\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inherited\n */\n async function visitInner(el, style, inherited) {\n const z = zOf(style, inherited.z);\n const opacity = parseFloat(style.opacity);\n const alpha = inherited.alpha * (Number.isFinite(opacity) ? opacity : 1);\n const visible = style.visibility === 'visible' && alpha > 0;\n\n // \u30DA\u30FC\u30B8\u5206\u5272\u306E\u30D2\u30F3\u30C8\uFF08\u975E\u8868\u793A\u3067\u3082\u4F4D\u7F6E\u306F\u6301\u3064\u306E\u3067 visible \u306B\u95A2\u4FC2\u306A\u304F\u96C6\u3081\u308B\uFF09\n if (style.display !== 'contents' && style.display !== 'inline') {\n const r = el.getBoundingClientRect();\n const top = r.top + sy;\n const bottom = r.bottom + sy;\n if (r.height > 0) {\n const bb = style.breakBefore || style.pageBreakBefore;\n const ba = style.breakAfter || style.pageBreakAfter;\n if (/^(page|always|left|right|recto|verso)$/.test(bb)) breaks.push(top);\n if (/^(page|always|left|right|recto|verso)$/.test(ba)) breaks.push(bottom);\n const bi = style.breakInside || style.pageBreakInside;\n // \u8868\u306E\u884C\u30FB\u884C\u30B0\u30EB\u30FC\u30D7\u30FB\u753B\u50CF\u30FBavoid \u6307\u5B9A\u306F\u5206\u5272\u3057\u306A\u3044\n if (bi === 'avoid' || bi === 'avoid-page' || style.display === 'table-row' || style.display === 'table-header-group' || style.display === 'table-footer-group' || el.tagName === 'IMG' || el.tagName === 'svg') {\n atoms.push({ top, bottom });\n }\n // break-before/after: avoid \u2014 \u96A3\u306E\u7BB1\u3068\u306E\u9593\u306B\u30DA\u30FC\u30B8\u5883\u754C\u3092\u7F6E\u304B\u305B\u306A\u3044\n if (/^avoid(-page)?$/.test(ba)) {\n const next = nextBoxAfter(el);\n if (next) joins.push({ start: Math.min(bottom, next.top), end: Math.max(bottom, next.top), pullTo: top });\n }\n if (/^avoid(-page)?$/.test(bb)) {\n const prev = prevBoxBefore(el);\n if (prev) joins.push({ start: Math.min(prev.bottom, top), end: Math.max(prev.bottom, top), pullTo: prev.top });\n }\n }\n }\n /** @type {TableInfo|null} */\n let openedTable = null;\n if (style.display === 'table' || style.display === 'inline-table') {\n const r = el.getBoundingClientRect();\n openedTable = { top: r.top + sy, bottom: r.bottom + sy, headTop: 0, headBottom: 0, headItems: [], footTop: 0, footBottom: 0, footItems: [] };\n tables.push(openedTable);\n }\n const savedTable = currentTable;\n if (openedTable) currentTable = openedTable;\n const isHead = style.display === 'table-header-group' && currentTable && !currentTable.headItems.length;\n const isFoot = style.display === 'table-footer-group' && currentTable && !currentTable.footItems.length;\n const groupStart = isHead || isFoot ? out.length : -1;\n\n // overflow: hidden / clip / auto / scroll \u2192 \u5B50\u5B6B\u3092 padding-box \u3067\u30AF\u30EA\u30C3\u30D7\u3059\u308B\n const clips = style.overflowX !== 'visible' || style.overflowY !== 'visible';\n /** @type {DisplayItem[]|null} */\n let clipSaved = null;\n /** @type {Box|null} */\n let clipBox = null;\n if (clips && style.display !== 'inline' && style.display !== 'contents' && el !== root) {\n const r = el.getBoundingClientRect();\n clipBox = boxFor(r, style, 'padding-box', parseRadius(style, r));\n }\n\n if (visible && style.display !== 'contents') {\n warnUnsupported(el, style);\n const rects = style.display === 'inline' ? [...el.getClientRects()] : [el.getBoundingClientRect()];\n const collapse = style.borderCollapse === 'collapse' && /^table/.test(style.display) && style.display !== 'table-caption';\n const radius = rects.length === 1 ? parseRadius(style, /** @type {DOMRect} */ (rects[0])) : null;\n for (const r of rects) {\n if (r.width <= 0 && r.height <= 0) continue;\n paintBackground(r, style, alpha, z, radius);\n await paintBackgroundImage(el, r, style, alpha, z, radius);\n paintBorders(r, style, alpha, z, collapse, radius);\n }\n if (el.tagName === 'IMG' && rects[0]) {\n await paintImg(/** @type {HTMLImageElement} */ (el), /** @type {DOMRect} */ (rects[0]), style, alpha, z, radius);\n }\n }\n\n // text-decoration \u306F\u5B50\u5B6B\u30C6\u30AD\u30B9\u30C8\u3078\u4F1D\u64AD\u3059\u308B\n let decorations = inherited.decorations;\n const decoLine = style.textDecorationLine;\n if (decoLine && decoLine !== 'none') {\n const color = parseColor(style.textDecorationColor) ?? parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 };\n decorations = [...decorations, { line: decoLine, color }];\n }\n\n if (clipBox) {\n clipSaved = out;\n out = [];\n }\n const next = { z, alpha, decorations };\n // \u30A4\u30F3\u30E9\u30A4\u30F3 SVG: \u5B50\u306F SVG \u306E\u898F\u5247\u3067\u8D70\u67FB\u3057\u3066\u30D1\u30B9\u306B\u5909\u63DB\u3059\u308B\n if (el.tagName === 'svg' && el.namespaceURI === SVG_NS) {\n paintSvgChildren(el, alpha, z);\n if (clipBox && clipSaved) finishClip(clipBox, clipSaved, z);\n return;\n }\n for (const node of flatChildNodes(el)) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (visible) paintText(/** @type {Text} */ (node), el, style, next);\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n await visit(/** @type {Element} */ (node), next);\n }\n }\n if (clipBox && clipSaved) finishClip(clipBox, clipSaved, z);\n\n if ((isHead || isFoot) && currentTable && groupStart >= 0) {\n const r = el.getBoundingClientRect();\n const items = out.slice(groupStart);\n if (isHead) {\n currentTable.headTop = r.top + sy;\n currentTable.headBottom = r.bottom + sy;\n currentTable.headItems = items;\n } else {\n currentTable.footTop = r.top + sy;\n currentTable.footBottom = r.bottom + sy;\n currentTable.footItems = items;\n }\n }\n currentTable = savedTable;\n }\n\n /** @param {Element} el @param {CSSStyleDeclaration} style */\n function warnUnsupported(el, style) {\n for (const [prop, isSet] of UNSUPPORTED) {\n const v = String(style[prop] ?? '');\n if (isSet(v)) {\n warnOnce(`css:${prop}`, {\n code: 'unsupported-css',\n message: `CSS property \"${camelToKebab(prop)}\" is not supported in this version and will be ignored (first seen on <${el.tagName.toLowerCase()}>: ${v})`,\n element: el,\n property: camelToKebab(prop),\n });\n }\n }\n if (/^matrix3d/.test(style.transform)) {\n warnOnce('css:transform3d', { code: 'unsupported-css', message: '3D transforms are not supported; the element is drawn untransformed', element: el, property: 'transform' });\n }\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n function paintBackground(r, style, alpha, z, radius) {\n const bg = parseColor(style.backgroundColor);\n if (!bg || bg.a <= 0) return;\n /** @type {RectItem} */\n const item = { type: 'rect', x: r.left + sx, y: r.top + sy, w: r.width, h: r.height, color: withAlpha(bg, alpha), z, seq: seq++ };\n if (radius) item.radius = radius;\n out.push(item);\n }\n\n /**\n * @param {Element} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintBackgroundImage(el, r, style, alpha, z, radius) {\n if (style.backgroundImage === 'none') return;\n\n // background-origin / clip\uFF08\u65E2\u5B9A: padding-box / border-box\uFF09\n const bgClip = boxFor(r, style, style.backgroundClip || 'border-box', radius);\n const bgOrigin = boxFor(r, style, style.backgroundOrigin || 'padding-box', null);\n\n // linear-gradient \u306F PDF \u306E\u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3067\u63CF\u304F\n const gradient = parseLinearGradient(style.backgroundImage, bgOrigin.w, bgOrigin.h);\n if (gradient) {\n out.push({ type: 'gradient', box: bgOrigin, clip: bgClip, gradient, alpha, z, seq: seq++ });\n return;\n }\n\n const url = parseBackgroundUrl(style.backgroundImage);\n if (!url) {\n warnOnce('css:backgroundImage', {\n code: 'unsupported-css',\n message: `background-image \"${style.backgroundImage}\" is not supported (a single url() or linear-gradient() is); ignored`,\n element: el,\n property: 'background-image',\n });\n return;\n }\n const img = await loadImage(new URL(url, el.ownerDocument.baseURI).href, ctx.warn, el);\n if (!img) return;\n const fit = fitImage(bgOrigin, img.width, img.height, style.backgroundSize, style.backgroundPosition);\n\n // background-repeat: \u8EF8\u3054\u3068\u306B\u30BF\u30A4\u30EB\u4F4D\u7F6E\u3092\u6C42\u3081\u3001\u63CF\u753B\u9818\u57DF\uFF08bgClip\uFF09\u3092\u8986\u3046\u307E\u3067\u4E26\u3079\u308B\n const [rx, ry] = splitRepeat(style.backgroundRepeat);\n const ax = tileAxis(rx, fit.x, fit.w, bgClip.x, bgClip.x + bgClip.w);\n const ay = tileAxis(ry, fit.y, fit.h, bgClip.y, bgClip.y + bgClip.h);\n const count = ax.positions.length * ay.positions.length;\n if (count > MAX_BG_TILES) {\n warnOnce('css:backgroundRepeat', {\n code: 'unsupported-css',\n message: `background-repeat would need ${count} tiles (limit ${MAX_BG_TILES}); drawn once instead. Use a larger background-size or a pre-tiled image.`,\n element: el,\n property: 'background-repeat',\n });\n out.push({ type: 'image', ...fit, image: img, clip: bgClip, alpha, z, seq: seq++ });\n return;\n }\n for (const y of ay.positions) {\n for (const x of ax.positions) {\n out.push({ type: 'image', x, y, w: ax.size, h: ay.size, image: img, clip: bgClip, alpha, z, seq: seq++ });\n }\n }\n }\n\n /**\n * @param {HTMLImageElement} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintImg(el, r, style, alpha, z, radius) {\n const src = el.currentSrc || el.src;\n if (!src) return;\n const img = await loadImage(src, ctx.warn, el);\n if (!img) return;\n const content = boxFor(r, style, 'content-box', radius);\n const fit = fitImage(content, img.width, img.height, objectFitToSize(style.objectFit), style.objectPosition);\n if (style.objectFit === 'scale-down' && (fit.w > img.width || fit.h > img.height)) {\n Object.assign(fit, fitImage(content, img.width, img.height, 'auto', style.objectPosition));\n }\n out.push({ type: 'image', ...fit, image: img, clip: content, alpha, z, seq: seq++ });\n }\n\n /**\n * border-box \u306E\u77E9\u5F62\u304B\u3089\u6307\u5B9A\u30DC\u30C3\u30AF\u30B9\u3092\u6C42\u3081\u308B\u3002\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {string} box 'border-box' | 'padding-box' | 'content-box'\n * @param {Radius|null} radius\n * @returns {Box}\n */\n function boxFor(r, style, box, radius) {\n let x = r.left + sx;\n let y = r.top + sy;\n let w = r.width;\n let h = r.height;\n if (box === 'padding-box' || box === 'content-box') {\n const bt = cssPx(style.borderTopWidth);\n const br = cssPx(style.borderRightWidth);\n const bb = cssPx(style.borderBottomWidth);\n const bl = cssPx(style.borderLeftWidth);\n x += bl;\n y += bt;\n w -= bl + br;\n h -= bt + bb;\n if (radius) radius = /** @type {Radius} */ (radius.map((v) => Math.max(0, v - Math.max(bt, br, bb, bl))));\n }\n if (box === 'content-box') {\n const pt = cssPx(style.paddingTop);\n const pr = cssPx(style.paddingRight);\n const pb = cssPx(style.paddingBottom);\n const pl = cssPx(style.paddingLeft);\n x += pl;\n y += pt;\n w -= pl + pr;\n h -= pt + pb;\n }\n /** @type {Box} */\n const b = { x, y, w: Math.max(0, w), h: Math.max(0, h) };\n if (radius && radius.some((v) => v > 0)) b.radius = radius;\n return b;\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {boolean} collapse border-collapse: collapse \u306E\u30C6\u30FC\u30D6\u30EB\u8981\u7D20\u304B\uFF08\u5883\u754C\u7DDA\u3092\u8FBA\u306E\u4E2D\u5FC3\u306B\u63CF\u304F\uFF09\n * @param {Radius|null} radius\n */\n function paintBorders(r, style, alpha, z, collapse, radius) {\n const x = r.left + sx;\n const y = r.top + sy;\n const w = r.width;\n const h = r.height;\n /** @type {('Top'|'Right'|'Bottom'|'Left')[]} */\n const names = ['Top', 'Right', 'Bottom', 'Left'];\n const sides = names.map((side) => ({\n side,\n width: cssPx(/** @type {string} */ (style[`border${side}Width`])),\n style: /** @type {string} */ (style[`border${side}Style`]),\n color: parseColor(/** @type {string} */ (style[`border${side}Color`])),\n }));\n const drawn = sides.filter((s) => s.width > 0 && s.style !== 'none' && s.style !== 'hidden' && s.color && s.color.a > 0);\n if (!drawn.length) return;\n\n // \u89D2\u4E38: 4 \u8FBA\u304C\u540C\u3058\u5E45\u30FB\u8272\u30FB\u30B9\u30BF\u30A4\u30EB\u306A\u3089\u89D2\u4E38\u30D1\u30B9\u3092\u30B9\u30C8\u30ED\u30FC\u30AF\u3059\u308B\n if (radius && radius.some((v) => v > 0)) {\n const f = /** @type {typeof drawn[0]} */ (drawn[0]);\n const uniform =\n drawn.length === 4 &&\n drawn.every((s) => s.width === f.width && s.style === f.style && JSON.stringify(s.color) === JSON.stringify(f.color));\n if (uniform) {\n const bw = f.width;\n out.push({\n type: 'stroke-rrect',\n x: x + bw / 2,\n y: y + bw / 2,\n w: w - bw,\n h: h - bw,\n radius: /** @type {Radius} */ (radius.map((v) => Math.max(0, v - bw / 2))),\n width: bw,\n color: withAlpha(/** @type {Rgba} */ (f.color), alpha),\n dash: dashFor(f.style, bw),\n z,\n seq: seq++,\n });\n return;\n }\n warnOnce('css:borderRadiusNonUniform', {\n code: 'unsupported-css',\n message: 'border-radius with non-uniform borders is approximated with straight borders',\n property: 'border-radius',\n });\n }\n\n for (const s of drawn) {\n const bw = s.width;\n const c = withAlpha(/** @type {Rgba} */ (s.color), alpha);\n const horizontal = s.side === 'Top' || s.side === 'Bottom';\n const dir = s.side === 'Top' || s.side === 'Left' ? 1 : -1;\n const edge = s.side === 'Top' ? y : s.side === 'Bottom' ? y + h : s.side === 'Left' ? x : x + w;\n const dash = dashFor(s.style, bw);\n if (dash) {\n const center = collapse ? edge : edge + (bw / 2) * dir;\n out.push({\n type: 'line',\n x1: horizontal ? x : center,\n y1: horizontal ? center : y,\n x2: horizontal ? x + w : center,\n y2: horizontal ? center : y + h,\n width: bw,\n color: c,\n dash,\n z,\n seq: seq++,\n });\n continue;\n }\n // solid / double / groove / ridge / inset / outset \u306F\u5857\u308A\u77E9\u5F62\u3067\u8FD1\u4F3C\n const start = collapse ? edge - bw / 2 : dir > 0 ? edge : edge - bw;\n if (horizontal) out.push({ type: 'rect', x, y: start, w, h: bw, color: c, z, seq: seq++ });\n else out.push({ type: 'rect', x: start, y, w: bw, h, color: c, z, seq: seq++ });\n }\n }\n\n /**\n * @param {Text} node\n * @param {Element} parent\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inh\n */\n function paintText(node, parent, style, inh) {\n const raw = node.data;\n if (!raw) return;\n if (!/\\S/.test(raw) && !raw.includes('\u00A0')) {\n const range = node.ownerDocument.createRange();\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some((r) => r.width > 0)) return;\n }\n\n const color = withAlpha(parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 }, inh.alpha);\n const size = cssPx(style.fontSize);\n if (size <= 0) return;\n const families = splitFamilies(style.fontFamily);\n const weight = parseWeight(style.fontWeight);\n const fstyle = /** @type {'normal'|'italic'} */ (style.fontStyle === 'italic' || style.fontStyle === 'oblique' ? 'italic' : 'normal');\n\n const primary = ctx.registry.match(families, weight, fstyle) ?? ctx.registry.match(ctx.fontFallback, weight, fstyle);\n if (!primary) {\n const key = families.join(',');\n if (!missingFamilies.has(key)) {\n missingFamilies.add(key);\n ctx.warn({\n code: 'missing-font',\n message: `No registered font matches font-family \"${style.fontFamily}\" and no fallback is available; text will be skipped`,\n element: parent,\n });\n }\n return;\n }\n\n const lines = measureText(node, style, {\n registry: ctx.registry,\n families,\n fallback: ctx.fontFallback,\n primary,\n weight,\n fstyle,\n size,\n textMeasure: ctx.textMeasure,\n features: featureTagsOf(style),\n warn: ctx.warn,\n element: parent,\n });\n\n for (const line of lines) {\n if (!line.glyphs.length) continue;\n atoms.push({ top: line.top + sy, bottom: line.bottom + sy });\n out.push({\n type: 'text',\n x: line.glyphs[0]?.x ?? 0,\n y: line.baseline + sy,\n top: line.top + sy,\n bottom: line.bottom + sy,\n size,\n color,\n font: line.font,\n glyphs: line.glyphs.map((g) => ({ ...g, x: g.x + sx })),\n z: inh.z,\n seq: seq++,\n });\n for (const deco of inh.decorations) {\n const first = line.glyphs[0];\n const last = line.glyphs[line.glyphs.length - 1];\n if (!first || !last) continue;\n const x1 = first.x + sx;\n const x2 = last.x + last.advance + sx;\n const thickness = Math.max(1, size / 14);\n const c = withAlpha(deco.color, inh.alpha);\n if (deco.line.includes('underline')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy + size * 0.08, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n if (deco.line.includes('line-through')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy - size * 0.3, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n }\n }\n }\n\n await visit(root, { z: 0, alpha: 1, decorations: [] });\n sortItems(rootItems);\n // \u6587\u66F8\u306E\u9AD8\u3055: body \u306E\u4E0B\u7AEF\u3068\u3001\u306F\u307F\u51FA\u3057\u305F\u547D\u4EE4\uFF08\u7D76\u5BFE\u914D\u7F6E\u306A\u3069\uFF09\u306E\u4E0B\u7AEF\u306E\u5927\u304D\u3044\u65B9\u3002\n // body.scrollHeight \u306F\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u9AD8\u3055\u306B\u81A8\u3089\u3080\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u4F7F\u308F\u306A\u3044\u3002\n let height = root.getBoundingClientRect().bottom + sy;\n for (const it of rootItems) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') height = Math.max(height, it.y + it.h);\n else if (it.type === 'line') height = Math.max(height, it.y1, it.y2);\n else if (it.type === 'text' || it.type === 'group' || it.type === 'clip') height = Math.max(height, it.bottom);\n }\n /**\n * \u30A4\u30F3\u30E9\u30A4\u30F3 SVG \u306E\u5B50\u8981\u7D20\u3092\u8D70\u67FB\u3057\u3001\u56F3\u5F62\u3092\u30D1\u30B9\u547D\u4EE4\u306B\u5909\u63DB\u3059\u308B\u3002\n * viewBox \u3084\u30D7\u30EC\u30BC\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u5C5E\u6027\u306E\u89E3\u6C7A\u306F\u30D6\u30E9\u30A6\u30B6\u306B\u4EFB\u305B\u3001\n * \u5909\u63DB\u884C\u5217\u306F getScreenCTM()\u3001\u5857\u308A\u3068\u7DDA\u306F getComputedStyle() \u304B\u3089\u53D6\u308B\u3002\n *\n * @param {Element} container\n * @param {number} alpha\n * @param {number} z\n */\n function paintSvgChildren(container, alpha, z) {\n for (const child of container.children) {\n if (child.namespaceURI !== SVG_NS) continue;\n const tag = child.tagName;\n if (SVG_NON_RENDERED.has(tag)) continue;\n const style = win.getComputedStyle(child);\n if (style.display === 'none') continue;\n const op = parseFloat(style.opacity);\n const a = alpha * (Number.isFinite(op) ? op : 1);\n if (a <= 0) continue;\n\n if (SVG_CONTAINERS.has(tag)) {\n paintSvgChildren(child, a, z);\n continue;\n }\n\n // \u5E7E\u4F55\u30D7\u30ED\u30D1\u30C6\u30A3\u306F computed style \u3092\u512A\u5148\u3059\u308B\uFF08% \u6307\u5B9A\u306A\u3069\u3092\u30D6\u30E9\u30A6\u30B6\u306B\u89E3\u6C7A\u3055\u305B\u308B\uFF09\n const attr = (/** @type {string} */ name) => {\n const v = style.getPropertyValue(name);\n if (v && /^-?[\\d.]+px$/.test(v)) return String(parseFloat(v));\n return child.getAttribute(name) ?? '';\n };\n const segs = shapeToPath(child, attr);\n if (segs === null) {\n warnOnce(`svg:${tag}`, {\n code: 'unsupported-css',\n message: `<${tag}> inside an inline <svg> is not supported and was skipped (shapes are: path, rect, circle, ellipse, line, polyline, polygon)`,\n element: child,\n });\n continue;\n }\n if (!segs.length || style.visibility !== 'visible') continue;\n\n const ctm = /** @type {SVGGraphicsElement} */ (/** @type {unknown} */ (child)).getScreenCTM?.();\n if (!ctm) continue;\n const fill = svgPaint(child, style.fill, style.fillOpacity, a, 'fill');\n const stroke = svgStroke(child, style, a);\n if (!fill && !stroke) continue;\n\n const r = child.getBoundingClientRect();\n out.push({\n type: 'path',\n segs,\n matrix: [ctm.a, ctm.b, ctm.c, ctm.d, ctm.e + sx, ctm.f + sy],\n fill,\n evenOdd: style.fillRule === 'evenodd',\n stroke,\n top: r.top + sy,\n bottom: r.bottom + sy,\n z,\n seq: seq++,\n });\n }\n }\n\n /**\n * SVG \u306E paint \u5024\uFF08`none` / `rgb(...)` / `url(#id)`\uFF09\u3092\u8272\u306B\u3059\u308B\u3002\u5857\u3089\u306A\u3044\u306A\u3089 null\u3002\n * @param {Element} el\n * @param {string} value\n * @param {string} opacity\n * @param {number} alpha\n * @param {'fill'|'stroke'} kind\n * @returns {Rgba|null}\n */\n function svgPaint(el, value, opacity, alpha, kind) {\n if (!value || value === 'none') return null;\n if (value.startsWith('url(')) {\n warnOnce(`svg:${kind}:url`, {\n code: 'unsupported-css',\n message: `${kind} with a paint server (${value}) inside an inline <svg> is not supported; the shape is skipped`,\n element: el,\n property: kind,\n });\n return null;\n }\n const c = parseColor(value);\n if (!c) return null;\n const o = parseFloat(opacity);\n const f = alpha * (Number.isFinite(o) ? o : 1);\n return f === 1 ? c : { ...c, a: c.a * f };\n }\n\n /**\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @returns {PathStroke|null}\n */\n function svgStroke(el, style, alpha) {\n const color = svgPaint(el, style.stroke, style.strokeOpacity, alpha, 'stroke');\n if (!color) return null;\n const width = cssPx(style.strokeWidth);\n if (!(width > 0)) return null;\n const dashes = (style.strokeDasharray || 'none')\n .split(/[\\s,]+/)\n .map((v) => cssPx(v))\n .filter((v) => Number.isFinite(v) && v >= 0);\n const cap = style.strokeLinecap === 'round' ? 1 : style.strokeLinecap === 'square' ? 2 : 0;\n const join = style.strokeLinejoin === 'round' ? 1 : style.strokeLinejoin === 'bevel' ? 2 : 0;\n const miter = parseFloat(style.strokeMiterlimit);\n return {\n color,\n width,\n cap: /** @type {0|1|2} */ (cap),\n join: /** @type {0|1|2} */ (join),\n miter: Number.isFinite(miter) && miter >= 1 ? miter : 4,\n dash: dashes.length && dashes.some((v) => v > 0) ? dashes : null,\n dashOffset: cssPx(style.strokeDashoffset) || 0,\n };\n }\n\n /**\n * overflow \u30AF\u30EA\u30C3\u30D7\u3092\u9589\u3058\u308B\u3002\u7BC4\u56F2\u5916\u306E\u547D\u4EE4\u306F\u6368\u3066\u308B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\u3002\n * @param {Box} clipBox\n * @param {DisplayItem[]} saved\n * @param {number} z\n */\n function finishClip(clipBox, saved, z) {\n const inside = out.filter((it) => intersects(it, clipBox));\n out = saved;\n if (inside.length) {\n out.push({ type: 'clip', box: clipBox, items: inside, top: clipBox.y, bottom: clipBox.y + clipBox.h, z, seq: seq++ });\n }\n }\n\n /**\n * el \u306E\u5B50\u5B6B\u3092\u98DB\u3070\u3057\u3066\u3001\u6587\u66F8\u9806\u3067\u6B21\u306B\u73FE\u308C\u308B\u7BB1\u3092\u8FD4\u3059\u3002\n * \u5144\u5F1F\u304C\u7121\u3051\u308C\u3070\u89AA\u3092\u3055\u304B\u306E\u307C\u308B\u306E\u3067\u3001`<section>` \u306E\u6700\u5F8C\u306E\u898B\u51FA\u3057\u306B break-after: avoid \u3092\u66F8\u3044\u3066\u3082\n * \u6B21\u306E `<section>` \u3068\u7D50\u3073\u3064\u304F\u3002\n * @param {Element} el\n * @returns {{top: number, bottom: number}|null}\n */\n function nextBoxAfter(el) {\n /** @type {Element|null} */\n let node = el;\n while (node && node !== root) {\n for (let sib = node.nextElementSibling; sib; sib = sib.nextElementSibling) {\n const box = edgeBoxIn(sib, 'first');\n if (box) return box;\n }\n node = node.parentElement;\n }\n return null;\n }\n\n /**\n * el \u306E\u5B50\u5B6B\u3068\u7956\u5148\u3092\u98DB\u3070\u3057\u3066\u3001\u6587\u66F8\u9806\u3067\u76F4\u524D\u306B\u73FE\u308C\u308B\u7BB1\u3092\u8FD4\u3059\u3002\n * @param {Element} el\n * @returns {{top: number, bottom: number}|null}\n */\n function prevBoxBefore(el) {\n /** @type {Element|null} */\n let node = el;\n while (node && node !== root) {\n for (let sib = node.previousElementSibling; sib; sib = sib.previousElementSibling) {\n const box = edgeBoxIn(sib, 'last');\n if (box) return box;\n }\n node = node.parentElement;\n }\n return null;\n }\n\n /**\n * el \u81EA\u8EAB\u304C\u7BB1\u306A\u3089\u305D\u308C\u3092\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070\uFF08display: contents / inline\u3001\u9AD8\u3055 0\uFF09\n * \u5B50\u5B6B\u306E\u6700\u521D\uFF0F\u6700\u5F8C\u306E\u7BB1\u3092\u8FD4\u3059\u3002\n * @param {Element} el\n * @param {'first'|'last'} side\n * @returns {{top: number, bottom: number}|null}\n */\n function edgeBoxIn(el, side) {\n if (SKIP_TAGS.has(el.tagName)) return null;\n const style = win.getComputedStyle(el);\n if (style.display === 'none') return null;\n if (style.display !== 'contents' && style.display !== 'inline') {\n const r = el.getBoundingClientRect();\n if (r.height > 0) return { top: r.top + sy, bottom: r.bottom + sy };\n }\n const children = [...el.children];\n if (side === 'last') children.reverse();\n for (const child of children) {\n const box = edgeBoxIn(child, side);\n if (box) return box;\n }\n return null;\n }\n\n return { items: rootItems, atoms, breaks, joins, tables, height };\n}\n\n/** @param {DisplayItem[]} items */\nfunction sortItems(items) {\n items.sort((a, b) => a.z - b.z || a.seq - b.seq);\n for (const it of items) if (it.type === 'group' || it.type === 'clip') sortItems(it.items);\n}\n\n/**\n * @param {string} style border-style\n * @param {number} bw\n * @returns {number[]|null}\n */\nfunction dashFor(style, bw) {\n if (style === 'dashed') return [bw * 3, bw * 3];\n if (style === 'dotted') return [bw, bw];\n return null;\n}\n\n/**\n * computed border-*-radius\uFF08'4px' / '4px 6px' / '50%'\uFF09\u3092 px \u306E Radius \u306B\u3059\u308B\u3002\n * \u6955\u5186\u306F\u6C34\u5E73\u65B9\u5411\u306E\u534A\u5F84\u3067\u8FD1\u4F3C\u3059\u308B\u3002\n * @param {CSSStyleDeclaration} style\n * @param {DOMRect} r\n * @returns {Radius|null}\n */\nfunction parseRadius(style, r) {\n const one = (/** @type {string} */ v) => {\n const first = v.trim().split(/\\s+/)[0] ?? '0px';\n return first.endsWith('%') ? (parseFloat(first) / 100) * r.width : cssPx(first);\n };\n const radius = /** @type {Radius} */ ([\n one(style.borderTopLeftRadius),\n one(style.borderTopRightRadius),\n one(style.borderBottomRightRadius),\n one(style.borderBottomLeftRadius),\n ]);\n return radius.some((v) => v > 0) ? radius : null;\n}\n\n/**\n * computed transform\uFF08'matrix(a, b, c, d, e, f)'\uFF09\u3092\u89E3\u6790\u3059\u308B\u3002none / 3D \u306F null\u3002\n * @param {string} value\n * @returns {[number, number, number, number, number, number]|null}\n */\nexport function parseTransform(value) {\n if (!value || value === 'none') return null;\n const m = /^matrix\\(([^)]+)\\)$/.exec(value.trim());\n if (!m) return null;\n const n = /** @type {string} */ (m[1]).split(',').map((s) => parseFloat(s));\n if (n.length !== 6 || n.some((v) => !Number.isFinite(v))) return null;\n const [a, b, c, d, e, f] = /** @type {[number, number, number, number, number, number]} */ (n);\n if (a === 1 && b === 0 && c === 0 && d === 1 && e === 0 && f === 0) return null;\n return [a, b, c, d, e, f];\n}\n\n/**\n * computed transform-origin\uFF08'40px 20px' \u307E\u305F\u306F 3 \u5024\uFF09\u2192 [x, y] px\n * @param {string} value\n * @returns {[number, number]}\n */\nfunction parseOrigin(value) {\n const parts = value.trim().split(/\\s+/);\n return [cssPx(parts[0] ?? '0'), cssPx(parts[1] ?? '0')];\n}\n\n/**\n * \u547D\u4EE4\u306E\u5916\u63A5\u77E9\u5F62\u304C\u30DC\u30C3\u30AF\u30B9\u3068\u91CD\u306A\u308B\u304B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u5B8C\u5168\u306B\u6D88\u3048\u308B\u547D\u4EE4\u306E\u9664\u53BB\u306B\u4F7F\u3046\uFF09\u3002\n * @param {DisplayItem} it\n * @param {Box} b\n */\nfunction intersects(it, b) {\n let x1;\n let y1;\n let x2;\n let y2;\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') {\n x1 = it.x; y1 = it.y; x2 = it.x + it.w; y2 = it.y + it.h;\n } else if (it.type === 'line') {\n x1 = Math.min(it.x1, it.x2) - it.width; y1 = Math.min(it.y1, it.y2) - it.width;\n x2 = Math.max(it.x1, it.x2) + it.width; y2 = Math.max(it.y1, it.y2) + it.width;\n } else if (it.type === 'text') {\n const last = it.glyphs[it.glyphs.length - 1];\n x1 = it.x; y1 = it.top; x2 = last ? last.x + last.advance : it.x; y2 = it.bottom;\n } else if (it.type === 'path') {\n return true; // \u5909\u63DB\u884C\u5217\u3067\u56DE\u8EE2\u3057\u3046\u308B\u306E\u3067\u5E38\u306B\u6B8B\u3059\n } else if (it.type === 'clip' || it.type === 'gradient') {\n const b2 = it.type === 'clip' ? it.box : it.clip;\n x1 = b2.x; y1 = b2.y; x2 = b2.x + b2.w; y2 = b2.y + b2.h;\n } else {\n return true; // group\uFF08transform\uFF09\u306F\u5883\u754C\u304C\u56DE\u8EE2\u3059\u308B\u306E\u3067\u5E38\u306B\u6B8B\u3059\n }\n return x2 > b.x && x1 < b.x + b.w && y2 > b.y && y1 < b.y + b.h;\n}\n\n/** @param {Rgba} c @param {number} alpha */\nfunction withAlpha(c, alpha) {\n return alpha === 1 ? c : { ...c, a: c.a * alpha };\n}\n\n/** @param {string} s */\nfunction camelToKebab(s) {\n return s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n", "// @ts-check\n/**\n * Web \u6A19\u6E96 CompressionStream \u306B\u3088\u308B zlib (FlateDecode) \u5727\u7E2E\u3002\n * \u672A\u5BFE\u5FDC\u74B0\u5883\u3067\u306F null \u3092\u8FD4\u3057\u3001\u547C\u3073\u51FA\u3057\u5074\u306F\u7121\u5727\u7E2E\u3067\u51FA\u529B\u3059\u308B\u3002\n */\n\n/**\n * @returns {boolean}\n */\nexport function canCompress() {\n return typeof CompressionStream === 'function';\n}\n\n/**\n * @param {Uint8Array} bytes\n * @returns {Promise<Uint8Array|null>} zlib \u5F62\u5F0F\uFF08PDF \u306E FlateDecode \u304C\u671F\u5F85\u3059\u308B\u5F62\u5F0F\uFF09\n */\nexport async function deflate(bytes) {\n if (!canCompress()) return null;\n try {\n const cs = new CompressionStream('deflate');\n const writer = cs.writable.getWriter();\n void writer.write(/** @type {Uint8Array<ArrayBuffer>} */ (bytes));\n void writer.close();\n const buf = await new Response(cs.readable).arrayBuffer();\n return new Uint8Array(buf);\n } catch {\n return null;\n }\n}\n", "// @ts-check\n/**\n * \u6700\u5C0F\u9650\u306E PDF \u30E9\u30A4\u30BF\u30FC\u3002\n * \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u30E1\u30E2\u30EA\u4E0A\u306B\u4FDD\u6301\u3057\u3001build() \u3067 xref / trailer \u3092\u542B\u3080\u30D0\u30A4\u30C8\u5217\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n */\nimport { deflate } from './compress.js';\nimport { num } from '../units.js';\n\n/** \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u53C2\u7167 */\nexport class Ref {\n /** @param {number} id */\n constructor(id) {\n this.id = id;\n }\n toString() {\n return `${this.id} 0 R`;\n }\n}\n\n/** PDF \u540D\u524D\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF08/Name\uFF09 */\nexport class Name {\n /** @param {string} name */\n constructor(name) {\n this.name = name;\n }\n toString() {\n // \u533A\u5207\u308A\u6587\u5B57\u30FB\u975E ASCII \u306F #xx \u3067\u30A8\u30B9\u30B1\u30FC\u30D7\n let out = '/';\n for (const ch of this.name) {\n const c = ch.charCodeAt(0);\n if (c < 0x21 || c > 0x7e || '#/%()<>[]{}'.includes(ch)) {\n for (const b of new TextEncoder().encode(ch)) out += '#' + b.toString(16).padStart(2, '0');\n } else out += ch;\n }\n return out;\n }\n}\n\n/** \u30D0\u30A4\u30C8\u5217\u305D\u306E\u307E\u307E\uFF08\u65E2\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u6E08\u307F\u306E\u65AD\u7247\uFF09 */\nexport class Raw {\n /** @param {string} text */\n constructor(text) {\n this.text = text;\n }\n toString() {\n return this.text;\n }\n}\n\n/**\n * PDF \u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u3002ASCII \u306E\u307F\u306A\u3089\u30EA\u30C6\u30E9\u30EB\u6587\u5B57\u5217\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 UTF-16BE (BOM \u4ED8\u304D) \u306E 16 \u9032\u6587\u5B57\u5217\u3002\n * @param {string} s\n * @returns {Raw}\n */\nexport function pdfString(s) {\n // eslint-disable-next-line no-control-regex\n if (/^[\\x20-\\x7e]*$/.test(s)) {\n return new Raw('(' + s.replace(/[\\\\()]/g, (c) => '\\\\' + c) + ')');\n }\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).padStart(4, '0');\n return new Raw('<' + hex + '>');\n}\n\n/**\n * PDF \u65E5\u4ED8\u6587\u5B57\u5217 (D:YYYYMMDDHHmmSS+HH'mm')\n * @param {Date} d\n * @returns {Raw}\n */\nexport function pdfDate(d) {\n const p = (/** @type {number} */ n) => String(n).padStart(2, '0');\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = p(Math.floor(Math.abs(tz) / 60));\n const tzm = p(Math.abs(tz) % 60);\n return new Raw(\n `(D:${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}${sign}${tzh}'${tzm}')`,\n );\n}\n\n/**\n * @typedef {number|string|boolean|null|Ref|Name|Raw|PdfArray|PdfDict} PdfValue\n */\n/** @typedef {PdfValue[]} PdfArray */\n/** @typedef {{[key: string]: PdfValue}} PdfDict */\n\n/**\n * \u5024\u3092 PDF \u69CB\u6587\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u3059\u308B\u3002\n * - number \u2192 \u6570\u5024\u3001boolean \u2192 true/false\u3001null \u2192 null\n * - string \u2192 \u540D\u524D (/Foo)\u3002\u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u306F pdfString() \u3067 Raw \u306B\u3057\u3066\u6E21\u3059\n * - \u914D\u5217 \u2192 [ ... ]\u3001\u30D7\u30EC\u30FC\u30F3\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 \u2192 << /Key value ... >>\n * @param {PdfValue} v\n * @returns {string}\n */\nexport function serialize(v) {\n if (v === null) return 'null';\n if (typeof v === 'number') return num(v);\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (typeof v === 'string') return new Name(v).toString();\n if (v instanceof Ref || v instanceof Name || v instanceof Raw) return v.toString();\n if (Array.isArray(v)) return '[' + v.map(serialize).join(' ') + ']';\n const parts = [];\n for (const [k, val] of Object.entries(v)) {\n if (val === undefined) continue;\n parts.push(new Name(k).toString() + ' ' + serialize(val));\n }\n return '<< ' + parts.join(' ') + ' >>';\n}\n\n/**\n * @typedef {object} PdfObject\n * @property {PdfValue} value\n * @property {Uint8Array} [stream]\n */\n\nexport class PdfWriter {\n /**\n * @param {{compress?: boolean, version?: string}} [options]\n */\n constructor(options = {}) {\n /** @type {(PdfObject|null)[]} 0 \u756A\u306F\u30D5\u30EA\u30FC\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 */\n this.objects = [null];\n this.compress = options.compress ?? true;\n this.version = options.version ?? '1.7';\n }\n\n /**\n * \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u4E88\u7D04\u3059\u308B\uFF08\u5F8C\u3067 set \u3067\u4E2D\u8EAB\u3092\u5165\u308C\u308B\uFF09\u3002\n * @returns {Ref}\n */\n reserve() {\n this.objects.push({ value: null });\n return new Ref(this.objects.length - 1);\n }\n\n /**\n * @param {Ref} ref\n * @param {PdfValue} value\n * @param {Uint8Array} [stream]\n */\n set(ref, value, stream) {\n this.objects[ref.id] = { value, stream };\n }\n\n /**\n * @param {PdfValue} value\n * @returns {Ref}\n */\n add(value) {\n const ref = this.reserve();\n this.set(ref, value);\n return ref;\n }\n\n /**\n * \u30B9\u30C8\u30EA\u30FC\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u3002compress \u304C\u6709\u52B9\u306A\u3089 FlateDecode \u3092\u8A66\u307F\u308B\u3002\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n * @returns {Promise<Ref>}\n */\n async addStream(dict, bytes, opts = {}) {\n const ref = this.reserve();\n await this.setStream(ref, dict, bytes, opts);\n return ref;\n }\n\n /**\n * @param {Ref} ref\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n */\n async setStream(ref, dict, bytes, opts = {}) {\n let data = bytes;\n const d = { ...dict };\n const doCompress = opts.compress ?? this.compress;\n if (doCompress && !('Filter' in d)) {\n const z = await deflate(bytes);\n if (z && z.length < bytes.length) {\n data = z;\n d.Filter = 'FlateDecode';\n }\n }\n d.Length = data.length;\n this.set(ref, d, data);\n }\n\n /**\n * \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5168\u4F53\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {Ref} rootRef /Catalog \u3078\u306E\u53C2\u7167\n * @param {Ref} [infoRef] /Info \u3078\u306E\u53C2\u7167\n * @returns {Uint8Array}\n */\n build(rootRef, infoRef) {\n const enc = new TextEncoder();\n /** @type {Uint8Array[]} */\n const chunks = [];\n let offset = 0;\n const push = (/** @type {Uint8Array|string} */ c) => {\n const b = typeof c === 'string' ? enc.encode(c) : c;\n chunks.push(b);\n offset += b.length;\n };\n\n // \u30D8\u30C3\u30C0\u30FC\u30022 \u884C\u76EE\u306E\u30D0\u30A4\u30CA\u30EA\u30B3\u30E1\u30F3\u30C8\u306F\u30D5\u30A1\u30A4\u30EB\u304C\u30D0\u30A4\u30CA\u30EA\u3067\u3042\u308B\u3053\u3068\u3092\u8EE2\u9001\u7CFB\u306B\u77E5\u3089\u305B\u308B\u6163\u4F8B\n push(concat([enc.encode(`%PDF-${this.version}\\n%`), new Uint8Array([0xe2, 0xe3, 0xcf, 0xd3]), enc.encode('\\n')]));\n\n /** @type {number[]} */\n const offsets = [];\n for (let i = 1; i < this.objects.length; i++) {\n const obj = this.objects[i];\n if (!obj) throw new Error(`PDF object ${i} was reserved but never set`);\n offsets[i] = offset;\n push(`${i} 0 obj\\n${serialize(obj.value)}\\n`);\n if (obj.stream) {\n push('stream\\n');\n push(obj.stream);\n push('\\nendstream\\n');\n }\n push('endobj\\n');\n }\n\n const xrefOffset = offset;\n let xref = `xref\\n0 ${this.objects.length}\\n0000000000 65535 f \\n`;\n for (let i = 1; i < this.objects.length; i++) {\n xref += String(offsets[i]).padStart(10, '0') + ' 00000 n \\n';\n }\n push(xref);\n /** @type {{[key: string]: PdfValue}} */\n const trailer = { Size: this.objects.length, Root: rootRef };\n if (infoRef) trailer.Info = infoRef;\n push(`trailer\\n${serialize(trailer)}\\nstartxref\\n${xrefOffset}\\n%%EOF\\n`);\n\n return concat(chunks);\n }\n}\n\n/**\n * @param {Uint8Array[]} chunks\n * @returns {Uint8Array}\n */\nexport function concat(chunks) {\n let len = 0;\n for (const c of chunks) len += c.length;\n const out = new Uint8Array(len);\n let o = 0;\n for (const c of chunks) {\n out.set(c, o);\n o += c.length;\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u30DA\u30FC\u30B8\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u30D3\u30EB\u30C0\u30FC\u3002\n * \u5EA7\u6A19\u306F PDF \u5EA7\u6A19\u7CFB\uFF08\u5DE6\u4E0B\u539F\u70B9\u3001pt\uFF09\u3067\u53D7\u3051\u53D6\u308B\u3002CSS \u5EA7\u6A19\u304B\u3089\u306E\u5909\u63DB\u306F\u547C\u3073\u51FA\u3057\u5074\uFF08page.js\uFF09\u304C\u884C\u3046\u3002\n */\nimport { num } from '../units.js';\n\nexport class ContentStream {\n constructor() {\n /** @type {string[]} */\n this.ops = [];\n this.depth = 0;\n }\n\n save() {\n this.ops.push('q');\n this.depth++;\n return this;\n }\n\n restore() {\n if (this.depth <= 0) throw new Error('ContentStream: unbalanced Q');\n this.ops.push('Q');\n this.depth--;\n return this;\n }\n\n /** @param {number} a @param {number} b @param {number} c @param {number} d @param {number} e @param {number} f */\n transform(a, b, c, d, e, f) {\n this.ops.push(`${num(a)} ${num(b)} ${num(c)} ${num(d)} ${num(e)} ${num(f)} cm`);\n return this;\n }\n\n /** @param {string} gsName ExtGState \u30EA\u30BD\u30FC\u30B9\u540D */\n setGState(gsName) {\n this.ops.push(`/${gsName} gs`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n fillColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} rg`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n strokeColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} RG`);\n return this;\n }\n\n /** @param {number} w */\n lineWidth(w) {\n this.ops.push(`${num(w)} w`);\n return this;\n }\n\n /** @param {number[]} pattern @param {number} [phase] */\n dash(pattern, phase = 0) {\n this.ops.push(`[${pattern.map(num).join(' ')}] ${num(phase)} d`);\n return this;\n }\n\n /** @param {0|1|2} cap */\n lineCap(cap) {\n this.ops.push(`${cap} J`);\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n rect(x, y, w, h) {\n this.ops.push(`${num(x)} ${num(y)} ${num(w)} ${num(h)} re`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n moveTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} m`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n lineTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} l`);\n return this;\n }\n\n /**\n * 3 \u6B21\u30D9\u30B8\u30A7\u66F2\u7DDA\n * @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2 @param {number} x3 @param {number} y3\n */\n curveTo(x1, y1, x2, y2, x3, y3) {\n this.ops.push(`${num(x1)} ${num(y1)} ${num(x2)} ${num(y2)} ${num(x3)} ${num(y3)} c`);\n return this;\n }\n\n closePath() {\n this.ops.push('h');\n return this;\n }\n\n /**\n * \u89D2\u4E38\u77E9\u5F62\u306E\u30D1\u30B9\u3092\u8FFD\u52A0\u3059\u308B\uFF08PDF \u5EA7\u6A19: y \u4E0A\u5411\u304D\u3001(x, y) \u306F\u5DE6\u4E0B\uFF09\u3002\n * @param {number} x @param {number} y @param {number} w @param {number} h\n * @param {[number, number, number, number]} r [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] \u306E\u534A\u5F84\uFF08pt\uFF09\u3002CSS \u306E\u9806\u5E8F\n */\n roundedRect(x, y, w, h, r) {\n const k = 0.5523; // 4/3\u00B7(\u221A2\u22121)\n const max = Math.min(w, h) / 2;\n const clamp = (/** @type {number} */ v) => Math.max(0, Math.min(v, max));\n const tl = clamp(r[0]);\n const tr = clamp(r[1]);\n const br = clamp(r[2]);\n const bl = clamp(r[3]);\n const top = y + h;\n const right = x + w;\n // \u5DE6\u4E0A\u304B\u3089\u6642\u8A08\u56DE\u308A\uFF08PDF \u5EA7\u6A19\u3067\u306F\u4E0A\u8FBA\u304C y+h\uFF09\n this.moveTo(x + tl, top);\n this.lineTo(right - tr, top);\n if (tr) this.curveTo(right - tr + tr * k, top, right, top - tr + tr * k, right, top - tr);\n this.lineTo(right, y + br);\n if (br) this.curveTo(right, y + br - br * k, right - br + br * k, y, right - br, y);\n this.lineTo(x + bl, y);\n if (bl) this.curveTo(x + bl - bl * k, y, x, y + bl - bl * k, x, y + bl);\n this.lineTo(x, top - tl);\n if (tl) this.curveTo(x, top - tl + tl * k, x + tl - tl * k, top, x + tl, top);\n return this.closePath();\n }\n\n /**\n * \u753B\u50CF XObject \u3092 (x, y) \u3092\u5DE6\u4E0B\u3068\u3057\u3066 w\u00D7h \u3067\u63CF\u304F\u3002\n * @param {string} name @param {number} x @param {number} y @param {number} w @param {number} h\n */\n image(name, x, y, w, h) {\n this.ops.push(`q ${num(w)} 0 0 ${num(h)} ${num(x)} ${num(y)} cm /${name} Do Q`);\n return this;\n }\n\n /** @param {0|1|2} join */\n lineJoin(join) {\n this.ops.push(`${join} j`);\n return this;\n }\n\n /** @param {number} limit */\n miterLimit(limit) {\n this.ops.push(`${num(limit)} M`);\n return this;\n }\n\n /** @param {boolean} [evenOdd] */\n fill(evenOdd = false) {\n this.ops.push(evenOdd ? 'f*' : 'f');\n return this;\n }\n\n /** \u5857\u308A\u3068\u7DDA\u306E\u4E21\u65B9\uFF08B / B*\uFF09 @param {boolean} [evenOdd] */\n fillAndStroke(evenOdd = false) {\n this.ops.push(evenOdd ? 'B*' : 'B');\n return this;\n }\n\n /**\n * \u6B63\u898F\u5316\u6E08\u307F\u306E\u30D1\u30B9\uFF08M / L / C / Z\uFF09\u3092\u51FA\u529B\u3059\u308B\u3002\n * @param {import('../walker/svg-path.js').PathSeg[]} segs\n */\n path(segs) {\n for (const s of segs) {\n if (s[0] === 'M') this.moveTo(s[1], s[2]);\n else if (s[0] === 'L') this.lineTo(s[1], s[2]);\n else if (s[0] === 'C') this.curveTo(s[1], s[2], s[3], s[4], s[5], s[6]);\n else this.closePath();\n }\n return this;\n }\n\n stroke() {\n this.ops.push('S');\n return this;\n }\n\n /**\n * \u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u73FE\u5728\u306E\u30AF\u30EA\u30C3\u30D7\u7BC4\u56F2\u3044\u3063\u3071\u3044\u306B\u5857\u308B\u3002\n * @param {string} name Shading \u30EA\u30BD\u30FC\u30B9\u540D\n */\n shading(name) {\n this.ops.push(`/${name} sh`);\n return this;\n }\n\n /** \u73FE\u5728\u306E\u30D1\u30B9\u3067\u30AF\u30EA\u30C3\u30D7\u3057\u3066\u65B0\u3057\u3044\u30D1\u30B9\u3092\u958B\u59CB\u3059\u308B */\n clip() {\n this.ops.push('W n');\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n fillRect(x, y, w, h) {\n return this.rect(x, y, w, h).fill();\n }\n\n /**\n * \u30C6\u30AD\u30B9\u30C8\u3092\u63CF\u753B\u3059\u308B\u3002\n * @param {string} fontName \u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n * @param {number} size \u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA (pt)\n * @param {number} x \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u59CB\u70B9 x (pt)\n * @param {number} y \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y (pt)\n * @param {Array<string|number>} tj TJ \u914D\u5217\u3002\u6587\u5B57\u5217\u306F 16 \u9032 CID \u5217\uFF08<...> \u306A\u3057\uFF09\u3001\u6570\u5024\u306F 1/1000 \u5358\u4F4D\u306E\u4F4D\u7F6E\u8ABF\u6574\n * @param {{charSpacing?: number, rise?: number}} [opts]\n */\n text(fontName, size, x, y, tj, opts = {}) {\n const parts = [];\n for (const t of tj) {\n if (typeof t === 'string') {\n if (t.length) parts.push(`<${t}>`);\n } else if (t !== 0) parts.push(num(t));\n }\n if (!parts.length) return this;\n this.ops.push('BT');\n this.ops.push(`/${fontName} ${num(size)} Tf`);\n if (opts.charSpacing) this.ops.push(`${num(opts.charSpacing)} Tc`);\n if (opts.rise) this.ops.push(`${num(opts.rise)} Ts`);\n this.ops.push(`1 0 0 1 ${num(x)} ${num(y)} Tm`);\n this.ops.push(`[${parts.join(' ')}] TJ`);\n this.ops.push('ET');\n return this;\n }\n\n /** @returns {Uint8Array} */\n toBytes() {\n if (this.depth !== 0) throw new Error(`ContentStream: ${this.depth} unclosed q`);\n return new TextEncoder().encode(this.ops.join('\\n') + '\\n');\n }\n}\n", "// @ts-check\n/**\n * TrueType \u30B5\u30D6\u30BB\u30C3\u30BF\u30FC\u3002\n * \u4F7F\u7528\u30B0\u30EA\u30D5\uFF08\u3068\u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\uFF09\u3060\u3051\u3092\u542B\u3080\u65B0\u3057\u3044 sfnt \u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * GID \u306F 0 \u304B\u3089\u8A70\u3081\u76F4\u3055\u308C\u3001\u65E7 GID \u2192 \u65B0 GID \u306E\u5BFE\u5FDC\u8868\u3092\u8FD4\u3059\u3002\n * cmap \u306F\u51FA\u529B\u3057\u306A\u3044\uFF08PDF \u5074\u3067\u306F CIDToGIDMap /Identity \u3067 CID = \u65B0 GID \u3068\u3057\u3066\u6271\u3046\uFF09\u3002\n */\nimport { glyphData, componentGids } from './parse.js';\nimport { concat } from '../pdf/writer.js';\n\n/**\n * @typedef {object} SubsetResult\n * @property {Uint8Array} data \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3055\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\n * @property {Map<number, number>} gidMap \u65E7 GID \u2192 \u65B0 GID\n * @property {number[]} oldGids \u65B0 GID \u9806\u306B\u4E26\u3093\u3060\u65E7 GID\n */\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {Iterable<number>} usedGids\n * @returns {SubsetResult}\n */\nexport function subsetFont(font, usedGids) {\n // 1. \u30B0\u30EA\u30D5\u96C6\u5408\u3092\u9589\u5305\u3059\u308B\uFF08\u8907\u5408\u30B0\u30EA\u30D5\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u518D\u5E30\u7684\u306B\u8FFD\u52A0\uFF09\n /** @type {Set<number>} */\n const set = new Set([0]);\n const stack = [...usedGids];\n while (stack.length) {\n const gid = /** @type {number} */ (stack.pop());\n if (gid < 0 || gid >= font.numGlyphs || set.has(gid)) continue;\n set.add(gid);\n for (const c of componentGids(glyphData(font, gid))) if (!set.has(c)) stack.push(c);\n }\n const oldGids = [...set].sort((a, b) => a - b);\n /** @type {Map<number, number>} */\n const gidMap = new Map();\n oldGids.forEach((g, i) => gidMap.set(g, i));\n const n = oldGids.length;\n\n // 2. glyf / loca\n /** @type {Uint8Array[]} */\n const glyphChunks = [];\n const loca = new Uint32Array(n + 1);\n let glyfLen = 0;\n for (let i = 0; i < n; i++) {\n let g = glyphData(font, /** @type {number} */ (oldGids[i]));\n if (g.length && new DataView(g.buffer, g.byteOffset, g.byteLength).getInt16(0) < 0) {\n g = remapComposite(g, gidMap);\n }\n loca[i] = glyfLen;\n glyphChunks.push(g);\n glyfLen += g.length;\n const pad = (4 - (glyfLen % 4)) % 4;\n if (pad) {\n glyphChunks.push(new Uint8Array(pad));\n glyfLen += pad;\n }\n }\n loca[n] = glyfLen;\n const glyf = concat(glyphChunks);\n const locaBytes = new Uint8Array(loca.length * 4);\n const ldv = new DataView(locaBytes.buffer);\n loca.forEach((v, i) => ldv.setUint32(i * 4, v));\n\n // 3. hmtx\uFF08\u5168\u30B0\u30EA\u30D5\u5206\u306E advance + lsb \u3092\u66F8\u304F\uFF09\n const origHmtx = /** @type {{offset: number, length: number}} */ (font.tables.get('hmtx'));\n const origHhea = /** @type {{offset: number, length: number}} */ (font.tables.get('hhea'));\n const fdv = new DataView(font.data.buffer, font.data.byteOffset, font.data.byteLength);\n const numberOfHMetrics = fdv.getUint16(origHhea.offset + 34);\n const hmtx = new Uint8Array(n * 4);\n const hdv = new DataView(hmtx.buffer);\n for (let i = 0; i < n; i++) {\n const old = /** @type {number} */ (oldGids[i]);\n const lsbOffset =\n old < numberOfHMetrics\n ? origHmtx.offset + old * 4 + 2\n : origHmtx.offset + numberOfHMetrics * 4 + (old - numberOfHMetrics) * 2;\n hdv.setUint16(i * 4, font.advances[old] ?? 0);\n hdv.setInt16(i * 4 + 2, lsbOffset + 2 <= font.data.byteLength ? fdv.getInt16(lsbOffset) : 0);\n }\n\n // 4. head / hhea / maxp \u3092\u30B3\u30D4\u30FC\u3057\u3066\u66F8\u304D\u63DB\u3048\n const head = copyTable(font, 'head');\n const headDv = new DataView(head.buffer);\n headDv.setUint32(8, 0); // checkSumAdjustment\uFF08\u5F8C\u3067\u8A08\u7B97\uFF09\n headDv.setInt16(50, 1); // indexToLocFormat = long\n\n const hhea = copyTable(font, 'hhea');\n new DataView(hhea.buffer).setUint16(34, n);\n\n const maxp = copyTable(font, 'maxp');\n new DataView(maxp.buffer).setUint16(4, n);\n\n // 5. \u30C6\u30FC\u30D6\u30EB\u7FA4\u3092\u7D44\u307F\u7ACB\u3066\u308B\uFF08\u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\uFF09\n /** @type {[string, Uint8Array][]} */\n const tables = [\n ['glyf', glyf],\n ['head', head],\n ['hhea', hhea],\n ['hmtx', hmtx],\n ['loca', locaBytes],\n ['maxp', maxp],\n ];\n for (const opt of ['cvt ', 'fpgm', 'prep']) {\n if (font.tables.has(opt)) tables.push([opt, copyTable(font, opt)]);\n }\n tables.sort((a, b) => (a[0] < b[0] ? -1 : 1));\n\n const data = buildSfnt(tables);\n return { data, gidMap, oldGids };\n}\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} tag\n * @returns {Uint8Array}\n */\nfunction copyTable(font, tag) {\n const t = font.tables.get(tag);\n if (!t) throw new Error(`missing table ${tag}`);\n // Node \u306E Buffer \u306F slice \u304C\u30D3\u30E5\u30FC\u3092\u8FD4\u3059\u305F\u3081\u3001\u5FC5\u305A\u30B3\u30D4\u30FC\u3092\u4F5C\u308B\n return new Uint8Array(font.data.subarray(t.offset, t.offset + t.length));\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u5185\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u65B0 GID \u306B\u66F8\u304D\u63DB\u3048\u308B\u3002\n * @param {Uint8Array} g\n * @param {Map<number, number>} gidMap\n * @returns {Uint8Array}\n */\nfunction remapComposite(g, gidMap) {\n const out = new Uint8Array(g);\n const dv = new DataView(out.buffer);\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const oldGid = dv.getUint16(p + 2);\n dv.setUint16(p + 2, gidMap.get(oldGid) ?? 0);\n p += 4;\n p += flags & 0x0001 ? 4 : 2;\n if (flags & 0x0008) p += 2;\n else if (flags & 0x0040) p += 4;\n else if (flags & 0x0080) p += 8;\n if (!(flags & 0x0020)) break;\n if (p >= out.length) break;\n }\n return out;\n}\n\n/**\n * \u30C6\u30FC\u30D6\u30EB\u7FA4\u304B\u3089 sfnt \u30D5\u30A1\u30A4\u30EB\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {[string, Uint8Array][]} tables \u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\u6E08\u307F\n * @returns {Uint8Array}\n */\nfunction buildSfnt(tables) {\n const numTables = tables.length;\n let entrySelector = 0;\n while (1 << (entrySelector + 1) <= numTables) entrySelector++;\n const searchRange = (1 << entrySelector) * 16;\n const rangeShift = numTables * 16 - searchRange;\n\n const dirLen = 12 + numTables * 16;\n let offset = dirLen;\n /** @type {{tag: string, data: Uint8Array, offset: number, checksum: number}[]} */\n const entries = [];\n for (const [tag, data] of tables) {\n entries.push({ tag, data, offset, checksum: checksum(data) });\n offset += (data.length + 3) & ~3;\n }\n\n const out = new Uint8Array(offset);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, 0x00010000);\n dv.setUint16(4, numTables);\n dv.setUint16(6, searchRange);\n dv.setUint16(8, entrySelector);\n dv.setUint16(10, rangeShift);\n entries.forEach((e, i) => {\n const p = 12 + i * 16;\n for (let k = 0; k < 4; k++) out[p + k] = e.tag.charCodeAt(k);\n dv.setUint32(p + 4, e.checksum);\n dv.setUint32(p + 8, e.offset);\n dv.setUint32(p + 12, e.data.length);\n out.set(e.data, e.offset);\n });\n\n // head.checkSumAdjustment = 0xB1B0AFBA - checksum(whole font)\n const headEntry = entries.find((e) => e.tag === 'head');\n if (headEntry) {\n const total = checksum(out);\n dv.setUint32(headEntry.offset + 8, (0xb1b0afba - total) >>> 0);\n }\n return out;\n}\n\n/**\n * @param {Uint8Array} data\n * @returns {number}\n */\nfunction checksum(data) {\n let sum = 0;\n const n = data.length;\n for (let i = 0; i < n; i += 4) {\n const b0 = data[i] ?? 0;\n const b1 = data[i + 1] ?? 0;\n const b2 = data[i + 2] ?? 0;\n const b3 = data[i + 3] ?? 0;\n sum = (sum + (((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) >>> 0)) >>> 0;\n }\n return sum;\n}\n", "// @ts-check\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3057\u305F TrueType \u3092 PDF \u306E Type0 / CIDFontType2 \u3068\u3057\u3066\u57CB\u3081\u8FBC\u3080\u3002\n * CID = \u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C\u306E GID\uFF08CIDToGIDMap /Identity\uFF09\u3001\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u306F Identity-H\u3002\n * ToUnicode CMap \u3092\u5FC5\u305A\u4ED8\u3051\u3066\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u30FB\u691C\u7D22\u30FB\u30B3\u30D4\u30FC\u3092\u4FDD\u8A3C\u3059\u308B\u3002\n */\nimport { Raw } from '../pdf/writer.js';\nimport { subsetFont } from './subset.js';\n\n/**\n * PDF \u306B\u57CB\u3081\u8FBC\u3080 1 \u30D5\u30A9\u30F3\u30C8\u5206\u306E\u4F7F\u7528\u72B6\u6CC1\u3002\n * \u8D70\u67FB\u4E2D\u306B addGlyph \u3067\u30B0\u30EA\u30D5\u3092\u96C6\u3081\u3001\u6700\u5F8C\u306B embed \u3067 PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u751F\u6210\u3059\u308B\u3002\n */\nexport class EmbeddedFont {\n /**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} resourceName \u30DA\u30FC\u30B8\u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n */\n constructor(font, resourceName) {\n this.font = font;\n this.resourceName = resourceName;\n /** @type {Map<number, number>} \u65E7 GID \u2192 \u4EE3\u8868\u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08ToUnicode \u7528\uFF09 */\n this.usedGids = new Map();\n /** @type {import('./subset.js').SubsetResult|null} */\n this.subset = null;\n }\n\n /**\n * @param {number} gid \u65E7 GID\n * @param {number} codePoint\n */\n addGlyph(gid, codePoint) {\n if (!this.usedGids.has(gid)) this.usedGids.set(gid, codePoint);\n }\n\n /**\n * \u65E7 GID \u3092 PDF \u4E0A\u306E CID\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C GID\uFF09\u3078\u5909\u63DB\u3059\u308B\u3002embed \u5F8C\u306B\u306E\u307F\u6709\u52B9\u3002\n * @param {number} gid\n * @returns {number}\n */\n cid(gid) {\n if (!this.subset) throw new Error('EmbeddedFont: embed() must be called before cid()');\n return this.subset.gidMap.get(gid) ?? 0;\n }\n\n /**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3092\u78BA\u5B9A\u3055\u305B\u308B\u3002\u4EE5\u5F8C cid() \u304C\u4F7F\u3048\u308B\u3002\n */\n finalize() {\n if (!this.subset) this.subset = subsetFont(this.font, this.usedGids.keys());\n return this.subset;\n }\n\n /**\n * PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u7FA4\u3092\u66F8\u304D\u8FBC\u307F\u3001Type0 \u30D5\u30A9\u30F3\u30C8\u8F9E\u66F8\u3078\u306E\u53C2\u7167\u3092\u8FD4\u3059\u3002\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\n async embed(writer) {\n const subset = this.finalize();\n const f = this.font;\n const scale = 1000 / f.unitsPerEm;\n const tag = subsetTag(this.usedGids);\n const baseFont = `${tag}+${f.postScriptName}`;\n\n const fontFile = await writer.addStream({ Length1: subset.data.length }, subset.data);\n\n // \u30D5\u30E9\u30B0: bit 3 (Symbolic) \u3092\u7ACB\u3066\u308B\u3002Nonsymbolic \u3068\u6392\u4ED6\u3002Italic \u306F bit 7\u3001ForceBold \u306F bit 19\u3002\n let flags = 4;\n if (f.italic) flags |= 1 << 6;\n if (f.bold) flags |= 1 << 18;\n\n const descriptor = writer.add({\n Type: 'FontDescriptor',\n FontName: baseFont,\n Flags: flags,\n FontBBox: f.bbox.map((v) => Math.round(v * scale)),\n ItalicAngle: f.italicAngle,\n Ascent: Math.round(f.ascender * scale),\n Descent: Math.round(f.descender * scale),\n CapHeight: Math.round(f.capHeight * scale),\n StemV: f.bold ? 120 : 80,\n FontFile2: fontFile,\n });\n\n // W \u914D\u5217: \u9023\u7D9A CID \u3092\u307E\u3068\u3081\u308B c [w1 w2 ...] \u5F62\u5F0F\n /** @type {import('../pdf/writer.js').PdfValue[]} */\n const W = [];\n const widths = subset.oldGids.map((g) => Math.round((f.advances[g] ?? 0) * scale));\n let i = 0;\n while (i < widths.length) {\n let j = i;\n while (j + 1 < widths.length && j - i < 100) j++;\n W.push(i, widths.slice(i, j + 1));\n i = j + 1;\n }\n\n const cidFont = writer.add({\n Type: 'Font',\n Subtype: 'CIDFontType2',\n BaseFont: baseFont,\n CIDSystemInfo: { Registry: new Raw('(Adobe)'), Ordering: new Raw('(Identity)'), Supplement: 0 },\n FontDescriptor: descriptor,\n DW: 1000,\n W,\n CIDToGIDMap: 'Identity',\n });\n\n const toUnicode = await writer.addStream({}, buildToUnicode(subset, this.usedGids));\n\n return writer.add({\n Type: 'Font',\n Subtype: 'Type0',\n BaseFont: baseFont,\n Encoding: 'Identity-H',\n DescendantFonts: [cidFont],\n ToUnicode: toUnicode,\n });\n }\n}\n\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u30D5\u30A9\u30F3\u30C8\u540D\u306E\u63A5\u982D\u8F9E\uFF086 \u6587\u5B57\u306E\u5927\u6587\u5B57\uFF09\u3002\u4F7F\u7528\u30B0\u30EA\u30D5\u96C6\u5408\u304B\u3089\u6C7A\u5B9A\u7684\u306B\u751F\u6210\u3059\u308B\u3002\n * @param {Map<number, number>} usedGids\n * @returns {string}\n */\nfunction subsetTag(usedGids) {\n let h = 2166136261;\n for (const g of usedGids.keys()) {\n h ^= g;\n h = Math.imul(h, 16777619) >>> 0;\n }\n let tag = '';\n for (let i = 0; i < 6; i++) {\n tag += String.fromCharCode(65 + (h % 26));\n h = Math.floor(h / 26);\n }\n return tag;\n}\n\n/**\n * ToUnicode CMap\uFF08bfchar \u5F62\u5F0F\uFF09\u3092\u751F\u6210\u3059\u308B\u3002\n * @param {import('./subset.js').SubsetResult} subset\n * @param {Map<number, number>} usedGids \u65E7 GID \u2192 \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\n * @returns {Uint8Array}\n */\nfunction buildToUnicode(subset, usedGids) {\n /** @type {string[]} */\n const entries = [];\n subset.oldGids.forEach((oldGid, cid) => {\n const cp = usedGids.get(oldGid);\n if (cp === undefined) return;\n entries.push(`<${hex4(cid)}> <${utf16Hex(cp)}>`);\n });\n\n let body = '';\n for (let i = 0; i < entries.length; i += 100) {\n const chunk = entries.slice(i, i + 100);\n body += `${chunk.length} beginbfchar\\n${chunk.join('\\n')}\\nendbfchar\\n`;\n }\n\n const cmap =\n `/CIDInit /ProcSet findresource begin\\n` +\n `12 dict begin\\nbegincmap\\n` +\n `/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\\n` +\n `/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n` +\n `1 begincodespacerange\\n<0000> <FFFF>\\nendcodespacerange\\n` +\n body +\n `endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend\\n`;\n return new TextEncoder().encode(cmap);\n}\n\n/** @param {number} n */\nexport function hex4(n) {\n return n.toString(16).toUpperCase().padStart(4, '0');\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u3092 UTF-16BE \u306E 16 \u9032\u8868\u8A18\u306B\u3059\u308B\uFF08\u30B5\u30ED\u30B2\u30FC\u30C8\u30DA\u30A2\u5BFE\u5FDC\uFF09\u3002\n * @param {number} cp\n */\nfunction utf16Hex(cp) {\n if (cp <= 0xffff) return hex4(cp);\n const v = cp - 0x10000;\n return hex4(0xd800 + (v >> 10)) + hex4(0xdc00 + (v & 0x3ff));\n}\n\n", "// @ts-check\n/**\n * \u30C7\u30B3\u30FC\u30C9\u6E08\u307F\u753B\u50CF\u3092 PDF \u306E Image XObject \u3068\u3057\u3066\u66F8\u304D\u51FA\u3059\u3002\n */\n\n/**\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @param {import('../walker/image.js').DecodedImage} img\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\nexport async function embedImage(writer, img) {\n /** @type {{[key: string]: import('../pdf/writer.js').PdfValue}} */\n const dict = {\n Type: 'XObject',\n Subtype: 'Image',\n Width: img.width,\n Height: img.height,\n ColorSpace: 'DeviceRGB',\n BitsPerComponent: 8,\n };\n if (img.jpeg) {\n dict.Filter = 'DCTDecode';\n return writer.addStream(dict, img.jpeg, { compress: false });\n }\n if (!img.rgb) throw new Error('embedImage: image has no pixel data');\n if (img.alpha) {\n dict.SMask = await writer.addStream(\n { Type: 'XObject', Subtype: 'Image', Width: img.width, Height: img.height, ColorSpace: 'DeviceGray', BitsPerComponent: 8 },\n img.alpha,\n );\n }\n return writer.addStream(dict, img.rgb);\n}\n", "// @ts-check\n/**\n * Paginator \u2014 \u8D70\u67FB\u7D50\u679C\uFF08\u30A2\u30C8\u30E0\u30FB\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u30FB\u30C6\u30FC\u30D6\u30EB\uFF09\u304B\u3089\u5404\u30DA\u30FC\u30B8\u306E\u7E26\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\u3002\n *\n * \u65B9\u91DD: \u547D\u4EE4\u306F\u52D5\u304B\u3055\u305A\u3001\u30DA\u30FC\u30B8\u3054\u3068\u306B\u300C\u3053\u306E y \u7BC4\u56F2\u3092\u63CF\u304F\u300D\u3068\u6C7A\u3081\u308B\u3060\u3051\u306B\u3059\u308B\u3002\n * \u5883\u754C\u306F\u3001\u30A2\u30C8\u30E0\uFF08\u30C6\u30AD\u30B9\u30C8\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u4E0A\u3078\u623B\u3059\u3002\n * `break-before/after: avoid` \u3067\u7D50\u3070\u308C\u305F\u7BB1\u306E\u9593\u306B\u3082\u5883\u754C\u3092\u7F6E\u304B\u305A\u3001\u7F6E\u304D\u305D\u3046\u306A\u3089\u524D\u306E\u7BB1\u306E\u5148\u982D\u307E\u3067\u623B\u3059\u3002\n * \u30C6\u30FC\u30D6\u30EB\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\u306F thead \u3092\u5404\u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3057\u3001\u305D\u306E\u9AD8\u3055\u5206\u3060\u3051\u672C\u6587\u3092\u4E0B\u3052\u308B\u3002\n */\n\n/**\n * @typedef {object} RepeatedHead\n * @property {import('./walker/walk.js').TableInfo} table\n * @property {number} shift \u3053\u306E\u30DA\u30FC\u30B8\u3067 thead \u3092\u63CF\u304F\u4F4D\u7F6E\uFF08\u30DA\u30FC\u30B8\u5148\u982D\u304B\u3089\u306E px \u30AA\u30D5\u30BB\u30C3\u30C8\uFF09\n *\n * @typedef {object} PageRange\n * @property {number} start \u672C\u6587\u306E\u63CF\u304D\u59CB\u3081 y\uFF08\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @property {number} end \u672C\u6587\u306E\u63CF\u304D\u7D42\u308F\u308A y\uFF08\u3053\u306E\u5024\u672A\u6E80\u3092\u63CF\u304F\uFF09\n * @property {RepeatedHead[]} heads \u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead\n * @property {number} headShift \u7E70\u308A\u8FD4\u3057 thead \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u306F\u3053\u306E\u5206\u3060\u3051\u4E0B\u304C\u308B\uFF09\n * @property {RepeatedHead[]} feet \u30DA\u30FC\u30B8\u672B\u5C3E\u3067\u7E70\u308A\u8FD4\u3059 tfoot\uFF08\u8868\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\uFF09\n * @property {number} footShift \u7E70\u308A\u8FD4\u3057 tfoot \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u9818\u57DF\u306F\u3053\u306E\u5206\u3060\u3051\u7E2E\u3080\uFF09\n */\n\n/**\n * @param {import('./walker/walk.js').WalkResult} walk\n * @param {number} pageHeightPx \u672C\u6587\u9818\u57DF\u306E\u9AD8\u3055\uFF08px\uFF09\n * @returns {PageRange[]}\n */\nexport function paginate(walk, pageHeightPx) {\n const EPS_INIT = 0.01;\n const H = pageHeightPx;\n const total = walk.height;\n const atoms = [...walk.atoms].sort((a, b) => a.top - b.top);\n const breaks = [...new Set(walk.breaks)].sort((a, b) => a - b);\n // break-before/after: avoid \u3067\u7D50\u3070\u308C\u305F\u7BB1\u3002\n // \u5883\u754C\u306F\u6B21\u306E\u7BB1\u306E\u300C\u5148\u982D\u300D\u3067\u306F\u306A\u304F\u300C\u6700\u521D\u306E\u884C\u300D\u307E\u3067\u8A31\u305B\u306A\u3044\uFF08line-height \u306E\u534A\u884C\u5206\u3060\u3051\u7BB1\u306E\u4E0A\u7AEF\u3088\u308A\u4E0B\u306B\u6765\u308B\u305F\u3081\uFF09\u3002\n const joins = (walk.joins ?? []).map((j) => {\n const first = atoms.find((a) => a.top >= j.end - EPS_INIT);\n return { start: j.start, limit: first ? Math.max(first.top, j.end) : j.end, pullTo: j.pullTo };\n });\n const EPS = 0.01;\n\n /** @type {PageRange[]} */\n const pages = [];\n let start = 0;\n let guard = 0;\n while (start < total - EPS && guard++ < 10000) {\n // \u3053\u306E\u30DA\u30FC\u30B8\u306E\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead: \u30DA\u30FC\u30B8\u958B\u59CB\u4F4D\u7F6E\u304C\u8868\u306E\u9014\u4E2D\u306B\u3042\u308A\u3001thead \u304C\u65E2\u306B\u524D\u30DA\u30FC\u30B8\u3067\u63CF\u304B\u308C\u3066\u3044\u308B\u8868\n /** @type {RepeatedHead[]} */\n const heads = [];\n let headShift = 0;\n for (const t of walk.tables) {\n if (t.headItems.length && t.headBottom <= start + EPS && start < t.bottom - EPS) {\n heads.push({ table: t, shift: headShift });\n headShift += t.headBottom - t.headTop;\n }\n }\n // tfoot \u306E\u7E70\u308A\u8FD4\u3057\u306F\u300C\u3053\u306E\u30DA\u30FC\u30B8\u3067\u8868\u304C\u7D42\u308F\u3089\u306A\u3044\u300D\u3068\u304D\u3060\u3051\u5FC5\u8981\u3067\u3001\u305D\u308C\u306F end \u306B\u4F9D\u5B58\u3059\u308B\u3002\n // \u307E\u305A tfoot \u7121\u3057\u3067 end \u3092\u6C42\u3081\u3001\u7E70\u308A\u8FD4\u3057\u304C\u5FC5\u8981\u306A\u8868\u304C\u3042\u308C\u3070\u5BB9\u91CF\u3092\u6E1B\u3089\u3057\u3066\u8A08\u7B97\u3057\u76F4\u3059\uFF08\u6570\u56DE\u3067\u53CE\u675F\u3059\u308B\uFF09\u3002\n /** @type {RepeatedHead[]} */\n let feet = [];\n let footShift = 0;\n let end = start;\n for (let pass = 0; pass < 4; pass++) {\n const capacity = Math.max(H - headShift - footShift, H * 0.25); // thead/tfoot \u304C\u7570\u5E38\u306B\u9AD8\u3044\u5834\u5408\u306E\u4E0B\u9650\n end = computeEnd(start, capacity);\n /** @type {RepeatedHead[]} */\n const needed = [];\n let shift = 0;\n for (const t of walk.tables) {\n // \u8868\u304C\u3053\u306E\u30DA\u30FC\u30B8\u306E\u9014\u4E2D\u304B\u3089\u59CB\u307E\u308B\u30FB\u307E\u305F\u306F\u7D9A\u3044\u3066\u3044\u3066\u3001\u304B\u3064\u3053\u306E\u30DA\u30FC\u30B8\u3067\u7D42\u308F\u3089\u306A\u3044\uFF08\u672C\u6765\u306E tfoot \u304C\u6B21\u30DA\u30FC\u30B8\u4EE5\u964D\uFF09\n if (t.footItems.length && t.top < end - EPS && t.footTop >= end - EPS && t.bottom > end + EPS) {\n needed.push({ table: t, shift });\n shift += t.footBottom - t.footTop;\n }\n }\n const same = needed.length === feet.length && needed.every((n, i) => n.table === feet[i]?.table);\n feet = needed;\n footShift = shift;\n if (same) break;\n }\n\n pages.push({ start, end, heads, headShift, feet, footShift });\n start = end;\n }\n if (!pages.length) pages.push({ start: 0, end: Math.max(total, 1), heads: [], headShift: 0, feet: [], footShift: 0 });\n return pages;\n\n /**\n * start \u304B\u3089\u5BB9\u91CF capacity \u306E\u30DA\u30FC\u30B8\u306E\u7D42\u7AEF\u3092\u3001\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u3068\u30A2\u30C8\u30E0\u3092\u8003\u616E\u3057\u3066\u6C7A\u3081\u308B\u3002\n * @param {number} start\n * @param {number} capacity\n */\n function computeEnd(start, capacity) {\n let end = Math.min(start + capacity, total);\n\n // \u5F37\u5236\u6539\u30DA\u30FC\u30B8: (start, end) \u306E\u4E2D\u3067\u6700\u521D\u306E\u3082\u306E\n for (const b of breaks) {\n if (b > start + EPS && b < end - EPS) {\n end = b;\n break;\n }\n }\n\n // \u30A2\u30C8\u30E0\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u5883\u754C\u3092\u4E0A\u3052\u308B\uFF08\u4ED6\u306E\u30A2\u30C8\u30E0\u306B\u9023\u9396\u3059\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u7E70\u308A\u8FD4\u3059\uFF09\n if (end < total - EPS) {\n let moved = true;\n let iter = 0;\n while (moved && iter++ < 1000) {\n moved = false;\n for (const a of atoms) {\n if (a.top >= end) break;\n // \u30DA\u30FC\u30B8\u5BB9\u91CF\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\u306F\u3069\u3053\u304B\u3067\u5207\u3089\u3056\u308B\u3092\u5F97\u306A\u3044\u306E\u3067\u7121\u8996\u3059\u308B\n if (a.bottom - a.top > capacity) continue;\n if (a.top < end - EPS && a.bottom > end + EPS && a.top > start + EPS) {\n end = a.top;\n moved = true;\n }\n }\n // break-before/after: avoid \u2014 \u7D50\u3070\u308C\u305F 2 \u3064\u306E\u7BB1\u306E\u9593\u306B\u5883\u754C\u304C\u3042\u308C\u3070\u3001\u524D\u306E\u7BB1\u306E\u5148\u982D\u307E\u3067\u623B\u3059\n for (const j of joins) {\n // \u7D50\u3093\u3060\u7BC4\u56F2\u304C\u30DA\u30FC\u30B8\u306B\u53CE\u307E\u3089\u306A\u3044\u306A\u3089\u8AE6\u3081\u308B\uFF08\u623B\u3057\u3066\u3082\u540C\u3058\u4F4D\u7F6E\u3067\u5207\u308B\u3053\u3068\u306B\u306A\u308B\uFF09\n if (j.limit - j.pullTo > capacity) continue;\n // \u623B\u3057\u5148\u304C\u30DA\u30FC\u30B8\u5148\u982D\u4EE5\u524D\u3060\u3068\u7A7A\u30DA\u30FC\u30B8\u306B\u306A\u308B\u306E\u3067\u8AE6\u3081\u308B\n if (j.pullTo <= start + EPS) continue;\n if (end >= j.start - EPS && end <= j.limit + EPS && end > j.pullTo + EPS) {\n end = j.pullTo;\n moved = true;\n }\n }\n }\n // \u4E0A\u3052\u904E\u304E\u3066\u7A7A\u30DA\u30FC\u30B8\u306B\u306A\u308B\u5834\u5408\uFF08\u30DA\u30FC\u30B8\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\uFF09\u306F\u5BB9\u91CF\u3044\u3063\u3071\u3044\u3067\u5207\u308B\n if (end <= start + EPS) end = Math.min(start + capacity, total);\n }\n return end;\n }\n}\n", "// @ts-check\n/**\n * \u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\uFF08ShadingType 2\uFF09\u306E\u751F\u6210\u3002\n *\n * \u8272\u306F Type 2\uFF08\u6307\u6570\u88DC\u9593\uFF09\u95A2\u6570\u3092\u8272\u6B62\u3081\u306E\u6570\u3060\u3051\u4F5C\u308A\u3001Type 3\uFF08\u7D99\u304E\u5408\u308F\u305B\uFF09\u3067\u3064\u306A\u3050\u3002\n * \u8272\u6B62\u3081\u3054\u3068\u306B\u30A2\u30EB\u30D5\u30A1\u304C\u5909\u308F\u308B\u5834\u5408\u306F\u3001\u540C\u3058\u5F62\u306E\u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\n * \u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u306B\u3057\u3066\u518D\u73FE\u3059\u308B\uFF08PDF \u306B\u306F\u8272\u3068\u30A2\u30EB\u30D5\u30A1\u3092\u540C\u6642\u306B\u6301\u3064\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u304C\u7121\u3044\u305F\u3081\uFF09\u3002\n */\nimport { Name } from './writer.js';\n\n/**\n * @typedef {import('../walker/gradient.js').GradientStop} GradientStop\n */\n\n/**\n * \u8272\u6B62\u3081\u304B\u3089 Type 2/3 \u95A2\u6570\u3092\u4F5C\u308B\u3002\n * @param {import('./writer.js').PdfWriter} writer\n * @param {GradientStop[]} stops\n * @param {(c: import('../units.js').Rgba) => number[]} pick \u8272\u304B\u3089\u6210\u5206\u914D\u5217\u3092\u53D6\u308A\u51FA\u3059\uFF08RGB \u304B \u30B0\u30EC\u30FC\uFF09\n * @returns {import('./writer.js').Ref}\n */\nfunction buildFunction(writer, stops, pick) {\n const first = /** @type {GradientStop} */ (stops[0]);\n const last = /** @type {GradientStop} */ (stops[stops.length - 1]);\n const span = last.t - first.t;\n // \u5168\u533A\u9593\u304C 1 \u70B9\u306B\u6F70\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u5358\u8272\n if (!(span > 0)) {\n return writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(first.color), C1: pick(last.color), N: 1 });\n }\n if (stops.length === 2) {\n return writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(first.color), C1: pick(last.color), N: 1 });\n }\n /** @type {import('./writer.js').PdfValue[]} */\n const functions = [];\n /** @type {number[]} */\n const bounds = [];\n /** @type {number[]} */\n const encode = [];\n for (let i = 0; i < stops.length - 1; i++) {\n const a = /** @type {GradientStop} */ (stops[i]);\n const b = /** @type {GradientStop} */ (stops[i + 1]);\n functions.push(writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(a.color), C1: pick(b.color), N: 1 }));\n encode.push(0, 1);\n if (i > 0) bounds.push((a.t - first.t) / span);\n }\n return writer.add({ FunctionType: 3, Domain: [0, 1], Functions: functions, Bounds: bounds, Encode: encode });\n}\n\n/**\n * \u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u306E\u8F9E\u66F8\u3092\u4F5C\u308B\u3002\u5EA7\u6A19\u306F PDF \u5EA7\u6A19\uFF08pt\uFF09\u3002\n *\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{x0: number, y0: number, x1: number, y1: number}} coords\n * @param {GradientStop[]} stops\n * @param {'rgb'|'gray'} space\n * @returns {import('./writer.js').Ref}\n */\nexport function buildAxialShading(writer, coords, stops, space) {\n const pick =\n space === 'rgb'\n ? (/** @type {import('../units.js').Rgba} */ c) => [c.r, c.g, c.b]\n : (/** @type {import('../units.js').Rgba} */ c) => [c.a];\n return writer.add({\n ShadingType: 2,\n ColorSpace: new Name(space === 'rgb' ? 'DeviceRGB' : 'DeviceGray'),\n Coords: [coords.x0, coords.y0, coords.x1, coords.y1],\n Function: buildFunction(writer, stops, pick),\n Extend: [true, true],\n });\n}\n\n/**\n * \u8272\u6B62\u3081\u306E\u30A2\u30EB\u30D5\u30A1\u304C\u4E00\u5B9A\u306A\u3089\u305D\u306E\u5024\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 null\u3002\n * @param {GradientStop[]} stops\n * @returns {number|null}\n */\nexport function uniformAlpha(stops) {\n const a = /** @type {GradientStop} */ (stops[0]).color.a;\n return stops.every((s) => Math.abs(s.color.a - a) < 0.002) ? a : null;\n}\n\n/**\n * \u30A2\u30EB\u30D5\u30A1\u304C\u5909\u5316\u3059\u308B\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7528\u306E\u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u3092\u4F5C\u308B\u3002\n * \u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB\u306E\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u63CF\u304F\u30D5\u30A9\u30FC\u30E0 XObject \u3092 /SMask \u306B\u5165\u308C\u305F ExtGState \u3092\u8FD4\u3059\u3002\n *\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{x0: number, y0: number, x1: number, y1: number}} coords PDF \u5EA7\u6A19\n * @param {GradientStop[]} stops\n * @param {{x: number, y: number, w: number, h: number}} bbox \u30DE\u30B9\u30AF\u3092\u5857\u308B\u7BC4\u56F2\uFF08PDF \u5EA7\u6A19\uFF09\n * @param {number} groupAlpha \u8981\u7D20\u304B\u3089\u7D99\u627F\u3057\u305F\u4E0D\u900F\u660E\u5EA6\uFF08\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u5168\u4F53\u306B\u639B\u304B\u308B\uFF09\n * @returns {Promise<import('./writer.js').Ref>} ExtGState \u306E\u53C2\u7167\n */\nexport async function buildAlphaMaskGState(writer, coords, stops, bbox, groupAlpha) {\n const scaled = groupAlpha === 1 ? stops : stops.map((s) => ({ t: s.t, color: { ...s.color, a: s.color.a * groupAlpha } }));\n const shading = buildAxialShading(writer, coords, scaled, 'gray');\n const content = new TextEncoder().encode(`q ${bbox.x} ${bbox.y} ${bbox.w} ${bbox.h} re W n /Sh0 sh Q\\n`);\n const form = await writer.addStream(\n {\n Type: new Name('XObject'),\n Subtype: new Name('Form'),\n BBox: [bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h],\n Group: { Type: new Name('Group'), S: new Name('Transparency'), CS: new Name('DeviceGray') },\n Resources: { Shading: { Sh0: shading } },\n },\n content,\n );\n return writer.add({\n Type: new Name('ExtGState'),\n SMask: { Type: new Name('Mask'), S: new Name('Luminosity'), G: form, BC: [0] },\n ca: 1,\n CA: 1,\n });\n}\n", "// @ts-check\n/**\n * DisplayList \u3092\u7528\u7D19\u306B\u5272\u308A\u4ED8\u3051\u3001PDF \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * \u30DA\u30FC\u30B8\u7BC4\u56F2\u306E\u6C7A\u5B9A\u306F paginate.js\u3001\u3053\u3053\u3067\u306F\u5404\u30DA\u30FC\u30B8\u306B\u300C\u672C\u6587\uFF08\u7BC4\u56F2\u6307\u5B9A\uFF09\u30FB\u7E70\u308A\u8FD4\u3057 thead\u30FB\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30C3\u30BF\u30FC\u300D\u3092\u63CF\u304F\u3002\n */\nimport { PdfWriter, pdfString, pdfDate, Name } from './pdf/writer.js';\nimport { ContentStream } from './pdf/content.js';\nimport { EmbeddedFont, hex4 } from './font/cid.js';\nimport { embedImage } from './pdf/image.js';\nimport { PX_TO_PT, PAGE_SIZES, lengthToPt, num } from './units.js';\nimport { paginate } from './paginate.js';\nimport { releasePixels, loadImage } from './walker/image.js';\nimport { buildAxialShading, uniformAlpha, buildAlphaMaskGState } from './pdf/shading.js';\n\n/**\n * @typedef {object} PageGeometry\n * @property {number} width pt\n * @property {number} height pt\n * @property {number} top pt \u4E0A\u4F59\u767D\n * @property {number} right pt\n * @property {number} bottom pt \u4E0B\u4F59\u767D\n * @property {number} left pt\n */\n\n/**\n * @typedef {object} PageDecoration \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\uFF08\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u6E08\u307F\u306E\u8D70\u67FB\u7D50\u679C\uFF09\n * @property {number} heightPx\n * @property {(pageNumber: number, totalPages: number) => Promise<import('./walker/walk.js').WalkResult>} render\n */\n\n/**\n * @param {import('./index.js').PageOptions|undefined} page\n * @returns {PageGeometry}\n */\nexport function resolvePage(page = {}) {\n const sizeOpt = page.size ?? 'A4';\n let width;\n let height;\n if (typeof sizeOpt === 'string') {\n const s = PAGE_SIZES[sizeOpt];\n if (!s) throw new Error(`Unknown page size \"${sizeOpt}\". Use one of ${Object.keys(PAGE_SIZES).join(', ')} or {width, height}.`);\n width = s.width;\n height = s.height;\n } else {\n width = lengthToPt(sizeOpt.width);\n height = lengthToPt(sizeOpt.height);\n }\n if ((page.orientation ?? 'portrait') === 'landscape' && width < height) [width, height] = [height, width];\n\n const m = page.margin ?? '15mm';\n const margins =\n typeof m === 'string'\n ? { top: lengthToPt(m), right: lengthToPt(m), bottom: lengthToPt(m), left: lengthToPt(m) }\n : { top: lengthToPt(m.top), right: lengthToPt(m.right), bottom: lengthToPt(m.bottom), left: lengthToPt(m.left) };\n return { width, height, ...margins };\n}\n\n/**\n * @param {import('./walker/walk.js').WalkResult} body\n * @param {PageGeometry} geo\n * @param {{compress: boolean, metadata?: import('./index.js').PdfMetadata, header?: PageDecoration|null, footer?: PageDecoration|null, pacer?: import('./pacer.js').Pacer, progress?: (p: import('./index.js').ConversionProgress) => void, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {Promise<Uint8Array>}\n */\nexport async function buildPdf(body, geo, opts) {\n const writer = new PdfWriter({ compress: opts.compress });\n const headerPt = (opts.header?.heightPx ?? 0) * PX_TO_PT;\n const footerPt = (opts.footer?.heightPx ?? 0) * PX_TO_PT;\n const contentW = geo.width - geo.left - geo.right;\n const contentTop = geo.height - geo.top - headerPt; // \u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF\uFF08PDF \u5EA7\u6A19\uFF09\n const contentH = geo.height - geo.top - geo.bottom - headerPt - footerPt;\n if (contentH <= 0) throw new Error('Page content area is empty: margins + header + footer exceed the page height');\n const contentHpx = contentH / PX_TO_PT;\n\n // 1. \u30DA\u30FC\u30B8\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\n const ranges = paginate(body, contentHpx);\n const totalPages = ranges.length;\n\n // 2. \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u3092\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u3057\u3066\u8D70\u67FB\u7D50\u679C\u3092\u5F97\u308B\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const headers = [];\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const footers = [];\n for (let p = 0; p < totalPages; p++) {\n headers.push(opts.header ? await opts.header.render(p + 1, totalPages) : null);\n footers.push(opts.footer ? await opts.footer.render(p + 1, totalPages) : null);\n }\n\n // 3. \u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\u306E\u4F7F\u7528\u3092\u96C6\u3081\u308B\n /** @type {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} */\n const fonts = new Map();\n /** @type {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} */\n const images = new Map();\n const collect = (/** @type {import('./walker/walk.js').DisplayItem[]} */ list) => {\n for (const it of list) {\n if (it.type === 'text') {\n let ef = fonts.get(it.font);\n if (!ef) {\n ef = new EmbeddedFont(it.font.parsed, `F${fonts.size + 1}`);\n fonts.set(it.font, ef);\n }\n for (const g of it.glyphs) ef.addGlyph(g.gid, g.cp);\n } else if (it.type === 'image') {\n if (!images.has(it.image.key)) images.set(it.image.key, { name: `Im${images.size + 1}`, image: it.image });\n } else if (it.type === 'group' || it.type === 'clip') {\n collect(it.items);\n }\n }\n };\n collect(body.items);\n for (const w of [...headers, ...footers]) if (w) collect(w.items);\n for (const ef of fonts.values()) ef.finalize();\n\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const fontDict = {};\n for (const ef of fonts.values()) fontDict[ef.resourceName] = await ef.embed(writer);\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const xobjDict = {};\n for (const im of images.values()) {\n let img = im.image;\n // \u4E26\u884C\u3057\u3066\u8D70\u308B\u5225\u306E\u5909\u63DB\u304C\u5148\u306B\u89E3\u653E\u3057\u3066\u3044\u305F\u5834\u5408\u306F\u8AAD\u307F\u76F4\u3059\n if (!img.jpeg && !img.rgb) {\n const again = await loadImage(img.key, opts.warn ?? (() => {}));\n if (!again) continue;\n img = again;\n }\n xobjDict[im.name] = await embedImage(writer, img);\n // \u57CB\u3081\u8FBC\u307F\u304C\u6E08\u3081\u3070\u30D4\u30AF\u30BB\u30EB\u30C7\u30FC\u30BF\u306F\u4E0D\u8981\u3002\u5927\u304D\u306A\u6587\u66F8\u306E\u30D4\u30FC\u30AF\u4F7F\u7528\u91CF\u3092\u6291\u3048\u308B\n releasePixels(img);\n if (opts.pacer) await opts.pacer();\n }\n\n // ExtGState\uFF08\u900F\u660E\u5EA6\uFF09\n /** @type {Map<string, string>} */\n const gstates = new Map();\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const gstateDict = {};\n const gsName = (/** @type {number} */ a, /** @type {number} */ strokeA = a) => {\n const key = `${num(a)}/${num(strokeA)}`;\n let name = gstates.get(key);\n if (!name) {\n name = `GS${gstates.size + 1}`;\n gstates.set(key, name);\n gstateDict[name] = writer.add({ Type: 'ExtGState', ca: a, CA: strokeA });\n }\n return name;\n };\n\n // Shading\uFF08linear-gradient\uFF09\u3002\u5EA7\u6A19\u306F\u7BB1\u30ED\u30FC\u30AB\u30EB\u306E CSS px \u3067\u6301\u3061\u3001\u63CF\u753B\u6642\u306B cm \u3067\u7528\u7D19\u5EA7\u6A19\u3078\u5199\u3059\u3002\n // \u3053\u3046\u3059\u308B\u3068\u30DA\u30FC\u30B8\u3054\u3068\u306B\u4F5C\u308A\u76F4\u3055\u305A\u306B\u6E08\u3080\u3002\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const shadingDict = {};\n /** @type {Map<import('./walker/walk.js').DisplayItem, {sh: string, gs: string|null}>} */\n const gradients = new Map();\n /** @param {import('./walker/walk.js').DisplayItem[]} list */\n const prepareGradients = async (list) => {\n for (const it of list) {\n if (it.type === 'gradient') {\n const name = `Sh${Object.keys(shadingDict).length + 1}`;\n shadingDict[name] = buildAxialShading(writer, it.gradient, it.gradient.stops, 'rgb');\n const alpha = uniformAlpha(it.gradient.stops);\n let gs = null;\n if (alpha === null) {\n // \u8272\u6B62\u3081\u3054\u3068\u306B\u30A2\u30EB\u30D5\u30A1\u304C\u5909\u308F\u308B \u2192 \u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u3067\u518D\u73FE\u3059\u308B\n const gsRef = await buildAlphaMaskGState(writer, it.gradient, it.gradient.stops, { x: 0, y: 0, w: it.box.w, h: it.box.h }, it.alpha);\n gs = `GM${gradients.size + 1}`;\n gstateDict[gs] = gsRef;\n }\n gradients.set(it, { sh: name, gs });\n } else if (it.type === 'group' || it.type === 'clip') {\n await prepareGradients(it.items);\n }\n }\n };\n await prepareGradients(body.items);\n for (const w of [...headers, ...footers]) if (w) await prepareGradients(w.items);\n\n const pagesRef = writer.reserve();\n /** @type {import('./pdf/writer.js').Ref[]} */\n const pageRefs = [];\n\n // 4. \u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\n opts.progress?.({ phase: 'layout', totalPages });\n for (let p = 0; p < totalPages; p++) {\n if (opts.pacer) await opts.pacer();\n opts.progress?.({ phase: 'page', page: p + 1, totalPages });\n const range = /** @type {import('./paginate.js').PageRange} */ (ranges[p]);\n const cs = new ContentStream();\n const painter = new Painter(cs, geo, fonts, images, gsName, gradients);\n\n // \u672C\u6587: \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = range.start \u304C\u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF + \u7E70\u308A\u8FD4\u3057 thead \u306E\u9AD8\u3055 \u306B\u6765\u308B\n const bodyShiftPt = range.headShift * PX_TO_PT;\n const footShiftPt = range.footShift * PX_TO_PT;\n cs.save();\n cs.rect(geo.left, contentTop - contentH + footShiftPt, contentW, contentH - bodyShiftPt - footShiftPt).clip();\n painter.setOrigin(contentTop - bodyShiftPt, range.start);\n painter.render(body.items, range);\n cs.restore();\n\n // \u7E70\u308A\u8FD4\u3057 tfoot: \u30D6\u30E9\u30A6\u30B6\u306E\u5370\u5237\u3068\u540C\u3058\u304F\u3001\u3053\u306E\u30DA\u30FC\u30B8\u306B\u8F09\u3063\u305F\u6700\u5F8C\u306E\u884C\u306E\u76F4\u4E0B\u306B\u7F6E\u304F\n const bodyEndPt = contentTop - bodyShiftPt - (range.end - range.start) * PX_TO_PT;\n for (const f of range.feet) {\n const fPt = (f.table.footBottom - f.table.footTop) * PX_TO_PT;\n const bottomPt = bodyEndPt - f.shift * PX_TO_PT - fPt;\n cs.save();\n cs.rect(geo.left, bottomPt, contentW, fPt).clip();\n painter.setOrigin(bottomPt + fPt, f.table.footTop);\n painter.render(f.table.footItems);\n cs.restore();\n }\n\n // \u7E70\u308A\u8FD4\u3057 thead\n for (const h of range.heads) {\n cs.save();\n const hPt = (h.table.headBottom - h.table.headTop) * PX_TO_PT;\n cs.rect(geo.left, contentTop - h.shift * PX_TO_PT - hPt, contentW, hPt).clip();\n painter.setOrigin(contentTop - h.shift * PX_TO_PT, h.table.headTop);\n painter.render(h.table.headItems);\n cs.restore();\n }\n\n // \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\n const header = headers[p];\n if (header) {\n cs.save();\n cs.rect(geo.left, geo.height - geo.top - headerPt, contentW, headerPt).clip();\n painter.setOrigin(geo.height - geo.top, 0);\n painter.render(header.items);\n cs.restore();\n }\n const footer = footers[p];\n if (footer) {\n cs.save();\n cs.rect(geo.left, geo.bottom, contentW, footerPt).clip();\n painter.setOrigin(geo.bottom + footerPt, 0);\n painter.render(footer.items);\n cs.restore();\n }\n\n const contentRef = await writer.addStream({}, cs.toBytes());\n pageRefs.push(\n writer.add({\n Type: 'Page',\n Parent: pagesRef,\n MediaBox: [0, 0, geo.width, geo.height],\n Resources: {\n Font: fontDict,\n XObject: xobjDict,\n ExtGState: gstateDict,\n Shading: shadingDict,\n ProcSet: [new Name('PDF'), new Name('Text'), new Name('ImageC')],\n },\n Contents: contentRef,\n }),\n );\n }\n\n writer.set(pagesRef, { Type: 'Pages', Kids: pageRefs, Count: pageRefs.length });\n const catalog = writer.add({ Type: 'Catalog', Pages: pagesRef });\n\n const md = opts.metadata ?? {};\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const info = {\n Producer: pdfString('receipt-html-to-pdf'),\n Creator: pdfString(md.creator ?? 'receipt-html-to-pdf'),\n CreationDate: pdfDate(md.creationDate ?? new Date()),\n };\n if (md.title) info.Title = pdfString(md.title);\n if (md.author) info.Author = pdfString(md.author);\n if (md.subject) info.Subject = pdfString(md.subject);\n if (md.keywords) info.Keywords = pdfString(md.keywords);\n const infoRef = writer.add(info);\n\n return writer.build(catalog, infoRef);\n}\n\n/**\n * \u547D\u4EE4\u304C\u30DA\u30FC\u30B8\u7BC4\u56F2 [start, end) \u306B\u5C5E\u3059\u308B\u304B\u3002\n * \u30C6\u30AD\u30B9\u30C8\u306F\u884C\u304C\u5206\u5272\u3055\u308C\u306A\u3044\u524D\u63D0\u3067\u884C\u306E\u4E2D\u5FC3\u4F4D\u7F6E\u3067\u5224\u5B9A\u3057\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\u3001\n * \u77E9\u5F62\u30FB\u7DDA\u30FB\u753B\u50CF\u30FB\u30B0\u30EB\u30FC\u30D7\u306F\u7BC4\u56F2\u3068\u91CD\u306A\u308C\u3070\u542B\u3081\u308B\uFF08\u898B\u3048\u306A\u3044\u90E8\u5206\u306F\u30AF\u30EA\u30C3\u30D7\u3055\u308C\u308B\uFF09\u3002\n * @param {import('./walker/walk.js').DisplayItem} it\n * @param {{start: number, end: number}} range\n */\nfunction inRange(it, range) {\n const EPS = 0.01;\n if (it.type === 'text') {\n const mid = (it.top + it.bottom) / 2;\n return mid >= range.start - EPS && mid < range.end - EPS;\n }\n return itemBottom(it) > range.start + EPS && itemTop(it) < range.end - EPS;\n}\n\n/**\n * DisplayList \u3092 PDF \u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u3078\u63CF\u304F\u3002\n * setOrigin() \u3067\u300C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = docY \u3092 PDF \u306E y = pdfY \u306B\u7F6E\u304F\u300D\u5BFE\u5FDC\u3092\u5207\u308A\u66FF\u3048\u308B\u3002\n */\nclass Painter {\n /**\n * @param {ContentStream} cs\n * @param {PageGeometry} geo\n * @param {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} fonts\n * @param {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} images\n * @param {(alpha: number, strokeAlpha?: number) => string} gsName\n * @param {Map<import('./walker/walk.js').DisplayItem, {sh: string, gs: string|null}>} gradients\n */\n constructor(cs, geo, fonts, images, gsName, gradients) {\n this.cs = cs;\n this.geo = geo;\n this.fonts = fonts;\n this.images = images;\n this.gsName = gsName;\n this.gradients = gradients;\n this.pdfTop = geo.height - geo.top;\n this.docTop = 0;\n this.curAlpha = 1;\n }\n\n /**\n * @param {number} pdfY PDF \u5EA7\u6A19\uFF08pt, \u4E0A\u5411\u304D\uFF09\n * @param {number} docY \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08px, \u4E0B\u5411\u304D\uFF09\n */\n setOrigin(pdfY, docY) {\n this.pdfTop = pdfY;\n this.docTop = docY;\n }\n\n /** @param {number} x */\n X(x) {\n return this.geo.left + x * PX_TO_PT;\n }\n\n /** @param {number} y */\n Y(y) {\n return this.pdfTop - (y - this.docTop) * PX_TO_PT;\n }\n\n /** @param {number} a */\n setAlpha(a) {\n if (Math.abs(a - this.curAlpha) < 0.001) return;\n this.cs.setGState(this.gsName(a));\n this.curAlpha = a;\n }\n\n /** @param {import('./walker/walk.js').Radius|undefined} r */\n radiusPt(r) {\n return /** @type {[number, number, number, number]} */ ((r ?? [0, 0, 0, 0]).map((v) => v * PX_TO_PT));\n }\n\n /** @param {import('./walker/walk.js').Box} b */\n clipBox(b) {\n const cs = this.cs;\n if (b.radius) cs.roundedRect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT, this.radiusPt(b.radius));\n else cs.rect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT);\n cs.clip();\n }\n\n /**\n * @param {import('./walker/walk.js').DisplayItem[]} list\n * @param {{start: number, end: number}} [range] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u7BC4\u56F2\u306B\u5C5E\u3059\u308B\u547D\u4EE4\u3060\u3051\u3092\u63CF\u304F\uFF08\u5B50\u30B0\u30EB\u30FC\u30D7\u306B\u3082\u9069\u7528\uFF09\n */\n render(list, range) {\n const cs = this.cs;\n for (const it of list) {\n if (range && !inRange(it, range)) continue;\n if (it.type === 'rect') {\n if (it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n if (it.radius) cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).fill();\n else cs.fillRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'line') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.moveTo(this.X(it.x1), this.Y(it.y1)).lineTo(this.X(it.x2), this.Y(it.y2)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'stroke-rrect') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'path') {\n if (!it.segs.length) continue;\n const [a, b2, c, d, e, f] = it.matrix;\n // \u30E6\u30FC\u30B6\u30FC\u5358\u4F4D \u2192 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px \u2192 PDF pt\uFF08y \u53CD\u8EE2\uFF09\u3092 1 \u3064\u306E\u884C\u5217\u306B\u307E\u3068\u3081\u308B\n const S = PX_TO_PT;\n const tx = this.geo.left;\n const ty = this.pdfTop + this.docTop * S;\n cs.save();\n cs.transform(S * a, -S * b2, S * c, -S * d, S * e + tx, -S * f + ty);\n if (it.fill) cs.fillColor(it.fill.r, it.fill.g, it.fill.b);\n if (it.stroke) {\n cs.strokeColor(it.stroke.color.r, it.stroke.color.g, it.stroke.color.b);\n cs.lineWidth(it.stroke.width);\n cs.lineCap(it.stroke.cap);\n cs.lineJoin(it.stroke.join);\n if (it.stroke.join === 0) cs.miterLimit(it.stroke.miter);\n if (it.stroke.dash) cs.dash(it.stroke.dash, it.stroke.dashOffset);\n }\n // \u5857\u308A\u3068\u7DDA\u3067\u30A2\u30EB\u30D5\u30A1\u304C\u9055\u3046\u3053\u3068\u304C\u3042\u308B\u306E\u3067 ExtGState \u306B\u306F\u4E21\u65B9\u3092\u6E21\u3059\n const fa = it.fill ? it.fill.a : 1;\n const sa = it.stroke ? it.stroke.color.a : 1;\n if (fa !== 1 || sa !== 1) cs.setGState(this.gsName(fa, sa));\n cs.path(it.segs);\n if (it.fill && it.stroke) cs.fillAndStroke(it.evenOdd);\n else if (it.fill) cs.fill(it.evenOdd);\n else cs.stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'gradient') {\n const g = this.gradients.get(it);\n if (!g || it.box.w <= 0 || it.box.h <= 0) continue;\n cs.save();\n this.clipBox(it.clip);\n // \u7BB1\u30ED\u30FC\u30AB\u30EB\u306E CSS px \u7A7A\u9593\uFF08\u5DE6\u4E0A\u539F\u70B9\u30FBy \u4E0B\u5411\u304D\uFF09\u3078\u5199\u3059\u3002\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u306E\u5EA7\u6A19\u7CFB\u3082\u3053\u308C\u3002\n cs.transform(PX_TO_PT, 0, 0, -PX_TO_PT, this.X(it.box.x), this.Y(it.box.y));\n if (g.gs) cs.setGState(g.gs);\n else this.setAlpha(it.alpha);\n cs.shading(g.sh);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'image') {\n const im = this.images.get(it.image.key);\n if (!im || it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.alpha);\n if (it.clip) this.clipBox(it.clip);\n cs.image(im.name, this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'text') {\n const ef = /** @type {EmbeddedFont} */ (this.fonts.get(it.font));\n const tj = buildTJ(it, ef);\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n cs.text(ef.resourceName, it.size * PX_TO_PT, this.X(it.x), this.Y(it.y), tj);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'group') {\n // CSS \u884C\u5217 (a b c d e f) \u3092\u3001PDF \u5EA7\u6A19\uFF08y \u53CD\u8EE2\u30FB0.75 \u500D\uFF09\u3067\u540C\u3058\u5909\u63DB\u306B\u306A\u308B\u884C\u5217\u306B\u5199\u3059\u3002\n // \u7DDA\u5F62\u90E8\u306F y \u53CD\u8EE2\u306B\u3088\u308A b, c \u306E\u7B26\u53F7\u304C\u53CD\u8EE2\u3057\u3001\u5909\u63DB\u306E\u4E2D\u5FC3 origin \u306F\u4E0D\u52D5\u70B9\u3068\u3057\u3066\u6B8B\u3059\u3002\n const [a, b, c, d] = it.matrix;\n const ox = this.X(it.origin.x);\n const oy = this.Y(it.origin.y);\n const a2 = a;\n const b2 = -b;\n const c2 = -c;\n const d2 = d;\n const e2 = ox - (a2 * ox + c2 * oy) + it.matrix[4] * PX_TO_PT;\n const f2 = oy - (b2 * ox + d2 * oy) - it.matrix[5] * PX_TO_PT;\n cs.save();\n cs.transform(a2, b2, c2, d2, e2, f2);\n this.render(it.items, range);\n cs.restore();\n } else if (it.type === 'clip') {\n cs.save();\n this.clipBox(it.box);\n this.render(it.items, range);\n cs.restore();\n }\n }\n }\n}\n\n/**\n * \u30B0\u30EA\u30D5\u5217\u3092 TJ \u914D\u5217\u306B\u3059\u308B\u3002\n * \u5B9F\u6E2C\u3057\u305F\u30DA\u30F3\u4F4D\u7F6E\u3068\u3001\u30D5\u30A9\u30F3\u30C8\u306E advance \u304B\u3089\u8A08\u7B97\u3057\u305F\u4F4D\u7F6E\u3068\u306E\u5DEE\u3092 1/1000 \u5358\u4F4D\u306E\u8ABF\u6574\u5024\u3068\u3057\u3066\u633F\u5165\u3059\u308B\u3002\n * \u3053\u308C\u306B\u3088\u308A\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u4E21\u7AEF\u63C3\u3048\u304C\u305D\u306E\u307E\u307E\u518D\u73FE\u3055\u308C\u308B\u3002\n * @param {import('./walker/walk.js').TextItem} it\n * @param {EmbeddedFont} ef\n * @returns {Array<string|number>}\n */\nfunction buildTJ(it, ef) {\n /** @type {Array<string|number>} */\n const out = [];\n let hex = '';\n for (let i = 0; i < it.glyphs.length; i++) {\n const g = /** @type {import('./walker/walk.js').Glyph} */ (it.glyphs[i]);\n hex += hex4(ef.cid(g.gid));\n const next = it.glyphs[i + 1];\n if (!next) break;\n const expected = g.x + g.advance;\n const gap = next.x - expected; // px\n const adj = (-gap / it.size) * 1000; // \u6B63\u306E\u5024\u3067\u5DE6\u3078\u5BC4\u308B\n if (Math.abs(adj) >= 0.5) {\n out.push(hex, Math.round(adj * 10) / 10);\n hex = '';\n }\n }\n if (hex) out.push(hex);\n return out;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemTop(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y;\n if (it.type === 'gradient') return it.clip.y;\n if (it.type === 'path') return it.top;\n if (it.type === 'line') return Math.min(it.y1, it.y2) - it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.top;\n return it.top;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemBottom(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y + it.h;\n if (it.type === 'gradient') return it.clip.y + it.clip.h;\n if (it.type === 'path') return it.bottom;\n if (it.type === 'line') return Math.max(it.y1, it.y2) + it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.bottom;\n return it.bottom;\n}\n", "// @ts-check\n/**\n * \u9577\u3044\u5909\u63DB\u3067\u30E1\u30A4\u30F3\u30B9\u30EC\u30C3\u30C9\u3092\u5360\u6709\u3057\u306A\u3044\u305F\u3081\u306E\u3001\u6642\u9593\u30D9\u30FC\u30B9\u306E\u8B72\u6E21\u3002\n *\n * \u4E00\u5B9A\u6642\u9593\uFF08\u65E2\u5B9A 12ms\uFF09\u3092\u8D85\u3048\u3066\u52D5\u304D\u7D9A\u3051\u3066\u3044\u305F\u3089 1 \u56DE\u3060\u3051\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u3002\n * \u5C0F\u3055\u306A\u6587\u66F8\u3067\u306F\u307B\u3068\u3093\u3069\u767A\u706B\u305B\u305A\u3001\u5927\u304D\u306A\u6587\u66F8\u3067\u306F\u753B\u9762\u304C\u56FA\u307E\u3089\u306A\u304F\u306A\u308B\u3002\n */\n\n/**\n * \u30DE\u30AF\u30ED\u30BF\u30B9\u30AF\u3078\u8B72\u308B\u3002`setTimeout(0)` \u306F\u30CD\u30B9\u30C8\u3059\u308B\u3068 4ms \u306B\u30AF\u30E9\u30F3\u30D7\u3055\u308C\u308B\u306E\u3067\u3001\n * `scheduler.yield()` \u304B MessageChannel \u3092\u4F7F\u3046\u3002\n * @returns {Promise<void>}\n */\nfunction yieldToEventLoop() {\n const sched = /** @type {{yield?: () => Promise<void>}|undefined} */ (/** @type {any} */ (globalThis).scheduler);\n if (sched && typeof sched.yield === 'function') return sched.yield();\n return new Promise((resolve) => {\n if (typeof MessageChannel === 'function') {\n const ch = new MessageChannel();\n ch.port1.onmessage = () => {\n ch.port1.close();\n resolve();\n };\n ch.port2.postMessage(0);\n } else {\n setTimeout(resolve, 0);\n }\n });\n}\n\n/**\n * @typedef {() => Promise<void>} Pacer\n */\n\n/**\n * @param {number} [intervalMs] \u3053\u306E\u6642\u9593\u3092\u8D85\u3048\u3066\u52D5\u304D\u7D9A\u3051\u3066\u3044\u305F\u3089\u8B72\u308B\n * @returns {Pacer}\n */\nexport function createPacer(intervalMs = 12) {\n const now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());\n let last = now();\n return async () => {\n if (now() - last < intervalMs) return;\n await yieldToEventLoop();\n last = now();\n };\n}\n\n/** \u4F55\u3082\u3057\u306A\u3044 Pacer\uFF08\u30C6\u30B9\u30C8\u3084\u540C\u671F\u5B9F\u884C\u3057\u305F\u3044\u5834\u5408\u306B\u4F7F\u3046\uFF09 */\nexport const noPacer = /** @type {Pacer} */ (async () => {});\n", "// @ts-check\n/**\n * Receipt html to pdf \u2014 \u516C\u958B API\n *\n * \u30D6\u30E9\u30A6\u30B6\u5185\u3067 HTML/CSS \u3092\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u53EF\u80FD\u306A\u30D9\u30AF\u30BF\u30FC PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u8A2D\u8A08\u66F8: docs/design.md\n */\nimport { FontRegistry } from './font/registry.js';\nimport { renderDocument } from './renderer.js';\nimport { walk } from './walker/walk.js';\nimport { resolvePage, buildPdf } from './page.js';\nimport { PX_TO_PT } from './units.js';\nimport { createPacer } from './pacer.js';\n\nexport { expandPrintMediaCss } from './renderer.js';\n\n/**\n * \u767B\u9332\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E\u5B9A\u7FA9\u3002\n * `src` \u306F TrueType \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\uFF08glyf\uFF09\u3092\u6301\u3064\u9759\u7684 TTF \u306E\u307F\u5BFE\u5FDC\u3002\n *\n * @typedef {object} FontSource\n * @property {string} family CSS \u306E font-family \u3068\u4E00\u81F4\u3055\u305B\u308B\u540D\u524D\n * @property {number} [weight=400] 100\u301C900\n * @property {'normal'|'italic'} [style='normal']\n * @property {string|ArrayBuffer|Uint8Array} src URL \u307E\u305F\u306F \u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\u306E\u30D0\u30A4\u30C8\u5217\n */\n\n/**\n * \u7528\u7D19\u30B5\u30A4\u30BA\u3002\u65E2\u5B9A\u540D\u304B\u3001\u5E45\u30FB\u9AD8\u3055\u3092 CSS \u9577\u3055\uFF08'80mm' \u306A\u3069\uFF09\u3067\u6307\u5B9A\u3059\u308B\u3002\n *\n * @typedef {'A3'|'A4'|'A5'|'B4'|'B5'|'Letter'|'Legal'|{width: string, height: string}} PageSize\n */\n\n/**\n * @typedef {object} PageOptions\n * @property {PageSize} [size='A4']\n * @property {'portrait'|'landscape'} [orientation='portrait']\n * @property {string|{top: string, right: string, bottom: string, left: string}} [margin='15mm']\n */\n\n/**\n * @typedef {object} PdfMetadata\n * @property {string} [title]\n * @property {string} [author]\n * @property {string} [subject]\n * @property {string} [keywords]\n * @property {string} [creator]\n * @property {Date} [creationDate]\n */\n\n/**\n * \u5909\u63DB\u4E2D\u306B\u767A\u751F\u3057\u305F\u975E\u81F4\u547D\u7684\u306A\u554F\u984C\u3002\u4F8B\u5916\u306B\u306F\u305B\u305A onWarning \u306B\u6D41\u3059\u3002\n *\n * @typedef {object} ConversionWarning\n * @property {'unsupported-css'|'missing-font'|'missing-glyph'|'image-failed'|'other'} code\n * @property {string} message\n * @property {Element} [element]\n * @property {string} [property] unsupported-css \u306E\u3068\u304D\u306E CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u540D\n * @property {string} [text] missing-glyph \u306E\u3068\u304D\u306E\u8A72\u5F53\u6587\u5B57\n */\n\n/**\n * \u5909\u63DB\u306E\u9032\u307F\u5177\u5408\u3002\u9577\u3044\u6587\u66F8\u3067\u9032\u6357\u8868\u793A\u3092\u51FA\u3059\u305F\u3081\u306B\u4F7F\u3046\u3002\n *\n * @typedef {object} ConversionProgress\n * @property {'render'|'walk'|'layout'|'page'|'done'} phase\n * @property {number} [page] phase \u304C 'page' \u306E\u3068\u304D\u306E 1 \u59CB\u307E\u308A\u306E\u30DA\u30FC\u30B8\u756A\u53F7\n * @property {number} [totalPages] phase \u304C 'layout' \u4EE5\u964D\u3067\u78BA\u5B9A\u3059\u308B\u7DCF\u30DA\u30FC\u30B8\u6570\n */\n\n/**\n * @typedef {object} ConvertOptions\n * @property {PageOptions} [page]\n * @property {string[]} [fontFallback] \u672A\u767B\u9332\u30D5\u30A1\u30DF\u30EA\u30FC\u304C\u8981\u6C42\u3055\u308C\u305F\u3068\u304D\u306B\u8A66\u3059 family \u306E\u9806\u5E8F\n * @property {'inherit'|'none'|string[]} [stylesheets='inherit'] \u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u7D99\u627F\u3059\u308B\u304B\u3001URL/CSS \u30C6\u30AD\u30B9\u30C8\u3092\u660E\u793A\u3059\u308B\u304B\n * @property {boolean} [mediaPrint=false] `@media print` \u30EB\u30FC\u30EB\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u9069\u7528\u3059\u308B\n * @property {boolean} [compress=true] CompressionStream \u304C\u4F7F\u3048\u308C\u3070 FlateDecode \u3092\u9069\u7528\u3059\u308B\n * @property {PdfMetadata} [metadata]\n * @property {string|null} [header=null] \u5404\u30DA\u30FC\u30B8\u4E0A\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002{{pageNumber}} {{totalPages}} \u3092\u7F6E\u63DB\u3059\u308B\n * @property {string|null} [footer=null] \u5404\u30DA\u30FC\u30B8\u4E0B\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002\u540C\u4E0A\n * @property {'font'|'measure'|'auto'} [textMeasure='auto'] \u30B0\u30EA\u30D5\u4F4D\u7F6E\u306E\u6C7A\u3081\u65B9\uFF08\u73FE\u5728\u306F\u5E38\u306B\u5B9F\u6E2C\uFF09\n * @property {'blob'|'uint8array'|'dataurl'} [output='blob']\n * @property {string} [baseUrl] \u76F8\u5BFE URL\uFF08\u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\uFF09\u306E\u57FA\u6E96\u3002\u65E2\u5B9A\u306F\u73FE\u5728\u306E\u6587\u66F8\n * @property {(warning: ConversionWarning) => void} [onWarning]\n * @property {(progress: ConversionProgress) => void} [onProgress] \u9032\u6357\u901A\u77E5\u3002\u9577\u3044\u6587\u66F8\u3067\u306F\u9014\u4E2D\u3067\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u306E\u3067\u3001UI \u3092\u66F4\u65B0\u3067\u304D\u308B\n */\n\n/**\n * \u5909\u63DB\u306E\u5165\u529B\u3002DOM \u8981\u7D20\u3001\u307E\u305F\u306F HTML \u6587\u5B57\u5217\u3002\n * @typedef {Element|string} ConvertInput\n */\n\n/** \u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\uFF08package.json \u3068\u540C\u671F\uFF09 */\nexport const version = '0.3.0';\n\n/** \u30E2\u30B8\u30E5\u30FC\u30EB\u5171\u6709\u306E\u30D5\u30A9\u30F3\u30C8\u30EC\u30B8\u30B9\u30C8\u30EA */\nconst registry = new FontRegistry();\n\n/**\n * \u30D5\u30A9\u30F3\u30C8\u3092\u767B\u9332\u3059\u308B\u3002\u540C\u3058 family/weight/style \u3092\u518D\u767B\u9332\u3057\u305F\u5834\u5408\u306F\u4E0A\u66F8\u304D\u3059\u308B\u3002\n * \u30D1\u30FC\u30B9\u7D50\u679C\u306F\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306B\u30AD\u30E3\u30C3\u30B7\u30E5\u3055\u308C\u3001\u4EE5\u964D\u306E htmlToPdf \u547C\u3073\u51FA\u3057\u3067\u518D\u5229\u7528\u3055\u308C\u308B\u3002\n *\n * @param {FontSource} font\n * @returns {Promise<void>}\n */\nexport async function registerFont(font) {\n if (!font || !font.family || !font.src) throw new TypeError('registerFont: { family, src } are required');\n const entry = await registry.register(font);\n if (entry.parsed.variable) {\n console.warn(\n `[receipt-html-to-pdf] \"${font.family}\" is a variable font; only the default instance outlines are embedded. ` +\n 'Use static TTF instances for other weights.',\n );\n }\n}\n\n/**\n * \u767B\u9332\u6E08\u307F\u30D5\u30A9\u30F3\u30C8\u306E\u4E00\u89A7\uFF08\u30C7\u30D0\u30C3\u30B0\u7528\uFF09\u3002\n * @returns {{family: string, weight: number, style: string, glyphs: number}[]}\n */\nexport function listFonts() {\n return registry.fonts.map((f) => ({ family: f.displayFamily, weight: f.weight, style: f.style, glyphs: f.parsed.numGlyphs }));\n}\n\n/**\n * HTML \u3092 PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n *\n * @param {ConvertInput} input\n * @param {ConvertOptions} [options]\n * @returns {Promise<Blob|Uint8Array|string>} options.output \u306B\u5FDC\u3058\u305F PDF\n */\nexport async function htmlToPdf(input, options = {}) {\n if (typeof document === 'undefined') throw new Error('htmlToPdf must run in a browser (needs DOM layout)');\n if (registry.fonts.length === 0) {\n throw new Error('htmlToPdf: no fonts registered. Call registerFont() with at least one TrueType font first.');\n }\n const warn = options.onWarning ?? (() => {});\n const progress = options.onProgress ?? (() => {});\n // \u9577\u3044\u5909\u63DB\u3067\u30E1\u30A4\u30F3\u30B9\u30EC\u30C3\u30C9\u3092\u5360\u6709\u3057\u306A\u3044\u3088\u3046\u3001\u4E00\u5B9A\u6642\u9593\u3054\u3068\u306B\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\n const pacer = createPacer();\n const geo = resolvePage(options.page);\n const widthPx = (geo.width - geo.left - geo.right) / PX_TO_PT;\n\n progress({ phase: 'render' });\n const rendered = await renderDocument(input, {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n });\n\n /** @type {import('./walker/walk.js').WalkContext} */\n const walkCtx = {\n registry,\n fontFallback: options.fontFallback ?? [],\n warn,\n textMeasure: options.textMeasure ?? 'auto',\n pacer,\n };\n const renderOpts = {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n };\n\n try {\n progress({ phase: 'walk' });\n const body = await walk(rendered.root, walkCtx);\n const header = options.header ? await makeDecoration(options.header, renderOpts, walkCtx) : null;\n const footer = options.footer ? await makeDecoration(options.footer, renderOpts, walkCtx) : null;\n const bytes = await buildPdf(body, geo, {\n compress: options.compress ?? true,\n metadata: options.metadata,\n header,\n footer,\n pacer,\n progress,\n warn,\n });\n progress({ phase: 'done' });\n return toOutput(bytes, options.output ?? 'blob');\n } finally {\n rendered.destroy();\n }\n}\n\n/**\n * \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u63CF\u753B\u3059\u308B\u6E96\u5099\u3092\u3059\u308B\u3002\n * \u9AD8\u3055\u306F 1 \u30DA\u30FC\u30B8\u76EE\u76F8\u5F53\uFF08{{pageNumber}} = {{totalPages}} = 1\uFF09\u3067\u6E2C\u308A\u3001\u5168\u30DA\u30FC\u30B8\u540C\u3058\u3068\u307F\u306A\u3059\u3002\n * @param {string} template\n * @param {Parameters<typeof renderDocument>[1]} renderOpts\n * @param {import('./walker/walk.js').WalkContext} walkCtx\n * @returns {Promise<import('./page.js').PageDecoration>}\n */\nasync function makeDecoration(template, renderOpts, walkCtx) {\n const renderOnce = async (/** @type {number} */ page, /** @type {number} */ total) => {\n const html = template.replace(/\\{\\{\\s*pageNumber\\s*\\}\\}/g, String(page)).replace(/\\{\\{\\s*totalPages\\s*\\}\\}/g, String(total));\n const rendered = await renderDocument(html, renderOpts);\n try {\n return await walk(rendered.root, walkCtx);\n } finally {\n rendered.destroy();\n }\n };\n const probe = await renderOnce(1, 1);\n /** @type {Map<string, import('./walker/walk.js').WalkResult>} */\n const cache = new Map([['1/1', probe]]);\n return {\n heightPx: probe.height,\n render: async (page, total) => {\n const key = `${page}/${total}`;\n let r = cache.get(key);\n if (!r) {\n r = await renderOnce(page, total);\n cache.set(key, r);\n }\n return r;\n },\n };\n}\n\n/**\n * @param {Uint8Array} bytes\n * @param {'blob'|'uint8array'|'dataurl'} output\n * @returns {Blob|Uint8Array|string}\n */\nfunction toOutput(bytes, output) {\n if (output === 'uint8array') return bytes;\n if (output === 'dataurl') {\n let bin = '';\n for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return 'data:application/pdf;base64,' + btoa(bin);\n }\n return new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)], { type: 'application/pdf' });\n}\n\n/**\n * \u751F\u6210\u3057\u305F PDF \u3092\u30D6\u30E9\u30A6\u30B6\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3055\u305B\u308B\u88DC\u52A9\u95A2\u6570\u3002\n *\n * @param {Blob|Uint8Array} pdf\n * @param {string} filename\n * @returns {void}\n */\nexport function downloadPdf(pdf, filename) {\n const blob =\n pdf instanceof Blob\n ? pdf\n : new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (pdf)], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n"],
5
- "mappings": "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",
6
- "names": ["parseFont", "buffer", "data", "dv", "tag", "numTables", "tables", "i", "p", "name", "variable", "req", "t", "head", "unitsPerEm", "bbox", "macStyle", "indexToLocFormat", "hhea", "ascender", "descender", "lineGap", "numberOfHMetrics", "numGlyphs", "hmtx", "advances", "lastAdvance", "g", "locaT", "loca", "cmapT", "cmap", "parseCmap", "capHeight", "useTypoMetrics", "typoAscender", "typoDescender", "winAscent", "winDescent", "bold", "italic", "os2", "version", "fsSelection", "ch", "italicAngle", "post", "postScriptName", "parsePostScriptName", "base", "best", "bestScore", "platform", "encoding", "offset", "format", "score", "map", "segCountX2", "segCount", "endP", "startP", "deltaP", "rangeP", "s", "end", "start", "delta", "rangeOffset", "c", "gid", "gp", "nGroups", "startGid", "nameT", "count", "stringOffset", "fallback", "nameId", "length", "sanitizePsName", "j", "glyphData", "font", "glyf", "componentGids", "out", "flags", "glyphIndex", "FontRegistry", "source", "bytes", "loadBytes", "parsed", "parseFont", "entry", "normalizeFamily", "idx", "f", "family", "families", "weight", "style", "codePoint", "fam", "n", "candidates", "pickFace", "styled", "pool", "exact", "sorted", "a", "b", "heavier", "lighter", "mid", "splitFamilies", "value", "out", "cur", "quote", "ch", "parseWeight", "src", "res", "renderDocument", "input", "opts", "iframe", "win", "doc", "html", "buildHtml", "defineStubElements", "fit", "waitForStylesheets", "waitForFonts", "waitForImages", "materializePseudoElements", "warnIfTooWide", "baseUrl", "base", "escapeAttr", "reset", "m", "expandPrintMedia", "styles", "collectStyles", "shadowHostStyles", "htmlAttrs", "copyAttrs", "bodyAttrs", "body", "serializeElement", "stylesheets", "mediaPrint", "parts", "el", "css", "expandPrintMediaCss", "adopted", "cssTextOf", "node", "root", "widthPx", "warn", "width", "over", "mm", "px", "VOID_TAGS", "whole", "roots", "collectShadowRoots", "host", "restore", "inlineAdoptedStyleSheets", "inner", "tag", "out", "walk", "child", "added", "style", "sheets", "sheet", "rule", "registry", "Base", "names", "scan", "name", "_m", "attrs", "i", "hit", "depth", "j", "query", "a", "s", "links", "l", "resolve", "link", "loading", "f", "imgs", "img", "jobs", "deepQueryAll", "pseudo", "ps", "content", "text", "parseContentString", "prop", "disableCss", "r", "job", "span", "value", "hosts", "v", "ch", "quote", "hex", "MM_TO_PT", "PAGE_SIZES", "lengthToPt", "value", "m", "cssPx", "value", "n", "parseColor", "v", "m", "a", "clamp01", "h", "c", "num", "s", "t", "parseGsub", "font", "dv", "base", "featureListOff", "lookupListOff", "features", "featureCount", "i", "rec", "tag", "featureOff", "count", "list", "j", "lookupCount", "cache", "index", "result", "off", "readLookup", "lookupOff", "type", "subTableCount", "offsetsAt", "map", "sub", "readSingleSubst", "format", "coverage", "readCoverage", "delta", "gid", "out", "start", "end", "startIndex", "g", "buildSubstitution", "tags", "gsub", "indices", "a", "b", "maps", "m", "memo", "hit", "VARIANT_TAGS", "featureTagsOf", "style", "words", "w", "ffs", "part", "value", "WHITESPACE", "measureText", "node", "style", "o", "doc", "text", "applyTextTransform", "range", "baselineOffset", "probeBaseline", "lines", "cur", "curTop", "warnedCps", "i", "cp", "len", "end", "rect", "pickRect", "resolved", "resolveGlyph", "font", "gid", "cpForUnicode", "top", "subst", "substitutionFor", "outGid", "advance", "substCache", "parsed", "features", "byKey", "key", "fn", "buildSubstitution", "rects", "best", "r", "tryFont", "f", "hit", "sub", "s", "transform", "out", "m", "sp", "ch", "probeCache", "cache", "cached", "probe", "textNode", "mark", "textRect", "offset", "result", "cache", "loadImage", "url", "warn", "element", "p", "decode", "e", "bytes", "res", "dims", "jpegDimensions", "img", "loaded", "resolve", "reject", "blobUrl", "w", "h", "canvas", "ctx", "data", "px", "rgb", "alpha", "opaque", "i", "j", "k", "a", "b", "marker", "len", "parseBackgroundUrl", "value", "parts", "splitTopLevelCommas", "m", "s", "out", "depth", "cur", "ch", "fitImage", "box", "iw", "ih", "size", "position", "scale", "sw", "sh", "rw", "sizeComponent", "rh", "py", "x", "positionComponent", "y", "v", "ref", "free", "objectFitToSize", "fit", "splitRepeat", "norm", "tileAxis", "mode", "start", "areaStart", "areaEnd", "area", "n", "_", "gap", "first", "positions", "releasePixels", "parseLinearGradient", "value", "width", "height", "m", "args", "splitTopLevelCommas", "i", "angle", "first", "head", "dir", "parseDirection", "rawStops", "s", "rad", "sin", "cos", "length", "stops", "raw", "sp", "splitColorAndPositions", "color", "parseColor", "pos", "t", "resolvePosition", "fillMissingPositions", "cx", "cy", "dx", "dy", "deg", "to", "words", "fn", "splitWords", "kw", "pct", "px", "last", "j", "from", "k", "prev", "out", "depth", "cur", "ch", "parsePathData", "d", "out", "tokens", "tokenize", "i", "x", "y", "startX", "startY", "lastC", "lastQ", "cmd", "num", "t", "hasNum", "rel", "C", "ox", "oy", "x1", "y1", "x2", "y2", "rx", "ry", "qx", "qy", "px", "py", "rot", "large", "sweep", "seg", "arcToCurves", "re", "m", "rotDeg", "phi", "cosP", "sinP", "dx", "dy", "x1p", "y1p", "lambda", "s", "sign", "den", "co", "cxp", "cyp", "cx", "cy", "angle", "ux", "uy", "vx", "vy", "dot", "len", "a", "theta1", "dTheta", "parts", "delta", "th", "th2", "cos1", "sin1", "cos2", "sin2", "map", "ex", "ey", "px1", "py1", "px2", "py2", "c1x", "c1y", "c2x", "c2y", "shapeToPath", "el", "attr", "name", "dflt", "v", "w", "h", "rectPath", "roundRectPath", "r", "ellipsePath", "pts", "K", "b", "SKIP_TAGS", "MAX_BG_TILES", "SVG_NS", "SVG_NON_RENDERED", "SVG_CONTAINERS", "flatChildNodes", "el", "shadow", "slot", "UNSUPPORTED", "v", "walk", "root", "ctx", "win", "sx", "sy", "out", "rootItems", "atoms", "breaks", "joins", "tables", "currentTable", "seq", "warned", "missingFamilies", "warnOnce", "key", "w", "visit", "inherited", "style", "matrix", "parseTransform", "hel", "transformedRect", "prev", "plainRect", "ox", "oy", "parseOrigin", "origin", "saved", "visitInner", "items", "zOf", "inheritedZ", "zi", "z", "opacity", "alpha", "visible", "r", "top", "bottom", "bb", "ba", "bi", "next", "nextBoxAfter", "prevBoxBefore", "openedTable", "savedTable", "isHead", "isFoot", "groupStart", "clips", "clipSaved", "clipBox", "boxFor", "parseRadius", "warnUnsupported", "rects", "collapse", "radius", "paintBackground", "paintBackgroundImage", "paintBorders", "paintImg", "decorations", "decoLine", "color", "parseColor", "paintSvgChildren", "finishClip", "node", "paintText", "prop", "isSet", "camelToKebab", "bg", "item", "withAlpha", "bgClip", "bgOrigin", "gradient", "parseLinearGradient", "url", "parseBackgroundUrl", "img", "loadImage", "fit", "fitImage", "rx", "ry", "splitRepeat", "ax", "tileAxis", "ay", "count", "y", "x", "src", "content", "objectFitToSize", "box", "h", "bt", "cssPx", "br", "bl", "pt", "pr", "pb", "pl", "b", "drawn", "side", "s", "f", "bw", "dashFor", "c", "horizontal", "dir", "edge", "dash", "center", "start", "parent", "inh", "raw", "range", "size", "families", "splitFamilies", "weight", "parseWeight", "fstyle", "primary", "lines", "measureText", "featureTagsOf", "line", "g", "deco", "first", "last", "x1", "x2", "thickness", "sortItems", "height", "it", "container", "child", "tag", "op", "a", "segs", "shapeToPath", "name", "ctm", "fill", "svgPaint", "stroke", "svgStroke", "value", "kind", "o", "width", "dashes", "cap", "join", "miter", "inside", "intersects", "sib", "edgeBoxIn", "children", "one", "m", "d", "e", "parts", "y1", "y2", "b2", "canCompress", "deflate", "bytes", "cs", "writer", "buf", "Ref", "id", "Name", "name", "out", "ch", "c", "b", "Raw", "text", "pdfString", "s", "hex", "i", "pdfDate", "d", "p", "n", "tz", "sign", "tzh", "tzm", "serialize", "v", "num", "parts", "k", "val", "PdfWriter", "options", "ref", "value", "stream", "dict", "bytes", "opts", "data", "z", "deflate", "rootRef", "infoRef", "enc", "chunks", "offset", "push", "concat", "offsets", "obj", "xrefOffset", "xref", "trailer", "len", "o", "ContentStream", "a", "b", "c", "d", "e", "f", "num", "gsName", "r", "g", "w", "pattern", "phase", "cap", "x", "y", "h", "x1", "y1", "x2", "y2", "x3", "y3", "max", "clamp", "v", "tl", "tr", "br", "bl", "top", "right", "name", "join", "limit", "evenOdd", "segs", "s", "fontName", "size", "tj", "opts", "parts", "t", "subsetFont", "font", "usedGids", "set", "stack", "gid", "c", "componentGids", "glyphData", "oldGids", "a", "b", "gidMap", "g", "i", "n", "glyphChunks", "loca", "glyfLen", "remapComposite", "pad", "glyf", "concat", "locaBytes", "ldv", "v", "origHmtx", "origHhea", "fdv", "numberOfHMetrics", "hmtx", "hdv", "old", "lsbOffset", "head", "copyTable", "headDv", "hhea", "maxp", "tables", "opt", "buildSfnt", "tag", "t", "out", "dv", "p", "flags", "oldGid", "numTables", "entrySelector", "searchRange", "rangeShift", "offset", "entries", "data", "checksum", "e", "k", "headEntry", "total", "sum", "b0", "b1", "b2", "b3", "EmbeddedFont", "font", "resourceName", "gid", "codePoint", "subsetFont", "writer", "subset", "f", "scale", "baseFont", "subsetTag", "fontFile", "flags", "descriptor", "v", "W", "widths", "g", "i", "j", "cidFont", "Raw", "toUnicode", "buildToUnicode", "usedGids", "h", "tag", "entries", "oldGid", "cid", "cp", "hex4", "utf16Hex", "body", "chunk", "cmap", "n", "embedImage", "writer", "img", "dict", "paginate", "walk", "pageHeightPx", "H", "total", "atoms", "a", "breaks", "joins", "j", "first", "EPS", "pages", "start", "guard", "heads", "headShift", "t", "feet", "footShift", "end", "pass", "capacity", "computeEnd", "needed", "shift", "same", "n", "i", "b", "moved", "iter", "buildFunction", "writer", "stops", "pick", "first", "last", "span", "functions", "bounds", "encode", "i", "a", "b", "buildAxialShading", "coords", "space", "c", "Name", "uniformAlpha", "s", "buildAlphaMaskGState", "bbox", "groupAlpha", "scaled", "shading", "content", "form", "resolvePage", "page", "sizeOpt", "width", "height", "s", "PAGE_SIZES", "lengthToPt", "m", "margins", "buildPdf", "body", "geo", "opts", "writer", "PdfWriter", "headerPt", "footerPt", "contentW", "contentTop", "contentH", "contentHpx", "ranges", "paginate", "totalPages", "headers", "footers", "p", "fonts", "images", "collect", "list", "it", "ef", "EmbeddedFont", "g", "w", "fontDict", "xobjDict", "im", "img", "again", "loadImage", "embedImage", "releasePixels", "gstates", "gstateDict", "gsName", "a", "strokeA", "key", "num", "name", "shadingDict", "gradients", "prepareGradients", "buildAxialShading", "alpha", "uniformAlpha", "gs", "gsRef", "buildAlphaMaskGState", "pagesRef", "pageRefs", "range", "cs", "ContentStream", "painter", "Painter", "bodyShiftPt", "footShiftPt", "bodyEndPt", "f", "fPt", "bottomPt", "h", "hPt", "header", "footer", "contentRef", "Name", "catalog", "md", "info", "pdfString", "pdfDate", "infoRef", "inRange", "mid", "itemBottom", "itemTop", "pdfY", "docY", "x", "y", "r", "v", "b", "d", "b2", "e", "S", "tx", "ty", "fa", "sa", "tj", "buildTJ", "ox", "oy", "a2", "c2", "d2", "e2", "f2", "out", "hex", "i", "hex4", "next", "expected", "adj", "yieldToEventLoop", "sched", "resolve", "ch", "createPacer", "intervalMs", "now", "last", "version", "registry", "FontRegistry", "registerFont", "font", "listFonts", "f", "htmlToPdf", "input", "options", "warn", "progress", "pacer", "createPacer", "geo", "resolvePage", "widthPx", "rendered", "renderDocument", "walkCtx", "renderOpts", "body", "walk", "header", "makeDecoration", "footer", "bytes", "buildPdf", "toOutput", "template", "renderOnce", "page", "total", "html", "probe", "cache", "key", "r", "output", "bin", "i", "downloadPdf", "pdf", "filename", "blob", "url", "a"]
3
+ "sources": ["../src/font/parse.js", "../src/font/registry.js", "../src/renderer.js", "../src/units.js", "../src/font/gsub.js", "../src/walker/text.js", "../src/walker/image.js", "../src/walker/gradient.js", "../src/walker/svg-path.js", "../src/walker/walk.js", "../src/pdf/compress.js", "../src/pdf/writer.js", "../src/pdf/content.js", "../src/font/subset.js", "../src/font/cid.js", "../src/pdf/image.js", "../src/paginate.js", "../src/pdf/shading.js", "../src/pdf/outline.js", "../src/page.js", "../src/pacer.js", "../src/index.js"],
4
+ "sourcesContent": ["// @ts-check\n/**\n * TrueType (sfnt / glyf \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3) \u30D5\u30A9\u30F3\u30C8\u306E\u6700\u5C0F\u30D1\u30FC\u30B5\u30FC\u3002\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3068 PDF \u57CB\u3081\u8FBC\u307F\u306B\u5FC5\u8981\u306A\u30C6\u30FC\u30D6\u30EB\u3060\u3051\u3092\u8AAD\u3080\u3002\n */\n\n/**\n * @typedef {object} ParsedFont\n * @property {Uint8Array} data\n * @property {Map<string, {offset: number, length: number}>} tables\n * @property {number} unitsPerEm\n * @property {number} indexToLocFormat\n * @property {[number, number, number, number]} bbox xMin yMin xMax yMax (font units)\n * @property {number} ascender hhea\n * @property {number} descender hhea\uFF08\u8CA0\u5024\uFF09\n * @property {number} lineGap\n * @property {number} numGlyphs\n * @property {Uint16Array} advances \u30B0\u30EA\u30D5\u3054\u3068\u306E advance width (font units)\n * @property {Uint32Array} loca numGlyphs + 1 \u8981\u7D20\n * @property {Map<number, number>} cmap \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8 \u2192 GID\n * @property {number} capHeight OS/2 sCapHeight\uFF08\u306A\u3051\u308C\u3070 ascender * 0.7\uFF09\n * @property {number} italicAngle\n * @property {boolean} useTypoMetrics OS/2 fsSelection bit 7\n * @property {number} typoAscender\n * @property {number} typoDescender\n * @property {number} winAscent\n * @property {number} winDescent\n * @property {string} postScriptName\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {boolean} variable fvar \u30C6\u30FC\u30D6\u30EB\u3092\u6301\u3064\u53EF\u5909\u30D5\u30A9\u30F3\u30C8\u304B\n */\n\n/**\n * @param {ArrayBuffer|Uint8Array} buffer\n * @returns {ParsedFont}\n */\nexport function parseFont(buffer) {\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n const tag = dv.getUint32(0);\n if (tag === 0x4f54544f /* 'OTTO' */) {\n throw new Error('CFF outlines (OpenType/CFF) are not supported. Use a TrueType (glyf) font.');\n }\n if (tag === 0x774f4646 /* 'wOFF' */ || tag === 0x774f4632 /* 'wOF2' */) {\n throw new Error('WOFF/WOFF2 are not supported. Use a raw .ttf file.');\n }\n if (tag === 0x74746366 /* 'ttcf' */) {\n throw new Error('TrueType collections (.ttc) are not supported. Extract a single face first.');\n }\n if (tag !== 0x00010000 && tag !== 0x74727565 /* 'true' */) {\n throw new Error('Not a TrueType font (bad sfnt version)');\n }\n\n const numTables = dv.getUint16(4);\n /** @type {Map<string, {offset: number, length: number}>} */\n const tables = new Map();\n for (let i = 0; i < numTables; i++) {\n const p = 12 + i * 16;\n const name = String.fromCharCode(data[p] ?? 0, data[p + 1] ?? 0, data[p + 2] ?? 0, data[p + 3] ?? 0);\n tables.set(name, { offset: dv.getUint32(p + 8), length: dv.getUint32(p + 12) });\n }\n if (tables.has('CFF ')) throw new Error('CFF outlines are not supported. Use a TrueType (glyf) font.');\n // \u53EF\u5909\u30D5\u30A9\u30F3\u30C8: glyf \u306B\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u306E\u307F\u5165\u3063\u3066\u3044\u308B\u3002\u547C\u3073\u51FA\u3057\u5074\u304C\u8B66\u544A\u3067\u304D\u308B\u3088\u3046\u30D5\u30E9\u30B0\u3092\u7ACB\u3066\u308B\u3002\n const variable = tables.has('fvar');\n for (const req of ['head', 'hhea', 'maxp', 'hmtx', 'loca', 'glyf']) {\n if (!tables.has(req)) throw new Error(`Font is missing required table: ${req}`);\n }\n\n const t = (/** @type {string} */ name) => /** @type {{offset: number, length: number}} */ (tables.get(name));\n\n // head\n const head = t('head');\n const unitsPerEm = dv.getUint16(head.offset + 18);\n const bbox = /** @type {[number, number, number, number]} */ ([\n dv.getInt16(head.offset + 36),\n dv.getInt16(head.offset + 38),\n dv.getInt16(head.offset + 40),\n dv.getInt16(head.offset + 42),\n ]);\n const macStyle = dv.getUint16(head.offset + 44);\n const indexToLocFormat = dv.getInt16(head.offset + 50);\n\n // hhea\n const hhea = t('hhea');\n const ascender = dv.getInt16(hhea.offset + 4);\n const descender = dv.getInt16(hhea.offset + 6);\n const lineGap = dv.getInt16(hhea.offset + 8);\n const numberOfHMetrics = dv.getUint16(hhea.offset + 34);\n\n // maxp\n const numGlyphs = dv.getUint16(t('maxp').offset + 4);\n\n // hmtx\n const hmtx = t('hmtx');\n const advances = new Uint16Array(numGlyphs);\n let lastAdvance = 0;\n for (let g = 0; g < numGlyphs; g++) {\n if (g < numberOfHMetrics) lastAdvance = dv.getUint16(hmtx.offset + g * 4);\n advances[g] = lastAdvance;\n }\n\n // loca\n const locaT = t('loca');\n const loca = new Uint32Array(numGlyphs + 1);\n for (let g = 0; g <= numGlyphs; g++) {\n loca[g] = indexToLocFormat === 0 ? dv.getUint16(locaT.offset + g * 2) * 2 : dv.getUint32(locaT.offset + g * 4);\n }\n\n // cmap\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u51FA\u529B\u306B\u306F\u542B\u307E\u308C\u306A\u3044\u305F\u3081\u7701\u7565\u53EF\u3002\u7121\u3051\u308C\u3070\u7A7A\uFF09\n const cmapT = tables.get('cmap');\n const cmap = cmapT ? parseCmap(dv, cmapT.offset) : new Map();\n\n // OS/2 (optional)\n let capHeight = Math.round(ascender * 0.7);\n let useTypoMetrics = false;\n let typoAscender = ascender;\n let typoDescender = descender;\n let winAscent = ascender;\n let winDescent = -descender;\n let bold = (macStyle & 1) !== 0;\n let italic = (macStyle & 2) !== 0;\n const os2 = tables.get('OS/2');\n if (os2) {\n const version = dv.getUint16(os2.offset);\n const fsSelection = dv.getUint16(os2.offset + 62);\n useTypoMetrics = (fsSelection & (1 << 7)) !== 0;\n bold = bold || (fsSelection & (1 << 5)) !== 0;\n italic = italic || (fsSelection & 1) !== 0;\n typoAscender = dv.getInt16(os2.offset + 68);\n typoDescender = dv.getInt16(os2.offset + 70);\n winAscent = dv.getUint16(os2.offset + 74);\n winDescent = dv.getUint16(os2.offset + 76);\n if (version >= 2 && os2.length >= 90) {\n const ch = dv.getInt16(os2.offset + 88);\n if (ch > 0) capHeight = ch;\n }\n }\n\n // post (optional) \u2014 italicAngle\n let italicAngle = 0;\n const post = tables.get('post');\n if (post) italicAngle = dv.getInt32(post.offset + 4) / 65536;\n\n const postScriptName = parsePostScriptName(dv, data, tables.get('name')) ?? 'Embedded';\n\n return {\n data,\n tables,\n unitsPerEm,\n indexToLocFormat,\n bbox,\n ascender,\n descender,\n lineGap,\n numGlyphs,\n advances,\n loca,\n cmap,\n capHeight,\n italicAngle,\n useTypoMetrics,\n typoAscender,\n typoDescender,\n winAscent,\n winDescent,\n postScriptName,\n bold,\n italic,\n variable,\n };\n}\n\n/**\n * cmap \u30C6\u30FC\u30D6\u30EB\u304B\u3089 Unicode \u30B5\u30D6\u30C6\u30FC\u30D6\u30EB\uFF08format 12 \u512A\u5148\u3001\u306A\u3051\u308C\u3070 4\uFF09\u3092\u8AAD\u3080\u3002\n * @param {DataView} dv\n * @param {number} base\n * @returns {Map<number, number>}\n */\nfunction parseCmap(dv, base) {\n const n = dv.getUint16(base + 2);\n let best = -1;\n let bestScore = -1;\n for (let i = 0; i < n; i++) {\n const p = base + 4 + i * 8;\n const platform = dv.getUint16(p);\n const encoding = dv.getUint16(p + 2);\n const offset = dv.getUint32(p + 4);\n const format = dv.getUint16(base + offset);\n let score = -1;\n if (platform === 3 && encoding === 10 && format === 12) score = 4;\n else if (platform === 0 && (encoding === 4 || encoding === 6) && format === 12) score = 3;\n else if (platform === 3 && encoding === 1 && format === 4) score = 2;\n else if (platform === 0 && format === 4) score = 1;\n if (score > bestScore) {\n bestScore = score;\n best = base + offset;\n }\n }\n if (best < 0) throw new Error('Font has no usable Unicode cmap subtable (format 4 or 12)');\n\n /** @type {Map<number, number>} */\n const map = new Map();\n const format = dv.getUint16(best);\n if (format === 4) {\n const segCountX2 = dv.getUint16(best + 6);\n const segCount = segCountX2 / 2;\n const endP = best + 14;\n const startP = endP + segCountX2 + 2;\n const deltaP = startP + segCountX2;\n const rangeP = deltaP + segCountX2;\n for (let s = 0; s < segCount; s++) {\n const end = dv.getUint16(endP + s * 2);\n const start = dv.getUint16(startP + s * 2);\n const delta = dv.getInt16(deltaP + s * 2);\n const rangeOffset = dv.getUint16(rangeP + s * 2);\n if (start === 0xffff) continue;\n for (let c = start; c <= end; c++) {\n let gid;\n if (rangeOffset === 0) {\n gid = (c + delta) & 0xffff;\n } else {\n const gp = rangeP + s * 2 + rangeOffset + (c - start) * 2;\n if (gp + 2 > dv.byteLength) continue;\n gid = dv.getUint16(gp);\n if (gid !== 0) gid = (gid + delta) & 0xffff;\n }\n if (gid !== 0) map.set(c, gid);\n }\n }\n } else if (format === 12) {\n const nGroups = dv.getUint32(best + 12);\n let p = best + 16;\n for (let i = 0; i < nGroups; i++, p += 12) {\n const start = dv.getUint32(p);\n const end = dv.getUint32(p + 4);\n const startGid = dv.getUint32(p + 8);\n for (let c = start; c <= end && c - start < 0x10000; c++) {\n const gid = startGid + (c - start);\n if (gid !== 0) map.set(c, gid);\n }\n }\n }\n return map;\n}\n\n/**\n * name \u30C6\u30FC\u30D6\u30EB\u304B\u3089 PostScript \u540D (nameID 6) \u3092\u53D6\u308A\u51FA\u3059\u3002\n * @param {DataView} dv\n * @param {Uint8Array} data\n * @param {{offset: number, length: number}|undefined} nameT\n * @returns {string|null}\n */\nfunction parsePostScriptName(dv, data, nameT) {\n if (!nameT) return null;\n const count = dv.getUint16(nameT.offset + 2);\n const stringOffset = dv.getUint16(nameT.offset + 4);\n let fallback = null;\n for (let i = 0; i < count; i++) {\n const p = nameT.offset + 6 + i * 12;\n const platform = dv.getUint16(p);\n const nameId = dv.getUint16(p + 6);\n const length = dv.getUint16(p + 8);\n const offset = dv.getUint16(p + 10);\n if (nameId !== 6) continue;\n const start = nameT.offset + stringOffset + offset;\n if (platform === 1) {\n // Macintosh Roman: ASCII \u3068\u307F\u306A\u3059\n return sanitizePsName(String.fromCharCode(...data.subarray(start, start + length)));\n }\n if (platform === 3 || platform === 0) {\n let s = '';\n for (let j = 0; j + 1 < length; j += 2) s += String.fromCharCode(dv.getUint16(start + j));\n fallback = sanitizePsName(s);\n }\n }\n return fallback;\n}\n\n/** @param {string} s */\nfunction sanitizePsName(s) {\n return s.replace(/[^\\x21-\\x7e]/g, '').replace(/[\\[\\]\\(\\)\\{\\}<>\\/%#]/g, '') || 'Embedded';\n}\n\n/**\n * \u30B0\u30EA\u30D5\u306E\u751F\u30D0\u30A4\u30C8\u5217\u3092\u8FD4\u3059\uFF08\u7A7A\u30B0\u30EA\u30D5\u306F\u9577\u3055 0\uFF09\u3002\n * @param {ParsedFont} font\n * @param {number} gid\n * @returns {Uint8Array}\n */\nexport function glyphData(font, gid) {\n const glyf = /** @type {{offset: number, length: number}} */ (font.tables.get('glyf'));\n const start = font.loca[gid] ?? 0;\n const end = font.loca[gid + 1] ?? start;\n return font.data.subarray(glyf.offset + start, glyf.offset + end);\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u8FD4\u3059\uFF08\u5358\u7D14\u30B0\u30EA\u30D5\u306A\u3089\u7A7A\uFF09\u3002\n * @param {Uint8Array} g\n * @returns {number[]}\n */\nexport function componentGids(g) {\n if (g.length < 10) return [];\n const dv = new DataView(g.buffer, g.byteOffset, g.byteLength);\n const numberOfContours = dv.getInt16(0);\n if (numberOfContours >= 0) return [];\n /** @type {number[]} */\n const out = [];\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const glyphIndex = dv.getUint16(p + 2);\n out.push(glyphIndex);\n p += 4;\n p += flags & 0x0001 /* ARG_1_AND_2_ARE_WORDS */ ? 4 : 2;\n if (flags & 0x0008 /* WE_HAVE_A_SCALE */) p += 2;\n else if (flags & 0x0040 /* WE_HAVE_AN_X_AND_Y_SCALE */) p += 4;\n else if (flags & 0x0080 /* WE_HAVE_A_TWO_BY_TWO */) p += 8;\n if (!(flags & 0x0020 /* MORE_COMPONENTS */)) break;\n if (p >= g.length) break;\n }\n return out;\n}\n\n/**\n * \u30D6\u30E9\u30A6\u30B6\u304C\u884C\u30DC\u30C3\u30AF\u30B9\u8A08\u7B97\u306B\u4F7F\u3046\u30A2\u30BB\u30F3\u30C8\uFF0F\u30C7\u30A3\u30BB\u30F3\u30C8\u306B\u8FD1\u3044\u5024\uFF08font units\uFF09\u3092\u8FD4\u3059\u3002\n * Chrome/Firefox \u306F OS/2 USE_TYPO_METRICS \u304C\u7ACB\u3063\u3066\u3044\u308C\u3070 typo\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 hhea \u3092\u4F7F\u3046\u3002\n * @param {ParsedFont} font\n * @returns {{ascent: number, descent: number}} descent \u306F\u6B63\u5024\n */\nexport function browserMetrics(font) {\n if (font.useTypoMetrics) return { ascent: font.typoAscender, descent: -font.typoDescender };\n return { ascent: font.ascender, descent: -font.descender };\n}\n", "// @ts-check\n/**\n * \u767B\u9332\u30D5\u30A9\u30F3\u30C8\u306E\u7BA1\u7406\u3068 CSS font-family / font-weight / font-style \u304B\u3089\u306E\u30D5\u30A9\u30F3\u30C8\u9078\u629E\u3002\n */\nimport { parseFont } from './parse.js';\n\n/**\n * @typedef {object} RegisteredFont\n * @property {string} family \u6B63\u898F\u5316\u6E08\u307F\uFF08\u5C0F\u6587\u5B57\u30FB\u5F15\u7528\u7B26\u306A\u3057\uFF09\n * @property {string} displayFamily\n * @property {number} weight\n * @property {'normal'|'italic'} style\n * @property {import('./parse.js').ParsedFont} parsed\n */\n\nexport class FontRegistry {\n constructor() {\n /** @type {RegisteredFont[]} */\n this.fonts = [];\n }\n\n /**\n * @param {import('../index.js').FontSource} source\n * @returns {Promise<RegisteredFont>}\n */\n async register(source) {\n const bytes = await loadBytes(source.src);\n const parsed = parseFont(bytes);\n const entry = {\n family: normalizeFamily(source.family),\n displayFamily: source.family,\n weight: source.weight ?? 400,\n style: source.style ?? 'normal',\n parsed,\n };\n const idx = this.fonts.findIndex(\n (f) => f.family === entry.family && f.weight === entry.weight && f.style === entry.style,\n );\n if (idx >= 0) this.fonts[idx] = entry;\n else this.fonts.push(entry);\n return entry;\n }\n\n /** @param {string} family */\n hasFamily(family) {\n const n = normalizeFamily(family);\n return this.fonts.some((f) => f.family === n);\n }\n\n /**\n * CSS \u306E\u6307\u5B9A\u306B\u6700\u3082\u8FD1\u3044\u767B\u9332\u30D5\u30A9\u30F3\u30C8\u3092\u8FD4\u3059\u3002\n * @param {string[]} families font-family \u30EA\u30B9\u30C8\uFF08\u512A\u5148\u9806\uFF09\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @param {number} [codePoint] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u30D5\u30A9\u30F3\u30C8\u306B\u9650\u5B9A\u3059\u308B\n * @returns {RegisteredFont|null}\n */\n match(families, weight, style, codePoint) {\n for (const fam of families) {\n const n = normalizeFamily(fam);\n let candidates = this.fonts.filter((f) => f.family === n);\n if (codePoint !== undefined) candidates = candidates.filter((f) => f.parsed.cmap.has(codePoint));\n if (!candidates.length) continue;\n return pickFace(candidates, weight, style);\n }\n return null;\n }\n\n /**\n * \u767B\u9332\u6E08\u307F\u306E\u5168\u30D5\u30A1\u30DF\u30EA\u30FC\u306E\u4E2D\u304B\u3089\u3001\u6307\u5B9A\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u3082\u306E\u3092\u63A2\u3059\uFF08\u6700\u7D42\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF09\u3002\n * @param {number} codePoint\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont|null}\n */\n anyWithGlyph(codePoint, weight, style) {\n const candidates = this.fonts.filter((f) => f.parsed.cmap.has(codePoint));\n return candidates.length ? pickFace(candidates, weight, style) : null;\n }\n}\n\n/**\n * CSS Fonts Level 4 \u306E\u30D5\u30A9\u30F3\u30C8\u30DE\u30C3\u30C1\u30F3\u30B0\u3092\u7C21\u7565\u5316\u3057\u305F\u3082\u306E\u3002\n * 1. style \u304C\u4E00\u81F4\u3059\u308B\u3082\u306E\u3092\u512A\u5148\uFF08\u306A\u3051\u308C\u3070\u7121\u8996\uFF09\n * 2. weight: 400 \u306F 500 \u3092\u5148\u306B\u898B\u308B\u3002400\u301C500 \u306F\u4E0A\u2192\u4E0B\u3001<400 \u306F\u4E0B\u2192\u4E0A\u3001>500 \u306F\u4E0A\u2192\u4E0B\u3002\n * @param {RegisteredFont[]} candidates\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont}\n */\nfunction pickFace(candidates, weight, style) {\n const styled = candidates.filter((f) => f.style === style);\n const pool = styled.length ? styled : candidates;\n const exact = pool.find((f) => f.weight === weight);\n if (exact) return exact;\n\n const sorted = [...pool].sort((a, b) => a.weight - b.weight);\n const heavier = sorted.filter((f) => f.weight > weight);\n const lighter = sorted.filter((f) => f.weight < weight).reverse();\n\n if (weight >= 400 && weight <= 500) {\n const mid = heavier.find((f) => f.weight <= 500);\n if (mid) return mid;\n if (lighter.length) return /** @type {RegisteredFont} */ (lighter[0]);\n return /** @type {RegisteredFont} */ (heavier[0]);\n }\n if (weight < 400) {\n return /** @type {RegisteredFont} */ (lighter[0] ?? heavier[0]);\n }\n return /** @type {RegisteredFont} */ (heavier[0] ?? lighter[0]);\n}\n\n/**\n * @param {string} family\n * @returns {string}\n */\nexport function normalizeFamily(family) {\n return family.trim().replace(/^[\"']|[\"']$/g, '').trim().toLowerCase();\n}\n\n/**\n * getComputedStyle().fontFamily\uFF08'\"BIZ UDPGothic\", sans-serif'\uFF09\u3092\u30EA\u30B9\u30C8\u306B\u5206\u5272\u3059\u308B\u3002\n * @param {string} value\n * @returns {string[]}\n */\nexport function splitFamilies(value) {\n /** @type {string[]} */\n const out = [];\n let cur = '';\n let quote = '';\n for (const ch of value) {\n if (quote) {\n if (ch === quote) quote = '';\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === ',') {\n if (cur.trim()) out.push(cur.trim());\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\n/**\n * getComputedStyle().fontWeight\uFF08'400' / '700' / 'bold'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function parseWeight(value) {\n if (value === 'bold') return 700;\n if (value === 'normal') return 400;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : 400;\n}\n\n/**\n * @param {string|ArrayBuffer|Uint8Array} src\n * @returns {Promise<Uint8Array>}\n */\nasync function loadBytes(src) {\n if (src instanceof Uint8Array) return src;\n if (src instanceof ArrayBuffer) return new Uint8Array(src);\n const res = await fetch(src);\n if (!res.ok) throw new Error(`Failed to fetch font ${src}: ${res.status} ${res.statusText}`);\n return new Uint8Array(await res.arrayBuffer());\n}\n", "// @ts-check\n/**\n * \u975E\u8868\u793A iframe \u306B HTML \u3092\u63CF\u753B\u3057\u3001\u30EC\u30A4\u30A2\u30A6\u30C8\u8A08\u6E2C\u53EF\u80FD\u306A Document \u3092\u7528\u610F\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} RenderedDocument\n * @property {HTMLIFrameElement} iframe\n * @property {Document} doc\n * @property {Window} win\n * @property {HTMLElement} root \u8D70\u67FB\u306E\u8D77\u70B9\uFF08body\uFF09\n * @property {() => void} destroy\n */\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{widthPx: number, stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {Promise<RenderedDocument>}\n */\nexport async function renderDocument(input, opts) {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.cssText = `position:fixed;left:-100000px;top:0;width:${opts.widthPx}px;height:1000px;border:0;visibility:hidden;pointer-events:none;`;\n document.body.appendChild(iframe);\n\n const win = iframe.contentWindow;\n const doc = iframe.contentDocument;\n if (!win || !doc) throw new Error('Failed to create rendering iframe');\n\n const html = buildHtml(input, opts);\n doc.open();\n doc.write(html);\n doc.close();\n\n // \u5BA3\u8A00\u7684\u30B7\u30E3\u30C9\u30A6 DOM \u3067\u5FA9\u5143\u3057\u305F\u8981\u7D20\u306F\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3055\u308C\u306A\u3044\u305F\u3081 :defined \u304C\u30DE\u30C3\u30C1\u3057\u306A\u3044\u3002\n // \u4E2D\u8EAB\u306E\u7121\u3044\u30B9\u30BF\u30D6\u3092\u5B9A\u7FA9\u3057\u3066\u30DE\u30C3\u30C1\u3055\u305B\u308B\uFF08\u63CF\u753B\u306B\u306F\u5F71\u97FF\u3057\u306A\u3044\uFF09\u3002\n defineStubElements(doc, win);\n\n // \u9AD8\u3055\u3092\u5185\u5BB9\u306B\u5408\u308F\u305B\u308B\uFF08\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u767A\u751F\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B\uFF09\n const fit = () => {\n iframe.style.height = `${Math.max(doc.documentElement.scrollHeight, doc.body.scrollHeight, 100)}px`;\n };\n fit();\n\n await waitForStylesheets(doc);\n fit();\n await waitForFonts(doc);\n await waitForImages(doc);\n materializePseudoElements(doc, opts.warn ?? (() => {}));\n fit();\n // \u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u78BA\u5B9A\u3055\u305B\u308B\n void doc.body.offsetHeight;\n warnIfTooWide(doc, opts.widthPx, opts.warn ?? (() => {}));\n\n return {\n iframe,\n doc,\n win,\n root: doc.body,\n destroy: () => iframe.remove(),\n };\n}\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {string}\n */\nfunction buildHtml(input, opts) {\n const baseUrl = opts.baseUrl ?? document.baseURI;\n const base = `<base href=\"${escapeAttr(baseUrl)}\">`;\n // \u89AA\u6587\u66F8\u306E body \u30DE\u30FC\u30B8\u30F3\u304C PDF \u306B\u6301\u3061\u8FBC\u307E\u308C\u308B\u3068\u5185\u5BB9\u304C\u53F3\u3078\u305A\u308C\u3066\u53F3\u7AEF\u304C\u5207\u308C\u308B\u306E\u3067\u3001\n // !important \u3067\u78BA\u5B9F\u306B\u6253\u3061\u6D88\u3059\uFF08\u7528\u7D19\u306E\u4F59\u767D\u306F options.page.margin \u304C\u53D7\u3051\u6301\u3064\uFF09\u3002\n const reset = `<style data-rhtp-reset>html,body{margin:0 !important;padding:0 !important;background:transparent}html{-webkit-text-size-adjust:100%}</style>`;\n\n if (typeof input === 'string') {\n // \u5B8C\u5168\u306A HTML \u6587\u66F8\u306A\u3089\u305D\u306E\u307E\u307E\u3002<head> \u306E\u76F4\u5F8C\u306B base \u3068\u30EA\u30BB\u30C3\u30C8\u3092\u5DEE\u3057\u8FBC\u3080\u3002\n if (/<html[\\s>]/i.test(input)) {\n let html = input;\n html = /<head[^>]*>/i.test(html)\n ? html.replace(/<head[^>]*>/i, (m) => `${m}${base}${reset}`)\n : html.replace(/<html[^>]*>/i, (m) => `${m}<head>${base}${reset}</head>`);\n return opts.mediaPrint ? expandPrintMedia(html) : html;\n }\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint);\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body>${input}</body></html>`;\n }\n\n // \u8981\u7D20: outerHTML \u3068\u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u6301\u3061\u8FBC\u3080\u3002\n // <html> / <body> \u306E\u5C5E\u6027\uFF08class, lang, data-* \u2026\uFF09\u3082\u5199\u3057\u3001`body.reissue .x` \u306E\u3088\u3046\u306A\u7956\u5148\u4F9D\u5B58\u306E\u30BB\u30EC\u30AF\u30BF\u3092\u52B9\u304B\u305B\u308B\u3002\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint) + shadowHostStyles(input, opts.stylesheets, opts.mediaPrint);\n const htmlAttrs = copyAttrs(document.documentElement);\n const bodyAttrs = copyAttrs(document.body);\n const body = serializeElement(input, opts.warn ?? (() => {}));\n return `<!DOCTYPE html><html${htmlAttrs}><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body${bodyAttrs}>${body}</body></html>`;\n}\n\n/**\n * @param {'inherit'|'none'|string[]} stylesheets\n * @param {boolean} mediaPrint\n * @returns {string}\n */\nfunction collectStyles(stylesheets, mediaPrint) {\n if (stylesheets === 'none') return '';\n /** @type {string[]} */\n const parts = [];\n if (stylesheets === 'inherit') {\n for (const el of document.querySelectorAll('style, link[rel~=\"stylesheet\"]')) {\n if (el.hasAttribute('data-rhtp-reset')) continue;\n if (el instanceof HTMLStyleElement) {\n const css = el.textContent ?? '';\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(css) : css}</style>`);\n } else if (el instanceof HTMLLinkElement) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(el.href)}\"${el.media ? ` media=\"${escapeAttr(el.media)}\"` : ''}>`);\n }\n }\n // document.adoptedStyleSheets\uFF08CSSOM \u3067\u7D44\u307F\u7ACB\u3066\u305F\u30B9\u30BF\u30A4\u30EB\uFF09\u306F <style> \u306B\u51FA\u3066\u3053\u306A\u3044\u306E\u3067\u53D6\u308A\u51FA\u3059\n const adopted = cssTextOf(document.adoptedStyleSheets);\n if (adopted) parts.push(`<style>${mediaPrint ? expandPrintMediaCss(adopted) : adopted}</style>`);\n return parts.join('');\n }\n for (const s of stylesheets) {\n if (/^(https?:)?\\/\\/|^\\.{0,2}\\/|\\.css(\\?|$)/i.test(s) && !s.includes('{')) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(s)}\">`);\n } else {\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(s) : s}</style>`);\n }\n }\n return parts.join('');\n}\n\n/**\n * \u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u306E\u8981\u7D20\u3092\u6E21\u3055\u308C\u305F\u3068\u304D\u3001\u305D\u306E\u8981\u7D20\u304C\u5C5E\u3059\u308B\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\n * \uFF08\u304A\u3088\u3073\u305D\u306E\u5916\u5074\u306E\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\uFF09\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u53D6\u308A\u51FA\u3059\u3002\n * \u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u306F\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306B\u5C4A\u304B\u306A\u3044\u305F\u3081\u3001`stylesheets: 'inherit'` \u3067\u306F\u62FE\u3048\u306A\u3044\u3002\n *\n * @param {Element} input\n * @param {'inherit'|'none'|string[]} stylesheets\n * @param {boolean} mediaPrint\n * @returns {string}\n */\nfunction shadowHostStyles(input, stylesheets, mediaPrint) {\n if (stylesheets !== 'inherit') return '';\n /** @type {string[]} */\n const parts = [];\n let node = /** @type {Node|null} */ (input.getRootNode());\n // \u5185\u5074\u306E\u30C4\u30EA\u30FC\u304B\u3089\u9806\u306B\u96C6\u3081\u3001\u5916\u5074\u307B\u3069\u5148\uFF08\u512A\u5148\u5EA6\u304C\u4F4E\u3044\u4F4D\u7F6E\uFF09\u306B\u7F6E\u304F\n while (node && node !== document && 'host' in node) {\n const root = /** @type {ShadowRoot} */ (node);\n const css = [...root.querySelectorAll('style')].map((el) => el.textContent ?? '').join('\\n') + '\\n' + cssTextOf(root.adoptedStyleSheets);\n if (css.trim()) parts.unshift(css);\n node = root.host.getRootNode();\n }\n return parts.map((css) => `<style>${mediaPrint ? expandPrintMediaCss(css) : css}</style>`).join('');\n}\n\n/**\n * \u5185\u5BB9\u304C\u672C\u6587\u9818\u57DF\u3088\u308A\u6A2A\u306B\u5E83\u3044\u3068\u3001\u53F3\u5074\u304C\u5207\u308C\u305F\u307E\u307E\u6C17\u3065\u304B\u308C\u306B\u304F\u3044\u306E\u3067\u8B66\u544A\u3059\u308B\u3002\n * \u56FA\u5B9A\u5E45 + `box-sizing: content-box` \u3084\u3001\u7573\u3081\u306A\u3044\u8868\u304C\u539F\u56E0\u306B\u306A\u308A\u3084\u3059\u3044\u3002\n *\n * @param {Document} doc\n * @param {number} widthPx \u672C\u6587\u9818\u57DF\u306E\u5E45\uFF08px\uFF09\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n */\nfunction warnIfTooWide(doc, widthPx, warn) {\n const width = Math.max(doc.documentElement.scrollWidth, doc.body.scrollWidth);\n const over = width - widthPx;\n // 1px \u672A\u6E80\u306F\u4E38\u3081\u8AA4\u5DEE\u3068\u307F\u306A\u3059\n if (over < 1) return;\n const mm = (/** @type {number} */ px) => Math.round((px / 96) * 25.4 * 10) / 10;\n warn({\n code: 'other',\n message:\n `Content is ${Math.round(over)}px (${mm(over)}mm) wider than the page content area ` +\n `(${Math.round(width)}px vs ${Math.round(widthPx)}px); the right side will be clipped. ` +\n 'Common causes: a fixed width plus padding/border without box-sizing: border-box, or a table that cannot shrink.',\n });\n}\n\n/** \u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3092\u6301\u3066\u306A\u3044\u8981\u7D20\uFF08void \u8981\u7D20\uFF09\u3002outerHTML \u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3002 */\nconst VOID_TAGS = new Set(['AREA', 'BASE', 'BR', 'COL', 'EMBED', 'HR', 'IMG', 'INPUT', 'LINK', 'META', 'SOURCE', 'TRACK', 'WBR']);\n\n/**\n * \u8981\u7D20\u3092 outerHTML \u76F8\u5F53\u306E\u6587\u5B57\u5217\u306B\u3059\u308B\u3002\u958B\u3044\u3066\u3044\u308B\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306F\n * `<template shadowrootmode>`\uFF08\u5BA3\u8A00\u7684\u30B7\u30E3\u30C9\u30A6 DOM\uFF09\u3068\u3057\u3066\u4E00\u7DD2\u306B\u76F4\u5217\u5316\u3057\u3001\n * iframe \u5074\u306E\u30D1\u30FC\u30B5\u306B\u672C\u7269\u306E ShadowRoot \u3068\u3057\u3066\u5FA9\u5143\u3055\u305B\u308B\u3002\n *\n * `adoptedStyleSheets` \u306F\u76F4\u5217\u5316\u3055\u308C\u306A\u3044\u306E\u3067\u3001\u4E00\u6642\u7684\u306B `<style>` \u3068\u3057\u3066\u5DEE\u3057\u8FBC\u3093\u3067\u304B\u3089\u76F4\u5217\u5316\u3059\u308B\n * \uFF08\u540C\u671F\u51E6\u7406\u306E\u3046\u3061\u306B\u5143\u3078\u623B\u3059\u306E\u3067\u753B\u9762\u306B\u306F\u5F71\u97FF\u3057\u306A\u3044\uFF09\u3002\n *\n * @param {Element} input\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n * @returns {string}\n */\nfunction serializeElement(input, warn) {\n const whole = input === document.body || input === document.documentElement;\n const roots = collectShadowRoots(whole ? document.body : input);\n if (!roots.length) return whole ? document.body.innerHTML : input.outerHTML;\n\n const host = whole ? document.body : input;\n if (typeof (/** @type {any} */ (host).getHTML) !== 'function') {\n warn({\n code: 'unsupported-css',\n message:\n 'This browser lacks Element.getHTML(); shadow DOM content cannot be serialized and will be missing from the PDF. ' +\n 'Pass an element inside the shadow root instead.',\n element: input,\n });\n return whole ? document.body.innerHTML : input.outerHTML;\n }\n\n const restore = inlineAdoptedStyleSheets(roots);\n try {\n const opts = { serializableShadowRoots: true, shadowRoots: roots };\n const inner = /** @type {string} */ (/** @type {any} */ (host).getHTML(opts));\n if (whole) return inner;\n const tag = input.tagName.toLowerCase();\n // void \u8981\u7D20\u306F\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3082\u5B50\u3082\u6301\u305F\u306A\u3044\u306E\u3067\u901A\u5E38\u306E outerHTML \u3067\u3088\u3044\n if (VOID_TAGS.has(input.tagName)) return input.outerHTML;\n return `<${tag}${copyAttrs(input)}>${inner}</${tag}>`;\n } finally {\n restore();\n }\n}\n\n/**\n * root \u4EE5\u4E0B\uFF08\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u3082\u542B\u3080\uFF09\u306E open \u306A\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u3092\u96C6\u3081\u308B\u3002\n * closed \u306A\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306F\u53C2\u7167\u3067\u304D\u306A\u3044\u305F\u3081\u5BFE\u8C61\u5916\u3002\n * @param {Element|ShadowRoot} root\n * @returns {ShadowRoot[]}\n */\nfunction collectShadowRoots(root) {\n /** @type {ShadowRoot[]} */\n const out = [];\n /** @param {Element|ShadowRoot} node */\n const walk = (node) => {\n if (node instanceof Element && node.shadowRoot) {\n out.push(node.shadowRoot);\n walk(node.shadowRoot);\n }\n for (const child of node.children) walk(child);\n };\n walk(root);\n return out;\n}\n\n/**\n * \u5404\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306E adoptedStyleSheets \u3092\u4E00\u6642\u7684\u306B `<style>` \u3068\u3057\u3066\u5DEE\u3057\u8FBC\u3080\u3002\n * \u623B\u308A\u5024\u3092\u547C\u3076\u3068\u53D6\u308A\u9664\u304F\u3002\n * @param {ShadowRoot[]} roots\n * @returns {() => void}\n */\nfunction inlineAdoptedStyleSheets(roots) {\n /** @type {HTMLStyleElement[]} */\n const added = [];\n for (const root of roots) {\n const css = cssTextOf(root.adoptedStyleSheets);\n if (!css) continue;\n const style = document.createElement('style');\n style.setAttribute('data-rhtp-adopted', '');\n style.textContent = css;\n root.insertBefore(style, root.firstChild);\n added.push(style);\n }\n return () => {\n for (const style of added) style.remove();\n };\n}\n\n/**\n * CSSStyleSheet \u306E\u914D\u5217\u3092 CSS \u30C6\u30AD\u30B9\u30C8\u306B\u3059\u308B\u3002\u8AAD\u3081\u306A\u3044\u3082\u306E\uFF08\u30AF\u30ED\u30B9\u30AA\u30EA\u30B8\u30F3\uFF09\u306F\u98DB\u3070\u3059\u3002\n * @param {readonly CSSStyleSheet[]|undefined} sheets\n * @returns {string}\n */\nfunction cssTextOf(sheets) {\n if (!sheets || !sheets.length) return '';\n const parts = [];\n for (const sheet of sheets) {\n try {\n for (const rule of sheet.cssRules) parts.push(rule.cssText);\n } catch {\n // \u30AF\u30ED\u30B9\u30AA\u30EA\u30B8\u30F3\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u306F\u8AAD\u3081\u306A\u3044\n }\n }\n return parts.join('\\n');\n}\n\n/**\n * iframe \u5185\u306B\u3001\u6587\u66F8\u306B\u51FA\u3066\u304F\u308B\u30AB\u30B9\u30BF\u30E0\u8981\u7D20\u540D\u306E\u7A7A\u306E\u30B9\u30BF\u30D6\u3092\u5B9A\u7FA9\u3059\u308B\u3002\n * \u3053\u308C\u3092\u3057\u306A\u3044\u3068\u8981\u7D20\u304C\u672A\u5B9A\u7FA9\u306E\u307E\u307E\u3067 `:defined` \u304C\u30DE\u30C3\u30C1\u305B\u305A\u3001\u65E2\u5B9A\u306E `display: inline` \u3067\u7D44\u307E\u308C\u3066\u3057\u307E\u3046\u3002\n * @param {Document} doc\n * @param {Window} win\n */\nfunction defineStubElements(doc, win) {\n const registry = /** @type {CustomElementRegistry|undefined} */ (/** @type {any} */ (win).customElements);\n const Base = /** @type {typeof HTMLElement|undefined} */ (/** @type {any} */ (win).HTMLElement);\n if (!registry || !Base) return;\n /** @type {Set<string>} */\n const names = new Set();\n /** @param {ParentNode} node */\n const scan = (node) => {\n for (const el of node.querySelectorAll('*')) {\n // `is=` \u306B\u3088\u308B\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u30C9\u7D44\u307F\u8FBC\u307F\u8981\u7D20\u306F\u5BFE\u8C61\u5916\uFF08\u5B9A\u7FA9\u306B extends \u304C\u5FC5\u8981\u306A\u305F\u3081\uFF09\n if (el.tagName.includes('-') && !el.hasAttribute('is')) names.add(el.tagName.toLowerCase());\n if (el.shadowRoot) scan(el.shadowRoot);\n }\n };\n scan(doc);\n for (const name of names) {\n if (registry.get(name)) continue;\n try {\n registry.define(name, class extends Base {});\n } catch {\n // \u4E0D\u6B63\u306A\u540D\u524D\u306A\u3069\u306F\u7121\u8996\u3059\u308B\n }\n }\n}\n\n/**\n * HTML \u6587\u5B57\u5217\u4E2D\u306E <style> \u5185\u306E @media print \u3092\u5C55\u958B\u3059\u308B\u3002\n * @param {string} html\n */\nfunction expandPrintMedia(html) {\n return html.replace(/<style([^>]*)>([\\s\\S]*?)<\\/style>/gi, (_m, attrs, css) => `<style${attrs}>${expandPrintMediaCss(css)}</style>`);\n}\n\n/**\n * `@media print { ... }` \u30D6\u30ED\u30C3\u30AF\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u5C55\u958B\u3057\u3001`@media screen { ... }` \u3092\u9664\u53BB\u3059\u308B\u3002\n * \u5358\u7D14\u306A\u62EC\u5F27\u306E\u5BFE\u5FDC\u3067\u51E6\u7406\u3059\u308B\uFF08\u30CD\u30B9\u30C8\u3057\u305F @media \u306F\u60F3\u5B9A\u3057\u306A\u3044\uFF09\u3002\n * @param {string} css\n * @returns {string}\n */\nexport function expandPrintMediaCss(css) {\n let out = '';\n let i = 0;\n while (i < css.length) {\n const m = /@media\\s*([^{]+)\\{/g;\n m.lastIndex = i;\n const hit = m.exec(css);\n if (!hit) {\n out += css.slice(i);\n break;\n }\n out += css.slice(i, hit.index);\n // \u30D6\u30ED\u30C3\u30AF\u306E\u7D42\u308F\u308A\u3092\u63A2\u3059\n let depth = 1;\n let j = m.lastIndex;\n while (j < css.length && depth > 0) {\n if (css[j] === '{') depth++;\n else if (css[j] === '}') depth--;\n j++;\n }\n const query = /** @type {string} */ (hit[1]).trim();\n const body = css.slice(m.lastIndex, j - 1);\n if (/\\bprint\\b/.test(query)) out += body;\n else if (/^\\s*(only\\s+)?screen\\b/.test(query) && !/\\band\\b/.test(query)) out += '';\n else out += css.slice(hit.index, j);\n i = j;\n }\n return out;\n}\n\n/**\n * \u8981\u7D20\u306E\u5C5E\u6027\u3092 ` name=\"value\"` \u306E\u4E26\u3073\u306B\u3059\u308B\uFF08\u30A4\u30D9\u30F3\u30C8\u30CF\u30F3\u30C9\u30E9\u5C5E\u6027\u306F\u9664\u304F\uFF09\u3002\n * @param {Element} el\n */\nfunction copyAttrs(el) {\n let out = '';\n for (const a of el.attributes) {\n if (/^on/i.test(a.name)) continue;\n out += ` ${a.name}=\"${escapeAttr(a.value)}\"`;\n }\n return out;\n}\n\n/** @param {string} s */\nfunction escapeAttr(s) {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n}\n\n/** @param {Document} doc */\nasync function waitForStylesheets(doc) {\n const links = [...doc.querySelectorAll('link[rel~=\"stylesheet\"]')];\n await Promise.all(\n links.map(\n (l) =>\n new Promise((resolve) => {\n const link = /** @type {HTMLLinkElement} */ (l);\n if (link.sheet) return resolve(undefined);\n link.addEventListener('load', () => resolve(undefined), { once: true });\n link.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/** @param {Document} doc */\nasync function waitForFonts(doc) {\n // \u4F7F\u7528\u4E2D\u306E\u30D5\u30A9\u30F3\u30C8\u8AAD\u307F\u8FBC\u307F\u3092\u8D77\u52D5\u3055\u305B\u308B\u305F\u3081\u306B\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u5F37\u5236\n void doc.body.offsetHeight;\n if (doc.fonts) {\n await doc.fonts.ready;\n // ready \u5F8C\u306B\u65B0\u305F\u306B\u8AAD\u307F\u8FBC\u307F\u304C\u59CB\u307E\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001loading \u72B6\u614B\u306E\u3082\u306E\u3092\u5F85\u3064\n const loading = [...doc.fonts].filter((f) => f.status === 'loading').map((f) => f.loaded.catch(() => undefined));\n if (loading.length) await Promise.all(loading);\n await doc.fonts.ready;\n }\n}\n\n/** @param {Document} doc */\nasync function waitForImages(doc) {\n const imgs = [...doc.images];\n await Promise.all(\n imgs.map((img) =>\n img.complete\n ? img.decode().catch(() => undefined)\n : new Promise((resolve) => {\n img.addEventListener('load', () => img.decode().catch(() => undefined).then(resolve), { once: true });\n img.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/**\n * ::before / ::after \u3092\u5B9F\u4F53\u306E <span> \u306B\u7F6E\u304D\u63DB\u3048\u308B\u3002\n * \u64EC\u4F3C\u8981\u7D20\u306F DOM \u30CE\u30FC\u30C9\u3092\u6301\u305F\u305A Range \u3067\u8A08\u6E2C\u3067\u304D\u306A\u3044\u305F\u3081\u3001computed style \u3092\u3059\u3079\u3066\u5199\u3057\u305F span \u3092\n * \u540C\u3058\u4F4D\u7F6E\u306B\u633F\u5165\u3057\u3001\u5143\u306E\u64EC\u4F3C\u8981\u7D20\u306F content: none \u3067\u6D88\u3059\u3002\u6587\u5B57\u5217 content \u306E\u307F\u5BFE\u5FDC\uFF08counter / url \u306F\u8B66\u544A\uFF09\u3002\n * @param {Document} doc\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n */\nexport function materializePseudoElements(doc, warn) {\n const win = doc.defaultView;\n if (!win) return;\n /** @type {{el: Element, pseudo: 'before'|'after', text: string, styles: [string, string][]}[]} */\n const jobs = [];\n for (const el of deepQueryAll(doc.body)) {\n for (const pseudo of /** @type {('before'|'after')[]} */ (['before', 'after'])) {\n const ps = win.getComputedStyle(el, `::${pseudo}`);\n const content = ps.content;\n if (!content || content === 'none' || content === 'normal' || ps.display === 'none') continue;\n const text = parseContentString(content);\n if (text === null) {\n warn({\n code: 'unsupported-css',\n message: `::${pseudo} content \"${content}\" is not supported (only quoted strings are); the pseudo-element is skipped`,\n element: el,\n property: 'content',\n });\n continue;\n }\n /** @type {[string, string][]} */\n const styles = [];\n for (let i = 0; i < ps.length; i++) {\n const prop = /** @type {string} */ (ps[i]);\n if (prop === 'content' || prop.startsWith('-webkit-') || prop.startsWith('-moz-')) continue;\n styles.push([prop, ps.getPropertyValue(prop)]);\n }\n jobs.push({ el, pseudo, text, styles });\n }\n }\n if (!jobs.length) return;\n\n const disableCss =\n '[data-rhtp-pseudo-host~=\"before\"]::before{content:none!important;display:none!important}' +\n '[data-rhtp-pseudo-host~=\"after\"]::after{content:none!important;display:none!important}';\n const style = doc.createElement('style');\n style.setAttribute('data-rhtp-pseudo', '');\n style.textContent = disableCss;\n doc.head.appendChild(style);\n // \u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u306F\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306B\u5C4A\u304B\u306A\u3044\u306E\u3067\u3001\u5BFE\u8C61\u3092\u542B\u3080\u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306B\u3082\u540C\u3058\u898F\u5247\u3092\u5165\u308C\u308B\n for (const root of new Set(jobs.map((j) => j.el.getRootNode()).filter((r) => r !== doc))) {\n const inner = doc.createElement('style');\n inner.setAttribute('data-rhtp-pseudo', '');\n inner.textContent = disableCss;\n /** @type {ShadowRoot} */ (root).appendChild(inner);\n }\n\n for (const job of jobs) {\n const span = doc.createElement('span');\n span.setAttribute('data-rhtp-pseudo', job.pseudo);\n for (const [prop, value] of job.styles) span.style.setProperty(prop, value);\n span.textContent = job.text;\n const hosts = (job.el.getAttribute('data-rhtp-pseudo-host') ?? '').split(' ').filter(Boolean);\n hosts.push(job.pseudo);\n job.el.setAttribute('data-rhtp-pseudo-host', hosts.join(' '));\n if (job.pseudo === 'before') job.el.insertBefore(span, job.el.firstChild);\n else job.el.appendChild(span);\n }\n}\n\n/**\n * root \u4EE5\u4E0B\u306E\u3059\u3079\u3066\u306E\u8981\u7D20\u3092\u3001\u30B7\u30E3\u30C9\u30A6\u30C4\u30EA\u30FC\u306E\u4E2D\u3082\u542B\u3081\u3066\u5217\u6319\u3059\u308B\u3002\n * @param {Element|ShadowRoot} root\n * @returns {Element[]}\n */\nfunction deepQueryAll(root) {\n /** @type {Element[]} */\n const out = [];\n /** @param {Element|ShadowRoot} node */\n const walk = (node) => {\n for (const el of node.querySelectorAll('*')) {\n out.push(el);\n if (el.shadowRoot) walk(el.shadowRoot);\n }\n };\n walk(root);\n return out;\n}\n\n/**\n * computed content \u5024\uFF08'\"\u203B \"' / '\"a\" \"b\"' / 'counter(x)' \u2026\uFF09\u304B\u3089\u6587\u5B57\u5217\u3092\u53D6\u308A\u51FA\u3059\u3002\n * \u6587\u5B57\u5217\u4EE5\u5916\u306E\u30C8\u30FC\u30AF\u30F3\u304C\u542B\u307E\u308C\u308B\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseContentString(value) {\n let out = '';\n let i = 0;\n const v = value.trim();\n while (i < v.length) {\n const ch = v[i];\n if (ch === ' ' || ch === '\\t') {\n i++;\n continue;\n }\n if (ch !== '\"' && ch !== \"'\") return null;\n const quote = ch;\n i++;\n while (i < v.length && v[i] !== quote) {\n if (v[i] === '\\\\') {\n i++;\n const hex = /^[0-9a-fA-F]{1,6}/.exec(v.slice(i));\n if (hex) {\n out += String.fromCodePoint(parseInt(hex[0], 16));\n i += hex[0].length;\n if (v[i] === ' ') i++;\n } else {\n out += v[i] ?? '';\n i++;\n }\n } else {\n out += v[i];\n i++;\n }\n }\n i++; // closing quote\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u5358\u4F4D\u30FB\u8272\u306E\u5909\u63DB\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u3002\n * \u5185\u90E8\u5EA7\u6A19\u306F CSS px\uFF08\u30D6\u30E9\u30A6\u30B6\u8A08\u6E2C\u5024\uFF09\u3067\u6301\u3061\u3001PDF \u51FA\u529B\u6642\u306B pt \u3078\u5909\u63DB\u3059\u308B\u3002\n */\n\n/** 1 CSS px = 0.75 pt\uFF0896dpi \u57FA\u6E96\uFF09 */\nexport const PX_TO_PT = 0.75;\n/** 1 mm = 72 / 25.4 pt */\nexport const MM_TO_PT = 72 / 25.4;\n\n/** @type {Record<string, {width: number, height: number}>} \u7528\u7D19\u30B5\u30A4\u30BA\uFF08pt\uFF09 */\nexport const PAGE_SIZES = {\n A3: { width: 297 * MM_TO_PT, height: 420 * MM_TO_PT },\n A4: { width: 210 * MM_TO_PT, height: 297 * MM_TO_PT },\n A5: { width: 148 * MM_TO_PT, height: 210 * MM_TO_PT },\n B4: { width: 257 * MM_TO_PT, height: 364 * MM_TO_PT },\n B5: { width: 182 * MM_TO_PT, height: 257 * MM_TO_PT },\n Letter: { width: 612, height: 792 },\n Legal: { width: 612, height: 1008 },\n};\n\n/**\n * CSS \u9577\u3055\u6587\u5B57\u5217\uFF08'15mm', '1in', '12pt', '100px', '2cm'\uFF09\u3092 pt \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u5358\u4F4D\u306A\u3057\u306E\u6570\u5024\u306F px \u3068\u307F\u306A\u3059\u3002\n * @param {string|number} value\n * @returns {number}\n */\nexport function lengthToPt(value) {\n if (typeof value === 'number') return value * PX_TO_PT;\n const m = /^\\s*(-?[\\d.]+)\\s*([a-z%]*)\\s*$/i.exec(value);\n if (!m) throw new Error(`Invalid CSS length: ${value}`);\n const n = parseFloat(/** @type {string} */ (m[1]));\n switch ((m[2] ?? '').toLowerCase()) {\n case '':\n case 'px':\n return n * PX_TO_PT;\n case 'pt':\n return n;\n case 'mm':\n return n * MM_TO_PT;\n case 'cm':\n return n * MM_TO_PT * 10;\n case 'in':\n return n * 72;\n case 'pc':\n return n * 12;\n default:\n throw new Error(`Unsupported CSS unit: ${value}`);\n }\n}\n\n/** @param {number} pt @returns {number} */\nexport function ptToPx(pt) {\n return pt / PX_TO_PT;\n}\n\n/**\n * getComputedStyle \u304C\u8FD4\u3059 px \u6587\u5B57\u5217\uFF08'12px'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function cssPx(value) {\n const n = parseFloat(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * @typedef {{r: number, g: number, b: number, a: number}} Rgba \u5404\u6210\u5206 0\u301C1\n */\n\n/**\n * getComputedStyle \u306E\u8272\u6587\u5B57\u5217\uFF08'rgb(34, 34, 34)' / 'rgba(0, 0, 0, 0.5)' / 'transparent'\n * / 'color(srgb ...)'\uFF09\u3092\u30D1\u30FC\u30B9\u3059\u308B\u3002\u30D1\u30FC\u30B9\u3067\u304D\u306A\u3044\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {Rgba|null}\n */\nexport function parseColor(value) {\n if (!value) return null;\n const v = value.trim();\n if (v === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n let m = /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1])) / 255),\n g: clamp01(parseFloat(/** @type {string} */ (m[2])) / 255),\n b: clamp01(parseFloat(/** @type {string} */ (m[3])) / 255),\n a: clamp01(a),\n };\n }\n m = /^color\\(srgb\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*(?:\\/\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1]))),\n g: clamp01(parseFloat(/** @type {string} */ (m[2]))),\n b: clamp01(parseFloat(/** @type {string} */ (m[3]))),\n a: clamp01(a),\n };\n }\n m = /^#([0-9a-f]{3,8})$/i.exec(v);\n if (m) {\n let h = /** @type {string} */ (m[1]);\n if (h.length === 3 || h.length === 4) h = h.split('').map((c) => c + c).join('');\n const n = parseInt(h.padEnd(8, 'f'), 16);\n return { r: ((n >>> 24) & 255) / 255, g: ((n >>> 16) & 255) / 255, b: ((n >>> 8) & 255) / 255, a: (n & 255) / 255 };\n }\n return null;\n}\n\n/** @param {number} n */\nfunction clamp01(n) {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * PDF \u7528\u306B\u6570\u5024\u3092\u4E38\u3081\u3066\u6587\u5B57\u5217\u5316\u3059\u308B\uFF08\u5C0F\u6570\u7B2C 3 \u4F4D\u307E\u3067\u3001\u672B\u5C3E\u30BC\u30ED\u9664\u53BB\uFF09\u3002\n * @param {number} n\n * @returns {string}\n */\nexport function num(n) {\n if (!Number.isFinite(n)) return '0';\n const s = n.toFixed(3);\n const t = s.includes('.') ? s.replace(/\\.?0+$/, '') : s;\n return t === '' || t === '-0' || t === '-' ? '0' : t;\n}\n", "// @ts-check\n/**\n * GSUB\uFF08\u30B0\u30EA\u30D5\u7F6E\u63DB\uFF09\u306E\u5358\u4E00\u7F6E\u63DB\u3060\u3051\u3092\u8AAD\u3080\u3002\n *\n * \u30D6\u30E9\u30A6\u30B6\u304C `font-variant-*` / `font-feature-settings` \u3067\u6709\u52B9\u306B\u3057\u305F\u6A5F\u80FD\u3092\u3001\n * \u540C\u3058\u7D50\u679C\u306B\u306A\u308B\u3088\u3046\u306B gid \u2192 gid \u306E\u7F6E\u63DB\u3068\u3057\u3066\u518D\u73FE\u3059\u308B\u3002\n * \u7F6E\u63DB\u306F\u57CB\u3081\u8FBC\u307F\u524D\u306B\u89E3\u6C7A\u3059\u308B\u306E\u3067\u3001PDF \u306B GSUB \u30C6\u30FC\u30D6\u30EB\u81EA\u4F53\u306F\u5165\u3089\u306A\u3044\u3002\n *\n * \u5BFE\u5FDC\u3059\u308B\u306E\u306F Lookup \u30BF\u30A4\u30D7 1\uFF08\u5358\u4E00\u7F6E\u63DB\u3001\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 1 / 2\uFF09\u3068\u3001\n * \u305D\u308C\u3092\u5305\u3080\u30BF\u30A4\u30D7 7\uFF08\u62E1\u5F35\uFF09\u3060\u3051\u3002\u30BF\u30A4\u30D7 4\uFF08\u5408\u5B57\uFF09\u306F\u30B0\u30EA\u30D5\u6570\u304C\u5909\u308F\u308B\u305F\u3081\u3001\n * 1 \u6587\u5B57\u305A\u3064\u4F4D\u7F6E\u3092\u5B9F\u6E2C\u3059\u308B\u8D70\u67FB\u30E2\u30C7\u30EB\u3067\u306F\u6271\u3048\u306A\u3044\u3002\n */\n\n/**\n * @typedef {object} GsubTable\n * @property {Map<string, number[]>} features \u6A5F\u80FD\u30BF\u30B0 \u2192 Lookup \u756A\u53F7\n * @property {(index: number) => Map<number, number>|null} lookup \u5358\u4E00\u7F6E\u63DB\u306E Lookup \u3092\u8AAD\u3080\uFF08\u5BFE\u5FDC\u5916\u306A\u3089 null\uFF09\n */\n\n/**\n * GSUB \u3092\u8AAD\u3080\u3002\u7121\u3044\u30FB\u58CA\u308C\u3066\u3044\u308B\u5834\u5408\u306F null\u3002\n * @param {import('./parse.js').ParsedFont} font\n * @returns {GsubTable|null}\n */\nexport function parseGsub(font) {\n const t = font.tables.get('GSUB');\n if (!t || t.length < 10) return null;\n const dv = new DataView(font.data.buffer, font.data.byteOffset, font.data.byteLength);\n const base = t.offset;\n try {\n const featureListOff = base + dv.getUint16(base + 6);\n const lookupListOff = base + dv.getUint16(base + 8);\n\n /** @type {Map<string, number[]>} */\n const features = new Map();\n const featureCount = dv.getUint16(featureListOff);\n for (let i = 0; i < featureCount; i++) {\n const rec = featureListOff + 2 + i * 6;\n const tag = String.fromCharCode(dv.getUint8(rec), dv.getUint8(rec + 1), dv.getUint8(rec + 2), dv.getUint8(rec + 3));\n const featureOff = featureListOff + dv.getUint16(rec + 4);\n const count = dv.getUint16(featureOff + 2);\n const list = features.get(tag) ?? [];\n for (let j = 0; j < count; j++) list.push(dv.getUint16(featureOff + 4 + j * 2));\n features.set(tag, list);\n }\n\n const lookupCount = dv.getUint16(lookupListOff);\n /** @type {Map<number, Map<number, number>|null>} */\n const cache = new Map();\n /** @param {number} index */\n const lookup = (index) => {\n if (cache.has(index)) return /** @type {Map<number, number>|null} */ (cache.get(index) ?? null);\n let result = null;\n if (index >= 0 && index < lookupCount) {\n const off = lookupListOff + dv.getUint16(lookupListOff + 2 + index * 2);\n result = readLookup(dv, off, dv.getUint16(off), dv.getUint16(off + 4), off + 6);\n }\n cache.set(index, result);\n return result;\n };\n\n return { features, lookup };\n } catch {\n return null; // \u58CA\u308C\u305F GSUB \u306F\u7121\u3044\u3082\u306E\u3068\u3057\u3066\u6271\u3046\n }\n}\n\n/**\n * @param {DataView} dv\n * @param {number} lookupOff\n * @param {number} type\n * @param {number} subTableCount\n * @param {number} offsetsAt \u30B5\u30D6\u30C6\u30FC\u30D6\u30EB\u30AA\u30D5\u30BB\u30C3\u30C8\u914D\u5217\u306E\u4F4D\u7F6E\n * @returns {Map<number, number>|null}\n */\nfunction readLookup(dv, lookupOff, type, subTableCount, offsetsAt) {\n if (type !== 1 && type !== 7) return null;\n /** @type {Map<number, number>} */\n const map = new Map();\n for (let i = 0; i < subTableCount; i++) {\n let sub = lookupOff + dv.getUint16(offsetsAt + i * 2);\n if (type === 7) {\n // \u62E1\u5F35: \u5B9F\u4F53\u306E\u578B\u3068\u30AA\u30D5\u30BB\u30C3\u30C8\u3092\u8AAD\u307F\u76F4\u3059\n if (dv.getUint16(sub) !== 1) continue;\n if (dv.getUint16(sub + 2) !== 1) continue; // \u5358\u4E00\u7F6E\u63DB\u4EE5\u5916\u306F\u5BFE\u8C61\u5916\n sub += dv.getUint32(sub + 4);\n }\n readSingleSubst(dv, sub, map);\n }\n return map.size ? map : null;\n}\n\n/**\n * SingleSubst\uFF08\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 1 / 2\uFF09\u3092 map \u306B\u8AAD\u307F\u8FBC\u3080\u3002\n * @param {DataView} dv\n * @param {number} off\n * @param {Map<number, number>} map\n */\nfunction readSingleSubst(dv, off, map) {\n const format = dv.getUint16(off);\n const coverage = readCoverage(dv, off + dv.getUint16(off + 2));\n if (format === 1) {\n const delta = dv.getInt16(off + 4);\n for (const gid of coverage) map.set(gid, (gid + delta) & 0xffff);\n } else if (format === 2) {\n const count = dv.getUint16(off + 4);\n for (let i = 0; i < coverage.length && i < count; i++) {\n map.set(/** @type {number} */ (coverage[i]), dv.getUint16(off + 6 + i * 2));\n }\n }\n}\n\n/**\n * Coverage \u30C6\u30FC\u30D6\u30EB\u3092\u3001\u30AB\u30D0\u30EC\u30C3\u30B8\u756A\u53F7\u9806\u306E\u30B0\u30EA\u30D5\u914D\u5217\u3068\u3057\u3066\u8AAD\u3080\u3002\n * @param {DataView} dv\n * @param {number} off\n * @returns {number[]}\n */\nfunction readCoverage(dv, off) {\n const format = dv.getUint16(off);\n /** @type {number[]} */\n const out = [];\n if (format === 1) {\n const count = dv.getUint16(off + 2);\n for (let i = 0; i < count; i++) out.push(dv.getUint16(off + 4 + i * 2));\n } else if (format === 2) {\n const count = dv.getUint16(off + 2);\n for (let i = 0; i < count; i++) {\n const rec = off + 4 + i * 6;\n const start = dv.getUint16(rec);\n const end = dv.getUint16(rec + 2);\n const startIndex = dv.getUint16(rec + 4);\n for (let g = start; g <= end; g++) out[startIndex + (g - start)] = g;\n }\n }\n return out;\n}\n\n/**\n * \u6A5F\u80FD\u30BF\u30B0\u306E\u96C6\u5408\u304B\u3089\u7F6E\u63DB\u95A2\u6570\u3092\u4F5C\u308B\u3002Lookup \u756A\u53F7\u306E\u5C0F\u3055\u3044\u9806\u306B\u9069\u7528\u3059\u308B\u3002\n * @param {import('./parse.js').ParsedFont} font\n * @param {string[]} tags\n * @returns {((gid: number) => number)|null} \u7F6E\u63DB\u304C 1 \u3064\u3082\u7121\u3051\u308C\u3070 null\n */\nexport function buildSubstitution(font, tags) {\n const gsub = parseGsub(font);\n if (!gsub) return null;\n /** @type {number[]} */\n const indices = [];\n for (const tag of tags) for (const i of gsub.features.get(tag) ?? []) if (!indices.includes(i)) indices.push(i);\n if (!indices.length) return null;\n indices.sort((a, b) => a - b);\n /** @type {Map<number, number>[]} */\n const maps = [];\n for (const i of indices) {\n const m = gsub.lookup(i);\n if (m) maps.push(m);\n }\n if (!maps.length) return null;\n /** @type {Map<number, number>} */\n const memo = new Map();\n return (gid) => {\n const hit = memo.get(gid);\n if (hit !== undefined) return hit;\n let g = gid;\n for (const m of maps) g = m.get(g) ?? g;\n memo.set(gid, g);\n return g;\n };\n}\n\n/** CSS \u306E\u30AD\u30FC\u30EF\u30FC\u30C9 \u2192 OpenType \u306E\u6A5F\u80FD\u30BF\u30B0 */\nconst VARIANT_TAGS = /** @type {Record<string, string>} */ ({\n // font-variant-numeric\n 'lining-nums': 'lnum',\n 'oldstyle-nums': 'onum',\n 'proportional-nums': 'pnum',\n 'tabular-nums': 'tnum',\n 'diagonal-fractions': 'frac',\n 'stacked-fractions': 'afrc',\n ordinal: 'ordn',\n 'slashed-zero': 'zero',\n // font-variant-caps\n 'small-caps': 'smcp',\n 'all-small-caps': 'c2sc',\n 'petite-caps': 'pcap',\n 'all-petite-caps': 'c2pc',\n unicase: 'unic',\n 'titling-caps': 'titl',\n // font-variant-east-asian\n jis78: 'jp78',\n jis83: 'jp83',\n jis90: 'jp90',\n jis04: 'jp04',\n simplified: 'smpl',\n traditional: 'trad',\n 'full-width': 'fwid',\n 'proportional-width': 'pwid',\n ruby: 'ruby',\n});\n\n/**\n * computed style \u304B\u3089\u3001\u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u3066\u3044\u308B\u6A5F\u80FD\u30BF\u30B0\u3092\u96C6\u3081\u308B\u3002\n * \u65E2\u5B9A\u3067\u6709\u52B9\u306A\u6A5F\u80FD\uFF08ccmp / liga / calt\uFF09\u306F\u542B\u3081\u306A\u3044\uFF08\u5408\u5B57\u306F\u6271\u3048\u306A\u3044\u305F\u3081\uFF09\u3002\n *\n * @param {CSSStyleDeclaration} style\n * @returns {string[]}\n */\nexport function featureTagsOf(style) {\n /** @type {Set<string>} */\n const tags = new Set();\n const words = `${style.fontVariantNumeric ?? ''} ${style.fontVariantCaps ?? ''} ${style.fontVariantEastAsian ?? ''}`.split(/\\s+/);\n for (const w of words) {\n const tag = VARIANT_TAGS[w];\n if (tag) tags.add(tag);\n }\n // font-feature-settings: \"zero\" 1, \"jp90\"\n const ffs = style.fontFeatureSettings ?? '';\n if (ffs && ffs !== 'normal') {\n for (const part of ffs.split(',')) {\n const m = /^\\s*[\"']([A-Za-z0-9]{4})[\"']\\s*(.*)$/.exec(part);\n if (!m) continue;\n const value = /** @type {string} */ (m[2]).trim();\n if (value === '0' || value === 'off') continue;\n tags.add(/** @type {string} */ (m[1]));\n }\n }\n return [...tags];\n}\n", "// @ts-check\n/**\n * \u30C6\u30AD\u30B9\u30C8\u30CE\u30FC\u30C9\u306E\u8A08\u6E2C\u3002\n * Range \u3092 1 \u6587\u5B57\u305A\u3064\u5F35\u3063\u3066\u5404\u30B0\u30EA\u30D5\u306E\u77E9\u5F62\u3092\u5B9F\u6E2C\u3057\u3001\u884C\u3054\u3068\u306B\u30B0\u30EA\u30D5\u5217\uFF08GID\u30FB\u30DA\u30F3\u4F4D\u7F6E\uFF09\u3092\u8FD4\u3059\u3002\n * \u30D6\u30E9\u30A6\u30B6\u306E\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u7981\u5247\u30FB\u4E21\u7AEF\u63C3\u3048\u306E\u7D50\u679C\u304C\u305D\u306E\u307E\u307E\u4F4D\u7F6E\u306B\u53CD\u6620\u3055\u308C\u308B\u3002\n */\nimport { buildSubstitution } from '../font/gsub.js';\n\n/**\n * @typedef {object} MeasuredLine\n * @property {import('../font/registry.js').RegisteredFont} font\n * @property {number} baseline \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y\uFF08\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u5EA7\u6A19 px\uFF09\n * @property {number} top \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0A\u7AEF\n * @property {number} bottom \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0B\u7AEF\n * @property {import('./walk.js').Glyph[]} glyphs\n */\n\n/**\n * @typedef {object} MeasureOptions\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} families\n * @property {string[]} fallback\n * @property {import('../font/registry.js').RegisteredFont} primary\n * @property {number} weight\n * @property {'normal'|'italic'} fstyle\n * @property {number} size px\n * @property {'font'|'measure'|'auto'} textMeasure\n * @property {string[]} features \u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u3066\u3044\u308B OpenType \u6A5F\u80FD\u30BF\u30B0\uFF08GSUB \u306E\u5358\u4E00\u7F6E\u63DB\u3092\u518D\u73FE\u3059\u308B\uFF09\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {Element} element\n */\n\nconst WHITESPACE = new Set([0x20, 0x09, 0x0a, 0x0d, 0x0c, 0xa0, 0x3000, 0x2002, 0x2003, 0x2009, 0x200a, 0x202f, 0x205f]);\n\n/**\n * @param {Text} node\n * @param {CSSStyleDeclaration} style\n * @param {MeasureOptions} o\n * @returns {MeasuredLine[]}\n */\nexport function measureText(node, style, o) {\n const doc = node.ownerDocument;\n const text = applyTextTransform(node.data, style.textTransform);\n const range = doc.createRange();\n const baselineOffset = probeBaseline(doc, style);\n\n /** @type {MeasuredLine[]} */\n const lines = [];\n /** @type {MeasuredLine|null} */\n let cur = null;\n let curTop = NaN;\n /** @type {Set<number>} */\n const warnedCps = new Set();\n\n for (let i = 0; i < text.length; ) {\n const cp = /** @type {number} */ (text.codePointAt(i));\n const len = cp > 0xffff ? 2 : 1;\n const end = i + len;\n\n range.setStart(node, i);\n range.setEnd(node, Math.min(end, node.data.length));\n const rect = pickRect(range.getClientRects());\n i = end;\n if (!rect) continue; // \u6298\u308A\u7573\u307E\u308C\u305F\u7A7A\u767D\u30FB\u6539\u884C\n\n const resolved = resolveGlyph(cp, o, warnedCps);\n if (!resolved) continue;\n const { font, gid, cpForUnicode } = resolved;\n\n const top = rect.top;\n if (!cur || cur.font !== font || Math.abs(top - curTop) > 0.5) {\n cur = { font, baseline: top + baselineOffset, top, bottom: rect.bottom, glyphs: [] };\n curTop = top;\n lines.push(cur);\n }\n cur.top = Math.min(cur.top, top);\n cur.bottom = Math.max(cur.bottom, rect.bottom);\n // GSUB\uFF08\u5358\u4E00\u7F6E\u63DB\uFF09: \u30D6\u30E9\u30A6\u30B6\u304C\u6709\u52B9\u306B\u3057\u305F\u6A5F\u80FD\u3068\u540C\u3058\u7F6E\u63DB\u3092\u9069\u7528\u3059\u308B\n const subst = o.features.length ? substitutionFor(font.parsed, o.features) : null;\n const outGid = subst ? subst(gid) : gid;\n const advance = ((font.parsed.advances[outGid] ?? 0) * o.size) / font.parsed.unitsPerEm;\n cur.glyphs.push({ gid: outGid, cp: cpForUnicode, x: rect.left, advance });\n }\n return lines;\n}\n\n/** @type {WeakMap<import('../font/parse.js').ParsedFont, Map<string, ((gid: number) => number)|null>>} */\nconst substCache = new WeakMap();\n\n/**\n * (\u30D5\u30A9\u30F3\u30C8, \u6A5F\u80FD\u96C6\u5408) \u3054\u3068\u306E\u7F6E\u63DB\u95A2\u6570\u3002\u7D50\u679C\u306F null \u3082\u542B\u3081\u3066\u30AD\u30E3\u30C3\u30B7\u30E5\u3059\u308B\u3002\n * @param {import('../font/parse.js').ParsedFont} parsed\n * @param {string[]} features\n * @returns {((gid: number) => number)|null}\n */\nfunction substitutionFor(parsed, features) {\n let byKey = substCache.get(parsed);\n if (!byKey) {\n byKey = new Map();\n substCache.set(parsed, byKey);\n }\n const key = [...features].sort().join(',');\n if (byKey.has(key)) return byKey.get(key) ?? null;\n const fn = buildSubstitution(parsed, features);\n byKey.set(key, fn);\n return fn;\n}\n\n/**\n * 1 \u6587\u5B57\u5206\u306E\u77E9\u5F62\u306E\u3046\u3061\u5E45\u3092\u6301\u3064\u3082\u306E\u3092\u9078\u3076\u3002\u884C\u672B\u306E\u6298\u308A\u8FD4\u3057\u4F4D\u7F6E\u3067\u306F 2 \u3064\u8FD4\u308B\u3053\u3068\u304C\u3042\u308B\u3002\n * @param {DOMRectList} rects\n * @returns {DOMRect|null}\n */\nfunction pickRect(rects) {\n /** @type {DOMRect|null} */\n let best = null;\n for (const r of rects) {\n if (r.width > 0.01 && (!best || r.width > best.width)) best = r;\n }\n return best;\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u5BFE\u5FDC\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u3068 GID \u3092\u6C7A\u3081\u308B\u3002\n * @param {number} cp\n * @param {MeasureOptions} o\n * @param {Set<number>} warnedCps\n * @returns {{font: import('../font/registry.js').RegisteredFont, gid: number, cpForUnicode: number}|null}\n */\nfunction resolveGlyph(cp, o, warnedCps) {\n const tryFont = (/** @type {import('../font/registry.js').RegisteredFont|null} */ f, /** @type {number} */ c) => {\n const gid = f?.parsed.cmap.get(c);\n return f && gid ? { font: f, gid, cpForUnicode: cp } : null;\n };\n\n // \u7A7A\u767D\u985E: \u4E3B\u30D5\u30A9\u30F3\u30C8\u306E\u540C\u3058\u6587\u5B57 \u2192 U+0020 \u3067\u4EE3\u66FF\uFF08\u4F4D\u7F6E\u306F\u5B9F\u6E2C\u5024\u3067\u88DC\u6B63\u3055\u308C\u308B\u306E\u3067\u5E45\u306F\u554F\u308F\u306A\u3044\uFF09\n if (WHITESPACE.has(cp)) {\n return tryFont(o.primary, cp) ?? tryFont(o.primary, 0x20) ?? tryFont(o.registry.anyWithGlyph(0x20, o.weight, o.fstyle), 0x20);\n }\n\n let hit = tryFont(o.primary, cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.families, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.fallback, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.anyWithGlyph(cp, o.weight, o.fstyle), cp);\n if (hit) return hit;\n\n if (!warnedCps.has(cp)) {\n warnedCps.add(cp);\n o.warn({\n code: 'missing-glyph',\n message: `No registered font has a glyph for U+${cp.toString(16).toUpperCase().padStart(4, '0')} \"${String.fromCodePoint(cp)}\"; substituted with U+25A1`,\n element: o.element,\n text: String.fromCodePoint(cp),\n });\n }\n // \u8C46\u8150\uFF08\u25A1\uFF09\u3067\u4EE3\u66FF\u3002ToUnicode \u306B\u306F\u5143\u306E\u6587\u5B57\u3092\u6B8B\u3059\n const sub = tryFont(o.primary, 0x25a1) ?? tryFont(o.registry.anyWithGlyph(0x25a1, o.weight, o.fstyle), 0x25a1);\n return sub ? { ...sub, cpForUnicode: cp } : null;\n}\n\n/**\n * @param {string} s\n * @param {string} transform computed text-transform\n * @returns {string}\n */\nfunction applyTextTransform(s, transform) {\n if (!transform || transform === 'none') return s;\n let out = s;\n if (transform.includes('uppercase')) out = s.toUpperCase();\n else if (transform.includes('lowercase')) out = s.toLowerCase();\n else if (transform.includes('capitalize')) out = s.replace(/(^|\\s)(\\p{L})/gu, (m, sp, ch) => sp + ch.toUpperCase());\n // \u9577\u3055\u304C\u5909\u308F\u308B\u5909\u63DB\uFF08\u00DF \u2192 SS \u306A\u3069\uFF09\u306F Range \u306E\u30AA\u30D5\u30BB\u30C3\u30C8\u3068\u5BFE\u5FDC\u304C\u53D6\u308C\u306A\u3044\u306E\u3067\u8AE6\u3081\u308B\n return out.length === s.length ? out : s;\n}\n\n/** @type {WeakMap<Document, Map<string, number>>} */\nconst probeCache = new WeakMap();\n\n/**\n * \u3053\u306E font \u6307\u5B9A\u3067\u63CF\u3044\u305F\u30C6\u30AD\u30B9\u30C8\u306E Range \u77E9\u5F62\u306E\u4E0A\u7AEF\u304B\u3089\u3001\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u307E\u3067\u306E\u8DDD\u96E2\uFF08px\uFF09\u3092\u5B9F\u6E2C\u3059\u308B\u3002\n * inline-block\uFF08vertical-align: baseline\uFF09\u306E\u4E0B\u7AEF\u304C\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u4F4D\u7F6E\u306B\u4E00\u81F4\u3059\u308B\u3053\u3068\u3092\u5229\u7528\u3059\u308B\u3002\n * @param {Document} doc\n * @param {CSSStyleDeclaration} style\n * @returns {number}\n */\nfunction probeBaseline(doc, style) {\n const key = [style.fontFamily, style.fontSize, style.fontWeight, style.fontStyle, style.fontStretch, style.fontVariant, style.fontFeatureSettings].join('|');\n let cache = probeCache.get(doc);\n if (!cache) {\n cache = new Map();\n probeCache.set(doc, cache);\n }\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n\n const probe = doc.createElement('div');\n probe.setAttribute('data-rhtp-probe', '');\n probe.style.cssText = 'position:absolute;left:0;top:0;visibility:hidden;white-space:pre;line-height:normal;margin:0;padding:0;border:0;letter-spacing:0;text-indent:0;';\n probe.style.fontFamily = style.fontFamily;\n probe.style.fontSize = style.fontSize;\n probe.style.fontWeight = style.fontWeight;\n probe.style.fontStyle = style.fontStyle;\n probe.style.fontStretch = style.fontStretch;\n probe.style.fontVariant = style.fontVariant;\n probe.style.fontFeatureSettings = style.fontFeatureSettings;\n const textNode = doc.createTextNode('Ag\u3042');\n probe.appendChild(textNode);\n const mark = doc.createElement('span');\n mark.style.cssText = 'display:inline-block;width:0;height:0;vertical-align:baseline;margin:0;padding:0;border:0;';\n probe.appendChild(mark);\n doc.body.appendChild(probe);\n\n const range = doc.createRange();\n range.selectNodeContents(textNode);\n const textRect = range.getBoundingClientRect();\n const markRect = mark.getBoundingClientRect();\n const offset = markRect.bottom - textRect.top;\n probe.remove();\n\n const result = Number.isFinite(offset) && offset > 0 ? offset : parseFloat(style.fontSize) * 0.8;\n cache.set(key, result);\n return result;\n}\n", "// @ts-check\n/**\n * \u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u3068\u30C7\u30B3\u30FC\u30C9\u3002\n * - JPEG \u306F\u5143\u30D0\u30A4\u30C8\u5217\u3092\u305D\u306E\u307E\u307E DCTDecode \u3067\u57CB\u3081\u8FBC\u3080\uFF08\u518D\u5727\u7E2E\u3057\u306A\u3044\uFF09\n * - \u305D\u308C\u4EE5\u5916\uFF08PNG, GIF, WebP, SVG \u2026\uFF09\u306F <canvas> \u3067\u30C7\u30B3\u30FC\u30C9\u3057\u3066 RGB + \u30A2\u30EB\u30D5\u30A1\u306B\u5206\u96E2\u3059\u308B\n * \u540C\u3058 URL \u306F 1 \u56DE\u3060\u3051\u30C7\u30B3\u30FC\u30C9\u3057\u3001PDF \u4E0A\u3067\u3082 1 \u3064\u306E XObject \u3092\u5171\u6709\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} DecodedImage\n * @property {string} key \u91CD\u8907\u6392\u9664\u30AD\u30FC\uFF08URL\uFF09\n * @property {number} width \u30D4\u30AF\u30BB\u30EB\n * @property {number} height\n * @property {Uint8Array|null} jpeg JPEG \u306E\u751F\u30D0\u30A4\u30C8\u5217\uFF08DCTDecode\uFF09\n * @property {Uint8Array|null} rgb \u5E45\u00D7\u9AD8\u3055\u00D73\n * @property {Uint8Array|null} alpha \u5E45\u00D7\u9AD8\u3055\uFF08\u5B8C\u5168\u4E0D\u900F\u660E\u306A\u3089 null\uFF09\n */\n\n/** @type {Map<string, Promise<DecodedImage|null>>} */\nconst cache = new Map();\n\n/**\n * @param {string} url \u7D76\u5BFE URL\uFF08img.currentSrc \u307E\u305F\u306F background-image \u306E url()\uFF09\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nexport function loadImage(url, warn, element) {\n let p = cache.get(url);\n if (!p) {\n p = decode(url, warn, element).catch((e) => {\n warn({ code: 'image-failed', message: `Failed to load image ${url}: ${e instanceof Error ? e.message : String(e)}`, element });\n return null;\n });\n cache.set(url, p);\n }\n return p;\n}\n\n/**\n * @param {string} url\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nasync function decode(url, warn, element) {\n // 1. \u30D0\u30A4\u30C8\u5217\u3092\u53D6\u5F97\u3067\u304D\u308C\u3070 JPEG \u5224\u5B9A\n /** @type {Uint8Array|null} */\n let bytes = null;\n try {\n const res = await fetch(url, { mode: 'cors', credentials: 'same-origin' });\n if (res.ok) bytes = new Uint8Array(await res.arrayBuffer());\n } catch {\n bytes = null; // CORS \u7B49\u3067\u8AAD\u3081\u306A\u3044\u5834\u5408\u306F canvas \u7D4C\u7531\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\n }\n\n if (bytes && bytes[0] === 0xff && bytes[1] === 0xd8) {\n const dims = jpegDimensions(bytes);\n if (dims && dims.components === 3) {\n return { key: url, width: dims.width, height: dims.height, jpeg: bytes, rgb: null, alpha: null };\n }\n // CMYK / \u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB JPEG \u306F canvas \u7D4C\u7531\u3067 RGB \u5316\u3059\u308B\n }\n\n // 2. canvas \u3067\u30C7\u30B3\u30FC\u30C9\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'sync';\n const loaded = new Promise((resolve, reject) => {\n img.onload = () => resolve(undefined);\n img.onerror = () => reject(new Error('image failed to load'));\n });\n if (bytes) {\n const blobUrl = URL.createObjectURL(new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)]));\n img.src = blobUrl;\n try {\n await loaded;\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n } else {\n img.src = url;\n await loaded;\n }\n const w = img.naturalWidth;\n const h = img.naturalHeight;\n if (!w || !h) throw new Error('image has no intrinsic size');\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) throw new Error('2D canvas unavailable');\n ctx.drawImage(img, 0, 0);\n /** @type {ImageData} */\n let data;\n try {\n data = ctx.getImageData(0, 0, w, h);\n } catch {\n warn({\n code: 'image-failed',\n message: `Image ${url} is cross-origin without CORS headers; add crossorigin=\"anonymous\" and Access-Control-Allow-Origin. Skipped.`,\n element,\n });\n return null;\n }\n const px = data.data;\n const rgb = new Uint8Array(w * h * 3);\n const alpha = new Uint8Array(w * h);\n let opaque = true;\n for (let i = 0, j = 0, k = 0; i < px.length; i += 4, j += 3, k++) {\n const a = /** @type {number} */ (px[i + 3]);\n // getImageData \u306F\u975E\u30D7\u30EA\u30DE\u30EB\u30C1\u30D7\u30E9\u30A4\u3002\u900F\u660E\u30D4\u30AF\u30BB\u30EB\u306E\u8272\u306F\u30CE\u30A4\u30BA\u306B\u306A\u308A\u3046\u308B\u306E\u3067\u767D\u306B\u5BC4\u305B\u308B\n if (a === 0) {\n rgb[j] = rgb[j + 1] = rgb[j + 2] = 255;\n } else {\n rgb[j] = /** @type {number} */ (px[i]);\n rgb[j + 1] = /** @type {number} */ (px[i + 1]);\n rgb[j + 2] = /** @type {number} */ (px[i + 2]);\n }\n alpha[k] = a;\n if (a !== 255) opaque = false;\n }\n return { key: url, width: w, height: h, jpeg: null, rgb, alpha: opaque ? null : alpha };\n}\n\n/**\n * JPEG \u306E SOF \u30DE\u30FC\u30AB\u30FC\u304B\u3089\u5BF8\u6CD5\u3068\u6210\u5206\u6570\u3092\u8AAD\u3080\u3002\n * @param {Uint8Array} b\n * @returns {{width: number, height: number, components: number}|null}\n */\nexport function jpegDimensions(b) {\n let p = 2;\n while (p + 9 < b.length) {\n if (b[p] !== 0xff) {\n p++;\n continue;\n }\n const marker = /** @type {number} */ (b[p + 1]);\n if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01 || marker === 0xff) {\n p += marker === 0xff ? 1 : 2;\n continue;\n }\n const len = ((/** @type {number} */ (b[p + 2])) << 8) | /** @type {number} */ (b[p + 3]);\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n height: ((/** @type {number} */ (b[p + 5])) << 8) | /** @type {number} */ (b[p + 6]),\n width: ((/** @type {number} */ (b[p + 7])) << 8) | /** @type {number} */ (b[p + 8]),\n components: /** @type {number} */ (b[p + 9]),\n };\n }\n if (marker === 0xda) break; // SOS: \u4EE5\u964D\u306F\u753B\u50CF\u30C7\u30FC\u30BF\n p += 2 + len;\n }\n return null;\n}\n\n/**\n * computed background-image \u306E `url(\"...\")` \u3092\u53D6\u308A\u51FA\u3059\u3002\u8907\u6570\u6307\u5B9A\u30FB\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseBackgroundUrl(value) {\n if (!value || value === 'none') return null;\n const parts = splitTopLevelCommas(value);\n if (parts.length !== 1) return null;\n const m = /^url\\((?:\"([^\"]*)\"|'([^']*)'|([^)]*))\\)$/.exec(/** @type {string} */ (parts[0]).trim());\n if (!m) return null;\n return m[1] ?? m[2] ?? m[3] ?? null;\n}\n\n/** @param {string} s */\nfunction splitTopLevelCommas(s) {\n /** @type {string[]} */\n const out = [];\n let depth = 0;\n let cur = '';\n for (const ch of s) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n out.push(cur);\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur);\n return out;\n}\n\n/**\n * background-size / background-position / object-fit / object-position \u304B\u3089\u63CF\u753B\u77E9\u5F62\u3092\u8A08\u7B97\u3059\u308B\u3002\n * @param {{x: number, y: number, w: number, h: number}} box \u63CF\u753B\u9818\u57DF\uFF08px\uFF09\n * @param {number} iw \u753B\u50CF\u306E\u56FA\u6709\u5E45\n * @param {number} ih\n * @param {string} size 'auto' | 'cover' | 'contain' | '<w> <h>'\uFF08computed \u5024\u3001px \u307E\u305F\u306F %\uFF09\n * @param {string} position '0% 0%' | '50% 50%' | '10px 20px' \u2026\uFF08computed \u5024\u30012 \u5024\uFF09\n * @returns {{x: number, y: number, w: number, h: number}}\n */\nexport function fitImage(box, iw, ih, size, position) {\n let w;\n let h;\n const s = size.trim();\n if (s === 'cover' || s === 'contain') {\n const scale = s === 'cover' ? Math.max(box.w / iw, box.h / ih) : Math.min(box.w / iw, box.h / ih);\n w = iw * scale;\n h = ih * scale;\n } else {\n const [sw = 'auto', sh = 'auto'] = s.split(/\\s+/);\n const rw = sizeComponent(sw, box.w);\n const rh = sizeComponent(sh, box.h);\n if (rw === null && rh === null) {\n w = iw;\n h = ih;\n } else if (rw === null) {\n h = /** @type {number} */ (rh);\n w = (iw * h) / ih;\n } else if (rh === null) {\n w = rw;\n h = (ih * w) / iw;\n } else {\n w = rw;\n h = rh;\n }\n }\n const [px = '0%', py = '0%'] = position.trim().split(/\\s+/);\n const x = box.x + positionComponent(px, box.w - w);\n const y = box.y + positionComponent(py, box.h - h);\n return { x, y, w, h };\n}\n\n/** @param {string} v @param {number} ref @returns {number|null} */\nfunction sizeComponent(v, ref) {\n if (v === 'auto') return null;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * ref;\n return parseFloat(v) || 0;\n}\n\n/** @param {string} v @param {number} free */\nfunction positionComponent(v, free) {\n if (v === 'left' || v === 'top') return 0;\n if (v === 'center') return free / 2;\n if (v === 'right' || v === 'bottom') return free;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * free;\n return parseFloat(v) || 0;\n}\n\n/**\n * object-fit \u3092 background-size \u76F8\u5F53\u306E\u5024\u306B\u5909\u63DB\u3059\u308B\u3002\n * @param {string} fit\n * @returns {string}\n */\nexport function objectFitToSize(fit) {\n switch (fit) {\n case 'contain':\n case 'scale-down':\n return 'contain';\n case 'cover':\n return 'cover';\n case 'none':\n return 'auto';\n default:\n return '100% 100%';\n }\n}\n\n/**\n * `background-repeat` \u306E computed \u5024\u3092\u8EF8\u3054\u3068\u306B\u5206\u3051\u308B\u3002\n * `repeat-x` / `repeat-y` \u306F 2 \u5024\u8868\u8A18\u306B\u5C55\u958B\u3059\u308B\u3002\n * @param {string} value\n * @returns {['repeat'|'no-repeat'|'space'|'round', 'repeat'|'no-repeat'|'space'|'round']}\n */\nexport function splitRepeat(value) {\n const v = (value || 'repeat').trim();\n if (v === 'repeat-x') return ['repeat', 'no-repeat'];\n if (v === 'repeat-y') return ['no-repeat', 'repeat'];\n const parts = v.split(/\\s+/);\n const norm = (/** @type {string} */ s) => (s === 'repeat' || s === 'no-repeat' || s === 'space' || s === 'round' ? s : 'repeat');\n const a = norm(/** @type {string} */ (parts[0] ?? 'repeat'));\n const b = norm(/** @type {string} */ (parts[1] ?? parts[0] ?? 'repeat'));\n return [a, b];\n}\n\n/**\n * 1 \u8EF8\u3076\u3093\u306E\u30BF\u30A4\u30EB\u4F4D\u7F6E\u3092\u6C42\u3081\u308B\u3002\n *\n * - `repeat`: \u6307\u5B9A\u4F4D\u7F6E\u3092\u57FA\u6E96\u306B\u3001\u63CF\u753B\u9818\u57DF\u3092\u8986\u3046\u307E\u3067\u4E21\u65B9\u5411\u3078\u4E26\u3079\u308B\n * - `no-repeat`: \u6307\u5B9A\u4F4D\u7F6E\u306B 1 \u679A\n * - `round`: \u63CF\u753B\u9818\u57DF\u306B\u6574\u6570\u500B\u53CE\u307E\u308B\u3088\u3046\u30BF\u30A4\u30EB\u306E\u5927\u304D\u3055\u3092\u8ABF\u6574\u3057\u3066\u4E26\u3079\u308B\uFF08\u5927\u304D\u3055\u304C\u5909\u308F\u308B\uFF09\n * - `space`: \u6574\u6570\u500B\u3092\u7B49\u9593\u9694\u306B\u7F6E\u304D\u3001\u4F59\u308A\u3092\u9699\u9593\u306B\u914D\u308B\u30021 \u679A\u3057\u304B\u5165\u3089\u306A\u3044\u306A\u3089\u5148\u982D\u306B 1 \u679A\n *\n * @param {'repeat'|'no-repeat'|'space'|'round'} mode\n * @param {number} start \u6307\u5B9A\u4F4D\u7F6E\uFF08background-position \u306E\u7D50\u679C\uFF09\n * @param {number} size \u30BF\u30A4\u30EB\u306E\u5927\u304D\u3055\n * @param {number} areaStart \u63CF\u753B\u9818\u57DF\u306E\u958B\u59CB\n * @param {number} areaEnd \u63CF\u753B\u9818\u57DF\u306E\u7D42\u308F\u308A\n * @returns {{positions: number[], size: number}}\n */\nexport function tileAxis(mode, start, size, areaStart, areaEnd) {\n if (!(size > 0)) return { positions: [start], size };\n const area = areaEnd - areaStart;\n if (mode === 'no-repeat') return { positions: [start], size };\n\n if (mode === 'round') {\n const n = Math.max(1, Math.round(area / size));\n const s = area / n;\n return { positions: Array.from({ length: n }, (_, i) => areaStart + i * s), size: s };\n }\n\n if (mode === 'space') {\n const n = Math.floor(area / size);\n if (n < 2) return { positions: [areaStart], size };\n const gap = (area - n * size) / (n - 1);\n return { positions: Array.from({ length: n }, (_, i) => areaStart + i * (size + gap)), size };\n }\n\n // repeat: \u6307\u5B9A\u4F4D\u7F6E\u304B\u3089\u524D\u5F8C\u3078\u4F38\u3070\u3059\n const first = start - Math.ceil((start - areaStart) / size) * size;\n /** @type {number[]} */\n const positions = [];\n for (let p = first; p < areaEnd; p += size) {\n if (p + size > areaStart) positions.push(p);\n if (positions.length > 10000) break; // \u7570\u5E38\u306A\u7E70\u308A\u8FD4\u3057\u306E\u4FDD\u967A\n }\n return { positions: positions.length ? positions : [start], size };\n}\n\n/**\n * \u57CB\u3081\u8FBC\u307F\u304C\u6E08\u3093\u3060\u753B\u50CF\u306E\u30D4\u30AF\u30BB\u30EB\u30C7\u30FC\u30BF\u3092\u624B\u653E\u3059\u3002\n * \u30C7\u30B3\u30FC\u30C9\u7D50\u679C\uFF08RGB\u30FB\u30A2\u30EB\u30D5\u30A1\u30FBJPEG \u306E\u30D0\u30A4\u30C8\u5217\uFF09\u306F\u5143\u753B\u50CF\u3088\u308A\u6841\u9055\u3044\u306B\u5927\u304D\u3044\u306E\u3067\u3001\n * PDF \u306B\u66F8\u304D\u51FA\u3057\u305F\u3042\u3068\u3082\u62B1\u3048\u3066\u3044\u308B\u3068\u5927\u304D\u306A\u6587\u66F8\u3067\u30D4\u30FC\u30AF\u4F7F\u7528\u91CF\u304C\u8DF3\u306D\u4E0A\u304C\u308B\u3002\n *\n * \u30AD\u30E3\u30C3\u30B7\u30E5\u304B\u3089\u3082\u5916\u3059\u306E\u3067\u3001\u6B21\u306E\u5909\u63DB\u3067\u306F\u8AAD\u307F\u76F4\u3057\u306B\u306A\u308B\uFF08\u901F\u5EA6\u3088\u308A\u30E1\u30E2\u30EA\u3092\u512A\u5148\u3059\u308B\uFF09\u3002\n *\n * @param {DecodedImage} img\n */\nexport function releasePixels(img) {\n img.jpeg = null;\n img.rgb = null;\n img.alpha = null;\n cache.delete(img.key);\n}\n", "// @ts-check\n/**\n * CSS \u306E linear-gradient \u3092 PDF \u306E\u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\uFF08ShadingType 2\uFF09\u306B\u843D\u3068\u3059\u305F\u3081\u306E\u89E3\u6790\u3002\n *\n * \u5165\u529B\u306F computed style \u306E\u5024\u306A\u306E\u3067\u3001\u8272\u306F rgb()/rgba() \u306B\u3001\u89D2\u5EA6\u306F deg \u306B\u6B63\u898F\u5316\u6E08\u307F\u3002\n * \u51FA\u529B\u306F\u7BB1\u306E\u30ED\u30FC\u30AB\u30EB\u5EA7\u6A19\uFF08\u5DE6\u4E0A\u539F\u70B9\u30FBy \u4E0B\u5411\u304D\u30FBCSS px\uFF09\u3067\u306E\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u3068\u3001\n * 0\u301C1 \u306B\u6B63\u898F\u5316\u3057\u305F\u8272\u6B62\u3081\u3002\n */\nimport { parseColor } from '../units.js';\n\n/**\n * @typedef {{t: number, color: import('../units.js').Rgba}} GradientStop\n * @typedef {{x0: number, y0: number, x1: number, y1: number, stops: GradientStop[]}} LinearGradient\n */\n\n/**\n * computed \u306E background-image \u304C\u5358\u4E00\u306E linear-gradient \u306A\u3089\u305D\u308C\u3092\u89E3\u6790\u3059\u308B\u3002\n * \u5BFE\u5FDC\u3057\u306A\u3044\u66F8\u5F0F\uFF08repeating / radial / conic / \u8907\u6570\u30EC\u30A4\u30E4\u30FC\uFF09\u306F null\u3002\n *\n * @param {string} value computed \u306E background-image\n * @param {number} width \u7BB1\u306E\u5E45\uFF08px\uFF09\n * @param {number} height \u7BB1\u306E\u9AD8\u3055\uFF08px\uFF09\n * @returns {LinearGradient|null}\n */\nexport function parseLinearGradient(value, width, height) {\n const m = /^linear-gradient\\((.*)\\)$/s.exec(value.trim());\n if (!m) return null;\n const args = splitTopLevelCommas(/** @type {string} */ (m[1]));\n if (args.length < 2) return null;\n\n let i = 0;\n let angle = 180; // \u65E2\u5B9A\u306F\u300Cto bottom\u300D\n const first = /** @type {string} */ (args[0]).trim();\n // `in oklab` \u306A\u3069\u306E\u88DC\u9593\u6307\u5B9A\u306F\u7121\u8996\u3057\u3066 sRGB \u3067\u8FD1\u4F3C\u3059\u308B\n const head = first.replace(/^in\\s+\\S+(\\s+\\S+\\s+hue)?\\s*/i, '').trim();\n const dir = parseDirection(head);\n if (dir !== null) {\n angle = dir;\n i = 1;\n } else if (/^in\\s/i.test(first) && head === '') {\n i = 1;\n }\n\n const rawStops = args.slice(i).map((s) => s.trim());\n if (rawStops.length < 2) return null;\n\n // \u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u306E\u9577\u3055\uFF08CSS \u4ED5\u69D8: |W\u00B7sin \u03B8| + |H\u00B7cos \u03B8|\uFF09\n const rad = (angle * Math.PI) / 180;\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const length = Math.abs(width * sin) + Math.abs(height * cos);\n if (!(length > 0)) return null;\n\n /** @type {GradientStop[]} */\n const stops = [];\n for (const raw of rawStops) {\n // \"rgb(255, 0, 0) 30%\" / \"rgba(0, 0, 0, 0.5)\" / \"red 10px 20px\"\uFF08\u4E8C\u91CD\u6307\u5B9A\uFF09\n const sp = splitColorAndPositions(raw);\n if (!sp) return null;\n const color = parseColor(sp.color);\n if (!color) return null;\n if (!sp.positions.length) {\n stops.push({ t: NaN, color });\n continue;\n }\n for (const pos of sp.positions) {\n const t = resolvePosition(pos, length);\n if (t === null) return null;\n stops.push({ t, color });\n }\n }\n if (stops.length < 2) return null;\n\n fillMissingPositions(stops);\n\n // \u4E2D\u5FC3\u3092\u901A\u308B\u7DDA\u5206\u3002CSS \u306E\u89D2\u5EA6\u306F 0deg = \u4E0A\u5411\u304D\u3001\u6642\u8A08\u56DE\u308A\u3002y \u306F\u4E0B\u5411\u304D\u306A\u306E\u3067 cos \u3092\u53CD\u8EE2\u3059\u308B\u3002\n const cx = width / 2;\n const cy = height / 2;\n const dx = sin;\n const dy = -cos;\n return {\n x0: cx - (dx * length) / 2,\n y0: cy - (dy * length) / 2,\n x1: cx + (dx * length) / 2,\n y1: cy + (dy * length) / 2,\n stops,\n };\n}\n\n/**\n * `45deg` / `to right` / `to right bottom` \u3092 CSS \u89D2\u5EA6\uFF080 = \u4E0A\u3001\u6642\u8A08\u56DE\u308A\uFF09\u306B\u3059\u308B\u3002\n * \u65B9\u5411\u6307\u5B9A\u3067\u306A\u3051\u308C\u3070 null\u3002\n * @param {string} s\n * @returns {number|null}\n */\nfunction parseDirection(s) {\n const deg = /^(-?[\\d.]+)deg$/.exec(s);\n if (deg) return ((parseFloat(/** @type {string} */ (deg[1])) % 360) + 360) % 360;\n const to = /^to\\s+(.+)$/.exec(s);\n if (!to) return null;\n const words = /** @type {string} */ (to[1]).trim().split(/\\s+/).sort().join(' ');\n /** @type {Record<string, number>} */\n const table = {\n top: 0,\n right: 90,\n bottom: 180,\n left: 270,\n 'right top': 45,\n 'bottom right': 135,\n 'bottom left': 225,\n 'left top': 315,\n };\n return table[words] ?? null;\n}\n\n/**\n * \u8272\u6B62\u3081\u3092\u300C\u8272\u300D\u3068\u300C\u4F4D\u7F6E\uFF080\u301C2 \u500B\uFF09\u300D\u306B\u5206\u3051\u308B\u3002\n * @param {string} s\n * @returns {{color: string, positions: string[]}|null}\n */\nfunction splitColorAndPositions(s) {\n // \u95A2\u6570\u8A18\u6CD5\uFF08rgb(...)\uFF09\u3092\u5148\u306B\u5207\u308A\u51FA\u3059\n const fn = /^([a-z-]+\\([^()]*\\))\\s*(.*)$/i.exec(s);\n if (fn) return { color: /** @type {string} */ (fn[1]), positions: splitWords(/** @type {string} */ (fn[2])) };\n const kw = /^(\\S+)\\s*(.*)$/.exec(s);\n if (!kw) return null;\n return { color: /** @type {string} */ (kw[1]), positions: splitWords(/** @type {string} */ (kw[2])) };\n}\n\n/** @param {string} s */\nfunction splitWords(s) {\n const t = s.trim();\n return t ? t.split(/\\s+/) : [];\n}\n\n/**\n * \u4F4D\u7F6E\u6307\u5B9A\uFF0830% / 10px\uFF09\u3092\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7DDA\u4E0A\u306E 0\u301C1 \u306B\u3059\u308B\u3002\n * @param {string} pos\n * @param {number} length\n * @returns {number|null}\n */\nfunction resolvePosition(pos, length) {\n const pct = /^(-?[\\d.]+)%$/.exec(pos);\n if (pct) return parseFloat(/** @type {string} */ (pct[1])) / 100;\n const px = /^(-?[\\d.]+)px$/.exec(pos);\n if (px) return parseFloat(/** @type {string} */ (px[1])) / length;\n return null;\n}\n\n/**\n * \u4F4D\u7F6E\u306E\u7121\u3044\u8272\u6B62\u3081\u3092\u57CB\u3081\u308B\u3002\u4E21\u7AEF\u306F 0 \u3068 1\u3001\u9593\u306F\u7B49\u9593\u9694\u3002\n * \u3055\u3089\u306B\u524D\u306E\u4F4D\u7F6E\u3092\u4E0B\u56DE\u3089\u306A\u3044\u3088\u3046\u5358\u8ABF\u306B\u3059\u308B\uFF08CSS \u4ED5\u69D8\uFF09\u3002\n * @param {GradientStop[]} stops\n */\nfunction fillMissingPositions(stops) {\n const last = stops.length - 1;\n if (Number.isNaN(/** @type {number} */ (stops[0]?.t))) /** @type {GradientStop} */ (stops[0]).t = 0;\n if (Number.isNaN(/** @type {number} */ (stops[last]?.t))) /** @type {GradientStop} */ (stops[last]).t = 1;\n for (let i = 1; i < last; i++) {\n if (!Number.isNaN(/** @type {number} */ (stops[i]?.t))) continue;\n // \u6B21\u306B\u4F4D\u7F6E\u304C\u6C7A\u307E\u3063\u3066\u3044\u308B\u8272\u6B62\u3081\u307E\u3067\u3092\u7B49\u5206\u3059\u308B\n let j = i + 1;\n while (j < last && Number.isNaN(/** @type {number} */ (stops[j]?.t))) j++;\n const from = /** @type {number} */ (stops[i - 1]?.t);\n const to = /** @type {number} */ (stops[j]?.t);\n for (let k = i; k < j; k++) {\n /** @type {GradientStop} */ (stops[k]).t = from + ((to - from) * (k - i + 1)) / (j - i + 1);\n }\n i = j - 1;\n }\n for (let i = 1; i < stops.length; i++) {\n const prev = /** @type {number} */ (stops[i - 1]?.t);\n if (/** @type {number} */ (stops[i]?.t) < prev) /** @type {GradientStop} */ (stops[i]).t = prev;\n }\n}\n\n/** @param {string} s */\nfunction splitTopLevelCommas(s) {\n /** @type {string[]} */\n const out = [];\n let depth = 0;\n let cur = '';\n for (const ch of s) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n out.push(cur);\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur);\n return out;\n}\n", "// @ts-check\n/**\n * SVG \u306E\u30D1\u30B9\u30C7\u30FC\u30BF\u3068\u57FA\u672C\u56F3\u5F62\u3092\u3001PDF \u306B\u51FA\u305B\u308B\u5F62\uFF08\u7D76\u5BFE\u5EA7\u6A19\u306E M / L / C / Z\uFF09\u3078\u6B63\u898F\u5316\u3059\u308B\u3002\n *\n * \u5186\u5F27\uFF08A\uFF09\u306F 3 \u6B21\u30D9\u30B8\u30A7\u3078\u3001\u4E8C\u6B21\u30D9\u30B8\u30A7\uFF08Q / T\uFF09\u3082 3 \u6B21\u3078\u5909\u63DB\u3059\u308B\u3002\n * \u5EA7\u6A19\u306F\u8981\u7D20\u306E\u30E6\u30FC\u30B6\u30FC\u5358\u4F4D\u306E\u307E\u307E\uFF08\u5909\u63DB\u884C\u5217\u306F\u63CF\u753B\u6642\u306B cm \u3067\u9069\u7528\u3059\u308B\uFF09\u3002\n */\n\n/**\n * @typedef {['M', number, number]|['L', number, number]|['C', number, number, number, number, number, number]|['Z']} PathSeg\n */\n\n/**\n * `d` \u5C5E\u6027\u3092\u7D76\u5BFE\u5EA7\u6A19\u306E M / L / C / Z \u5217\u306B\u3059\u308B\u3002\n * @param {string} d\n * @returns {PathSeg[]}\n */\nexport function parsePathData(d) {\n /** @type {PathSeg[]} */\n const out = [];\n const tokens = tokenize(d);\n let i = 0;\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n // \u76F4\u524D\u306E\u5236\u5FA1\u70B9\uFF08S / T \u306E\u53CD\u5C04\u7528\uFF09\n /** @type {[number, number]|null} */\n let lastC = null;\n /** @type {[number, number]|null} */\n let lastQ = null;\n let cmd = '';\n\n const num = () => {\n const t = tokens[i++];\n return typeof t === 'number' ? t : NaN;\n };\n const hasNum = () => typeof tokens[i] === 'number';\n\n while (i < tokens.length) {\n if (typeof tokens[i] === 'string') cmd = /** @type {string} */ (tokens[i++]);\n else if (!cmd) break; // \u6570\u5024\u304B\u3089\u59CB\u307E\u308B\u4E0D\u6B63\u306A\u30C7\u30FC\u30BF\n const rel = cmd === cmd.toLowerCase();\n const C = cmd.toUpperCase();\n const ox = rel ? x : 0;\n const oy = rel ? y : 0;\n\n if (C === 'M') {\n x = num() + ox;\n y = num() + oy;\n out.push(['M', x, y]);\n startX = x;\n startY = y;\n lastC = lastQ = null;\n // \u7D9A\u304F\u5EA7\u6A19\u5BFE\u306F L / l \u6271\u3044\n cmd = rel ? 'l' : 'L';\n continue;\n }\n if (C === 'Z') {\n out.push(['Z']);\n x = startX;\n y = startY;\n lastC = lastQ = null;\n continue;\n }\n if (C === 'L') {\n x = num() + ox;\n y = num() + oy;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'H') {\n x = num() + ox;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'V') {\n y = num() + oy;\n out.push(['L', x, y]);\n lastC = lastQ = null;\n } else if (C === 'C') {\n const x1 = num() + ox;\n const y1 = num() + oy;\n const x2 = num() + ox;\n const y2 = num() + oy;\n x = num() + ox;\n y = num() + oy;\n out.push(['C', x1, y1, x2, y2, x, y]);\n lastC = [x2, y2];\n lastQ = null;\n } else if (C === 'S') {\n const rx = lastC ? 2 * x - lastC[0] : x;\n const ry = lastC ? 2 * y - lastC[1] : y;\n const x2 = num() + ox;\n const y2 = num() + oy;\n x = num() + ox;\n y = num() + oy;\n out.push(['C', rx, ry, x2, y2, x, y]);\n lastC = [x2, y2];\n lastQ = null;\n } else if (C === 'Q' || C === 'T') {\n let qx;\n let qy;\n if (C === 'Q') {\n qx = num() + ox;\n qy = num() + oy;\n } else {\n qx = lastQ ? 2 * x - lastQ[0] : x;\n qy = lastQ ? 2 * y - lastQ[1] : y;\n }\n const px = num() + ox;\n const py = num() + oy;\n // \u4E8C\u6B21 \u2192 \u4E09\u6B21\n out.push(['C', x + (2 / 3) * (qx - x), y + (2 / 3) * (qy - y), px + (2 / 3) * (qx - px), py + (2 / 3) * (qy - py), px, py]);\n x = px;\n y = py;\n lastQ = [qx, qy];\n lastC = null;\n } else if (C === 'A') {\n const rx = num();\n const ry = num();\n const rot = num();\n const large = num();\n const sweep = num();\n const px = num() + ox;\n const py = num() + oy;\n for (const seg of arcToCurves(x, y, px, py, rx, ry, rot, large !== 0, sweep !== 0)) out.push(seg);\n x = px;\n y = py;\n lastC = lastQ = null;\n } else {\n break; // \u672A\u77E5\u306E\u30B3\u30DE\u30F3\u30C9\n }\n if (!hasNum() && typeof tokens[i] !== 'string') break;\n }\n return out;\n}\n\n/**\n * `d` \u3092\u6570\u5024\u3068\u30B3\u30DE\u30F3\u30C9\u6587\u5B57\u306B\u5206\u89E3\u3059\u308B\u3002\n * @param {string} d\n * @returns {(string|number)[]}\n */\nfunction tokenize(d) {\n /** @type {(string|number)[]} */\n const out = [];\n const re = /([MmLlHhVvCcSsQqTtAaZz])|(-?(?:\\d*\\.\\d+|\\d+)(?:[eE][-+]?\\d+)?)/g;\n let m;\n while ((m = re.exec(d))) {\n if (m[1]) out.push(m[1]);\n else out.push(parseFloat(/** @type {string} */ (m[2])));\n }\n return out;\n}\n\n/**\n * \u6955\u5186\u5186\u5F27\u3092 3 \u6B21\u30D9\u30B8\u30A7\u5217\u306B\u3059\u308B\uFF08SVG \u4ED5\u69D8 F.6 \u306E\u5B9F\u88C5\uFF09\u3002\n * @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2\n * @param {number} rx @param {number} ry @param {number} rotDeg\n * @param {boolean} large @param {boolean} sweep\n * @returns {PathSeg[]}\n */\nexport function arcToCurves(x1, y1, x2, y2, rx, ry, rotDeg, large, sweep) {\n if (x1 === x2 && y1 === y2) return [];\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n if (rx === 0 || ry === 0) return [['L', x2, y2]];\n\n const phi = (rotDeg * Math.PI) / 180;\n const cosP = Math.cos(phi);\n const sinP = Math.sin(phi);\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosP * dx + sinP * dy;\n const y1p = -sinP * dx + cosP * dy;\n\n // \u534A\u5F84\u304C\u5C0F\u3055\u3059\u304E\u308B\u5834\u5408\u306F\u5E83\u3052\u308B\uFF08\u4ED5\u69D8 F.6.6\uFF09\n const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n if (lambda > 1) {\n const s = Math.sqrt(lambda);\n rx *= s;\n ry *= s;\n }\n\n const sign = large === sweep ? -1 : 1;\n const num = rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p;\n const den = rx * rx * y1p * y1p + ry * ry * x1p * x1p;\n const co = sign * Math.sqrt(Math.max(0, num / den));\n const cxp = (co * rx * y1p) / ry;\n const cyp = (-co * ry * x1p) / rx;\n const cx = cosP * cxp - sinP * cyp + (x1 + x2) / 2;\n const cy = sinP * cxp + cosP * cyp + (y1 + y2) / 2;\n\n const angle = (/** @type {number} */ ux, /** @type {number} */ uy, /** @type {number} */ vx, /** @type {number} */ vy) => {\n const dot = ux * vx + uy * vy;\n const len = Math.hypot(ux, uy) * Math.hypot(vx, vy);\n let a = Math.acos(Math.min(1, Math.max(-1, dot / (len || 1))));\n if (ux * vy - uy * vx < 0) a = -a;\n return a;\n };\n const theta1 = angle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);\n let dTheta = angle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry);\n if (!sweep && dTheta > 0) dTheta -= 2 * Math.PI;\n if (sweep && dTheta < 0) dTheta += 2 * Math.PI;\n\n // 1 \u533A\u9593\u3042\u305F\u308A 90 \u5EA6\u4EE5\u4E0B\u306B\u306A\u308B\u3088\u3046\u5206\u5272\u3059\u308B\n const parts = Math.max(1, Math.ceil(Math.abs(dTheta / (Math.PI / 2))));\n const delta = dTheta / parts;\n const t = ((4 / 3) * Math.tan(delta / 4));\n /** @type {PathSeg[]} */\n const out = [];\n let th = theta1;\n for (let i = 0; i < parts; i++) {\n const th2 = th + delta;\n const cos1 = Math.cos(th);\n const sin1 = Math.sin(th);\n const cos2 = Math.cos(th2);\n const sin2 = Math.sin(th2);\n /** \u6955\u5186\u4E0A\u306E\u70B9\u3068\u305D\u306E\u63A5\u7DDA\u304B\u3089\u5236\u5FA1\u70B9\u3092\u4F5C\u308B */\n const map = (/** @type {number} */ ex, /** @type {number} */ ey) => [cosP * rx * ex - sinP * ry * ey + cx, sinP * rx * ex + cosP * ry * ey + cy];\n const [px1, py1] = map(cos1, sin1);\n const [px2, py2] = map(cos2, sin2);\n const [c1x, c1y] = map(cos1 - t * sin1, sin1 + t * cos1);\n const [c2x, c2y] = map(cos2 + t * sin2, sin2 - t * cos2);\n void px1;\n void py1;\n out.push(['C', /** @type {number} */ (c1x), /** @type {number} */ (c1y), /** @type {number} */ (c2x), /** @type {number} */ (c2y), /** @type {number} */ (px2), /** @type {number} */ (py2)]);\n th = th2;\n }\n return out;\n}\n\n/**\n * \u57FA\u672C\u56F3\u5F62\u3092\u30D1\u30B9\u306B\u3059\u308B\u3002\u5BFE\u5FDC\u3057\u306A\u3044\u8981\u7D20\u306F null\u3002\n * @param {Element} el\n * @param {(name: string) => string} attr \u5C5E\u6027\u5024\uFF08\u30D7\u30EC\u30BC\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u5C5E\u6027\u306F computed style \u3092\u512A\u5148\u3057\u306A\u3044\u7D14\u7C8B\u306A\u5E7E\u4F55\u5C5E\u6027\uFF09\n * @returns {PathSeg[]|null}\n */\nexport function shapeToPath(el, attr) {\n const n = (/** @type {string} */ name, /** @type {number} */ dflt = 0) => {\n const v = parseFloat(attr(name));\n return Number.isFinite(v) ? v : dflt;\n };\n switch (el.tagName) {\n case 'path': {\n const d = attr('d');\n return d ? parsePathData(d) : [];\n }\n case 'rect': {\n const x = n('x');\n const y = n('y');\n const w = n('width');\n const h = n('height');\n if (w <= 0 || h <= 0) return [];\n let rx = attr('rx') === '' || attr('rx') === 'auto' ? NaN : n('rx');\n let ry = attr('ry') === '' || attr('ry') === 'auto' ? NaN : n('ry');\n if (Number.isNaN(rx) && Number.isNaN(ry)) return rectPath(x, y, w, h);\n if (Number.isNaN(rx)) rx = /** @type {number} */ (ry);\n if (Number.isNaN(ry)) ry = /** @type {number} */ (rx);\n rx = Math.min(rx, w / 2);\n ry = Math.min(ry, h / 2);\n if (rx <= 0 || ry <= 0) return rectPath(x, y, w, h);\n return roundRectPath(x, y, w, h, rx, ry);\n }\n case 'circle': {\n const r = n('r');\n if (r <= 0) return [];\n return ellipsePath(n('cx'), n('cy'), r, r);\n }\n case 'ellipse': {\n const rx = n('rx');\n const ry = n('ry');\n if (rx <= 0 || ry <= 0) return [];\n return ellipsePath(n('cx'), n('cy'), rx, ry);\n }\n case 'line':\n return [\n ['M', n('x1'), n('y1')],\n ['L', n('x2'), n('y2')],\n ];\n case 'polyline':\n case 'polygon': {\n const pts = attr('points')\n .split(/[\\s,]+/)\n .map(parseFloat)\n .filter((v) => Number.isFinite(v));\n if (pts.length < 4) return [];\n /** @type {PathSeg[]} */\n const out = [['M', /** @type {number} */ (pts[0]), /** @type {number} */ (pts[1])]];\n for (let i = 2; i + 1 < pts.length; i += 2) out.push(['L', /** @type {number} */ (pts[i]), /** @type {number} */ (pts[i + 1])]);\n if (el.tagName === 'polygon') out.push(['Z']);\n return out;\n }\n default:\n return null;\n }\n}\n\n/** @returns {PathSeg[]} */\nfunction rectPath(/** @type {number} */ x, /** @type {number} */ y, /** @type {number} */ w, /** @type {number} */ h) {\n return [\n ['M', x, y],\n ['L', x + w, y],\n ['L', x + w, y + h],\n ['L', x, y + h],\n ['Z'],\n ];\n}\n\nconst K = 0.5522847498307936; // 4/3\u00B7(\u221A2\u22121)\n\n/** @returns {PathSeg[]} */\nfunction roundRectPath(/** @type {number} */ x, /** @type {number} */ y, /** @type {number} */ w, /** @type {number} */ h, /** @type {number} */ rx, /** @type {number} */ ry) {\n const cx = rx * K;\n const cy = ry * K;\n const r = x + w;\n const b = y + h;\n return [\n ['M', x + rx, y],\n ['L', r - rx, y],\n ['C', r - rx + cx, y, r, y + ry - cy, r, y + ry],\n ['L', r, b - ry],\n ['C', r, b - ry + cy, r - rx + cx, b, r - rx, b],\n ['L', x + rx, b],\n ['C', x + rx - cx, b, x, b - ry + cy, x, b - ry],\n ['L', x, y + ry],\n ['C', x, y + ry - cy, x + rx - cx, y, x + rx, y],\n ['Z'],\n ];\n}\n\n/** @returns {PathSeg[]} */\nfunction ellipsePath(/** @type {number} */ cx, /** @type {number} */ cy, /** @type {number} */ rx, /** @type {number} */ ry) {\n const ox = rx * K;\n const oy = ry * K;\n return [\n ['M', cx + rx, cy],\n ['C', cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry],\n ['C', cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy],\n ['C', cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry],\n ['C', cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy],\n ['Z'],\n ];\n}\n", "// @ts-check\n/**\n * DOM Walker \u2014 \u30D6\u30E9\u30A6\u30B6\u304C\u30EC\u30A4\u30A2\u30A6\u30C8\u3057\u305F Document \u3092\u8D70\u67FB\u3057\u3001DisplayList\uFF08\u63CF\u753B\u547D\u4EE4\u306E\u914D\u5217\uFF09\u3092\u4F5C\u308B\u3002\n * \u5EA7\u6A19\u306F\u3059\u3079\u3066 CSS px\u3001iframe \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08\u5DE6\u4E0A\u539F\u70B9\u3001y \u4E0B\u5411\u304D\uFF09\u3002\n */\nimport { parseColor, cssPx } from '../units.js';\nimport { splitFamilies, parseWeight } from '../font/registry.js';\nimport { measureText } from './text.js';\nimport { featureTagsOf } from '../font/gsub.js';\nimport { loadImage, parseBackgroundUrl, fitImage, objectFitToSize, splitRepeat, tileAxis } from './image.js';\nimport { parseLinearGradient } from './gradient.js';\nimport { shapeToPath } from './svg-path.js';\n\n/**\n * @typedef {import('../units.js').Rgba} Rgba\n * @typedef {[number, number, number, number]} Radius [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] px\n * @typedef {{x: number, y: number, w: number, h: number, radius?: Radius}} Box\n *\n * @typedef {{type: 'rect', x: number, y: number, w: number, h: number, color: Rgba, radius?: Radius, z: number, seq: number}} RectItem\n * @typedef {{type: 'line', x1: number, y1: number, x2: number, y2: number, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} LineItem\n * @typedef {{type: 'stroke-rrect', x: number, y: number, w: number, h: number, radius: Radius, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} StrokeRRectItem\n * @typedef {{type: 'image', x: number, y: number, w: number, h: number, image: import('./image.js').DecodedImage, clip: Box|null, alpha: number, z: number, seq: number}} ImageItem\n * @typedef {{gid: number, cp: number, x: number, advance: number}} Glyph advance \u306F px\n * @typedef {{type: 'text', x: number, y: number, top: number, bottom: number, size: number, color: Rgba, font: import('../font/registry.js').RegisteredFont, glyphs: Glyph[], z: number, seq: number}} TextItem\n * @typedef {{type: 'group', matrix: [number, number, number, number, number, number], origin: {x: number, y: number}, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} GroupItem\n * @typedef {{type: 'clip', box: Box, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} ClipItem overflow: hidden\n * @typedef {{type: 'gradient', box: Box, clip: Box, gradient: import('./gradient.js').LinearGradient, alpha: number, z: number, seq: number}} GradientItem linear-gradient\uFF08box \u306F\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u306E\u57FA\u6E96\u9818\u57DF\u3001clip \u306F\u63CF\u753B\u7BC4\u56F2\uFF09\n * @typedef {{color: Rgba, width: number, cap: 0|1|2, join: 0|1|2, miter: number, dash: number[]|null, dashOffset: number}} PathStroke\n * @typedef {{type: 'path', segs: import('./svg-path.js').PathSeg[], matrix: [number, number, number, number, number, number], fill: Rgba|null, evenOdd: boolean, stroke: PathStroke|null, top: number, bottom: number, z: number, seq: number}} PathItem \u30A4\u30F3\u30E9\u30A4\u30F3 SVG \u306E\u56F3\u5F62\uFF08matrix \u306F\u30E6\u30FC\u30B6\u30FC\u5358\u4F4D \u2192 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @typedef {RectItem|LineItem|StrokeRRectItem|ImageItem|TextItem|GroupItem|ClipItem|GradientItem|PathItem} DisplayItem\n *\n * @typedef {{top: number, bottom: number}} Atom \u30DA\u30FC\u30B8\u5883\u754C\u3092\u8DE8\u3044\u3067\u306F\u3044\u3051\u306A\u3044\u7E26\u7BC4\u56F2\uFF08\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\n * @typedef {{top: number, bottom: number, headTop: number, headBottom: number, headItems: DisplayItem[], footTop: number, footBottom: number, footItems: DisplayItem[]}} TableInfo\n * @typedef {{start: number, end: number, pullTo: number}} Join break-before/after: avoid \u2014 [start, end] \u306B\u5883\u754C\u3092\u7F6E\u304B\u305A\u3001\u7F6E\u304D\u305D\u3046\u306A\u3089 pullTo \u307E\u3067\u623B\u3059\n * @typedef {{x: number, y: number, w: number, h: number, href: string, fragment: string|null}} LinkRect <a href> \u306E 1 \u884C\u3076\u3093\u306E\u5F53\u305F\u308A\u5224\u5B9A\uFF08\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @typedef {{level: number, text: string, y: number}} Heading \u3057\u304A\u308A\u7528\u306E\u898B\u51FA\u3057\n * @typedef {{items: DisplayItem[], atoms: Atom[], breaks: number[], joins: Join[], tables: TableInfo[], links: LinkRect[], anchors: Map<string, number>, headings: Heading[], height: number}} WalkResult\n */\n\n/**\n * @typedef {object} WalkContext\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} fontFallback\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {'font'|'measure'|'auto'} textMeasure\n * @property {import('../pacer.js').Pacer} [pacer] \u9577\u3044\u8D70\u67FB\u3067\u9014\u4E2D\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u305F\u3081\u306E\u8B72\u6E21\n */\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEMPLATE', 'HEAD', 'META', 'LINK', 'TITLE', 'BASE', 'IFRAME', 'CANVAS', 'VIDEO', 'AUDIO', 'OBJECT', 'EMBED']);\n\n/** background-repeat \u3067\u4E26\u3079\u308B\u30BF\u30A4\u30EB\u306E\u4E0A\u9650\u3002\u3053\u308C\u3092\u8D85\u3048\u305F\u3089 1 \u679A\u3060\u3051\u63CF\u3044\u3066\u8B66\u544A\u3059\u308B\u3002 */\nconst MAX_BG_TILES = 4000;\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n/** \u63CF\u753B\u3055\u308C\u306A\u3044 SVG \u8981\u7D20\uFF08\u5B9A\u7FA9\u3084\u8AAC\u660E\uFF09\u3002\u9ED9\u3063\u3066\u98DB\u3070\u3059\u3002 */\nconst SVG_NON_RENDERED = new Set(['defs', 'symbol', 'marker', 'clipPath', 'mask', 'pattern', 'filter', 'linearGradient', 'radialGradient', 'style', 'title', 'desc', 'metadata', 'script']);\n/** \u5B50\u3092\u305F\u3069\u308B\u3060\u3051\u306E SVG \u8981\u7D20 */\nconst SVG_CONTAINERS = new Set(['g', 'a', 'svg', 'switch']);\n\n/**\n * flat tree\uFF08\u30B7\u30E3\u30C9\u30A6 DOM \u3092\u5C55\u958B\u3057\u305F\u6728\uFF09\u3067\u306E\u5B50\u30CE\u30FC\u30C9\u3092\u8FD4\u3059\u3002\n *\n * - \u30B7\u30E3\u30C9\u30A6\u30DB\u30B9\u30C8 \u2192 \u30B7\u30E3\u30C9\u30A6\u30EB\u30FC\u30C8\u306E\u5B50\uFF08light DOM \u306E\u5B50\u306F `<slot>` \u7D4C\u7531\u3067\u73FE\u308C\u308B\uFF09\n * - `<slot>` \u2192 \u5272\u308A\u5F53\u3066\u3089\u308C\u305F\u30CE\u30FC\u30C9\uFF08\u7121\u3051\u308C\u3070\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5185\u5BB9\uFF09\n * - \u305D\u308C\u4EE5\u5916 \u2192 \u901A\u5E38\u306E\u5B50\u30CE\u30FC\u30C9\n *\n * @param {Element} el\n * @returns {ChildNode[]}\n */\nfunction flatChildNodes(el) {\n const shadow = el.shadowRoot;\n if (shadow) return [...shadow.childNodes];\n if (el.tagName === 'SLOT') {\n const slot = /** @type {HTMLSlotElement} */ (/** @type {unknown} */ (el));\n if (typeof slot.assignedNodes === 'function') {\n return /** @type {ChildNode[]} */ (slot.assignedNodes({ flatten: true }));\n }\n }\n return [...el.childNodes];\n}\n\n/** \u672A\u5BFE\u5FDC CSS \u30D7\u30ED\u30D1\u30C6\u30A3: [computedStyle \u306E\u30AD\u30FC, \u300C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u300D\u5224\u5B9A] */\nconst UNSUPPORTED = /** @type {[keyof CSSStyleDeclaration & string, (v: string) => boolean][]} */ ([\n ['boxShadow', (v) => v !== 'none'],\n ['textShadow', (v) => v !== 'none'],\n ['filter', (v) => v !== 'none'],\n ['backdropFilter', (v) => v !== 'none' && v !== ''],\n ['writingMode', (v) => v.startsWith('vertical')],\n ['outlineStyle', (v) => v !== 'none'],\n ['clipPath', (v) => v !== 'none'],\n ['mixBlendMode', (v) => v !== 'normal'],\n]);\n\n/**\n * @param {HTMLElement} root\n * @param {WalkContext} ctx\n * @returns {Promise<WalkResult>}\n */\nexport async function walk(root, ctx) {\n const win = /** @type {Window} */ (root.ownerDocument.defaultView);\n const sx = win.scrollX;\n const sy = win.scrollY;\n /** @type {DisplayItem[]} \u73FE\u5728\u306E\u51FA\u529B\u5148\uFF08transform \u30B0\u30EB\u30FC\u30D7\u5185\u3067\u306F\u5DEE\u3057\u66FF\u308F\u308B\uFF09 */\n let out = [];\n const rootItems = out;\n /** @type {Atom[]} */\n const atoms = [];\n /** @type {number[]} */\n const breaks = [];\n /** @type {Join[]} */\n const joins = [];\n /** @type {LinkRect[]} */\n const links = [];\n /** @type {Map<string, number>} \u6587\u66F8\u5185\u30EA\u30F3\u30AF\u306E\u98DB\u3073\u5148: id \u2192 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y */\n const anchors = new Map();\n /** @type {Heading[]} */\n const headings = [];\n /** @type {TableInfo[]} */\n const tables = [];\n /** @type {TableInfo|null} \u8D70\u67FB\u4E2D\u306E\u30C6\u30FC\u30D6\u30EB\uFF08thead \u306E\u63CF\u753B\u547D\u4EE4\u3092\u8A18\u9332\u3059\u308B\u5148\uFF09 */\n let currentTable = null;\n let seq = 0;\n /** @type {Set<string>} */\n const warned = new Set();\n /** @type {Set<string>} */\n const missingFamilies = new Set();\n\n /**\n * @param {string} key\n * @param {import('../index.js').ConversionWarning} w\n */\n function warnOnce(key, w) {\n if (warned.has(key)) return;\n warned.add(key);\n ctx.warn(w);\n }\n\n /**\n * @typedef {{z: number, alpha: number, decorations: {line: string, color: Rgba}[]}} Inherited\n */\n\n /**\n * @param {Element} el\n * @param {Inherited} inherited\n */\n async function visit(el, inherited) {\n if (SKIP_TAGS.has(el.tagName)) return;\n if (ctx.pacer) await ctx.pacer();\n const style = win.getComputedStyle(el);\n if (style.display === 'none') return;\n\n // transform: \u4E00\u6642\u7684\u306B\u7121\u52B9\u5316\u3057\u3066\u7121\u5909\u5F62\u306E\u5EA7\u6A19\u3067\u8D70\u67FB\u3057\u3001\u30B0\u30EB\u30FC\u30D7\u3068\u3057\u3066\u5305\u3080\n const matrix = parseTransform(style.transform);\n // \u6CE8\u610F: iframe \u5185\u306E\u8981\u7D20\u306F\u89AA\u30A6\u30A3\u30F3\u30C9\u30A6\u306E HTMLElement \u306E instanceof \u306B\u5931\u6557\u3059\u308B\u306E\u3067\u3001\u30BF\u30B0\u540D\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u5224\u5B9A\u3059\u308B\n if (matrix && 'style' in el) {\n const hel = /** @type {HTMLElement} */ (el);\n const transformedRect = hel.getBoundingClientRect();\n const prev = hel.style.transform;\n hel.style.transform = 'none';\n void hel.offsetWidth;\n const plainRect = hel.getBoundingClientRect();\n const [ox, oy] = parseOrigin(style.transformOrigin);\n const origin = { x: plainRect.left + ox + sx, y: plainRect.top + oy + sy };\n\n const saved = out;\n out = [];\n await visitInner(el, win.getComputedStyle(el), inherited);\n const items = out;\n out = saved;\n hel.style.transform = prev;\n void hel.offsetWidth;\n\n out.push({\n type: 'group',\n matrix,\n origin,\n items,\n top: transformedRect.top + sy,\n bottom: transformedRect.bottom + sy,\n z: zOf(style, inherited.z),\n seq: seq++,\n });\n return;\n }\n await visitInner(el, style, inherited);\n }\n\n /** @param {CSSStyleDeclaration} style @param {number} inheritedZ */\n function zOf(style, inheritedZ) {\n if (style.position !== 'static' && style.zIndex !== 'auto') {\n const zi = parseInt(style.zIndex, 10);\n if (Number.isFinite(zi)) return zi;\n }\n return inheritedZ;\n }\n\n /**\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inherited\n */\n async function visitInner(el, style, inherited) {\n const z = zOf(style, inherited.z);\n const opacity = parseFloat(style.opacity);\n const alpha = inherited.alpha * (Number.isFinite(opacity) ? opacity : 1);\n const visible = style.visibility === 'visible' && alpha > 0;\n\n // \u30DA\u30FC\u30B8\u5206\u5272\u306E\u30D2\u30F3\u30C8\uFF08\u975E\u8868\u793A\u3067\u3082\u4F4D\u7F6E\u306F\u6301\u3064\u306E\u3067 visible \u306B\u95A2\u4FC2\u306A\u304F\u96C6\u3081\u308B\uFF09\n if (style.display !== 'contents' && style.display !== 'inline') {\n const r = el.getBoundingClientRect();\n const top = r.top + sy;\n const bottom = r.bottom + sy;\n if (r.height > 0) {\n const bb = style.breakBefore || style.pageBreakBefore;\n const ba = style.breakAfter || style.pageBreakAfter;\n if (/^(page|always|left|right|recto|verso)$/.test(bb)) breaks.push(top);\n if (/^(page|always|left|right|recto|verso)$/.test(ba)) breaks.push(bottom);\n const bi = style.breakInside || style.pageBreakInside;\n // \u8868\u306E\u884C\u30FB\u884C\u30B0\u30EB\u30FC\u30D7\u30FB\u753B\u50CF\u30FBavoid \u6307\u5B9A\u306F\u5206\u5272\u3057\u306A\u3044\n if (bi === 'avoid' || bi === 'avoid-page' || style.display === 'table-row' || style.display === 'table-header-group' || style.display === 'table-footer-group' || el.tagName === 'IMG' || el.tagName === 'svg') {\n atoms.push({ top, bottom });\n }\n // break-before/after: avoid \u2014 \u96A3\u306E\u7BB1\u3068\u306E\u9593\u306B\u30DA\u30FC\u30B8\u5883\u754C\u3092\u7F6E\u304B\u305B\u306A\u3044\n if (/^avoid(-page)?$/.test(ba)) {\n const next = nextBoxAfter(el);\n if (next) joins.push({ start: Math.min(bottom, next.top), end: Math.max(bottom, next.top), pullTo: top });\n }\n if (/^avoid(-page)?$/.test(bb)) {\n const prev = prevBoxBefore(el);\n if (prev) joins.push({ start: Math.min(prev.bottom, top), end: Math.max(prev.bottom, top), pullTo: prev.top });\n }\n }\n }\n collectLinkAndOutline(el, style);\n\n /** @type {TableInfo|null} */\n let openedTable = null;\n if (style.display === 'table' || style.display === 'inline-table') {\n const r = el.getBoundingClientRect();\n openedTable = { top: r.top + sy, bottom: r.bottom + sy, headTop: 0, headBottom: 0, headItems: [], footTop: 0, footBottom: 0, footItems: [] };\n tables.push(openedTable);\n }\n const savedTable = currentTable;\n if (openedTable) currentTable = openedTable;\n const isHead = style.display === 'table-header-group' && currentTable && !currentTable.headItems.length;\n const isFoot = style.display === 'table-footer-group' && currentTable && !currentTable.footItems.length;\n const groupStart = isHead || isFoot ? out.length : -1;\n\n // overflow: hidden / clip / auto / scroll \u2192 \u5B50\u5B6B\u3092 padding-box \u3067\u30AF\u30EA\u30C3\u30D7\u3059\u308B\n const clips = style.overflowX !== 'visible' || style.overflowY !== 'visible';\n /** @type {DisplayItem[]|null} */\n let clipSaved = null;\n /** @type {Box|null} */\n let clipBox = null;\n if (clips && style.display !== 'inline' && style.display !== 'contents' && el !== root) {\n const r = el.getBoundingClientRect();\n clipBox = boxFor(r, style, 'padding-box', parseRadius(style, r));\n }\n\n if (visible && style.display !== 'contents') {\n warnUnsupported(el, style);\n const rects = style.display === 'inline' ? [...el.getClientRects()] : [el.getBoundingClientRect()];\n const collapse = style.borderCollapse === 'collapse' && /^table/.test(style.display) && style.display !== 'table-caption';\n const radius = rects.length === 1 ? parseRadius(style, /** @type {DOMRect} */ (rects[0])) : null;\n for (const r of rects) {\n if (r.width <= 0 && r.height <= 0) continue;\n paintBackground(r, style, alpha, z, radius);\n await paintBackgroundImage(el, r, style, alpha, z, radius);\n paintBorders(r, style, alpha, z, collapse, radius);\n }\n if (el.tagName === 'IMG' && rects[0]) {\n await paintImg(/** @type {HTMLImageElement} */ (el), /** @type {DOMRect} */ (rects[0]), style, alpha, z, radius);\n }\n }\n\n // text-decoration \u306F\u5B50\u5B6B\u30C6\u30AD\u30B9\u30C8\u3078\u4F1D\u64AD\u3059\u308B\n let decorations = inherited.decorations;\n const decoLine = style.textDecorationLine;\n if (decoLine && decoLine !== 'none') {\n const color = parseColor(style.textDecorationColor) ?? parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 };\n decorations = [...decorations, { line: decoLine, color }];\n }\n\n if (clipBox) {\n clipSaved = out;\n out = [];\n }\n const next = { z, alpha, decorations };\n // \u30A4\u30F3\u30E9\u30A4\u30F3 SVG: \u5B50\u306F SVG \u306E\u898F\u5247\u3067\u8D70\u67FB\u3057\u3066\u30D1\u30B9\u306B\u5909\u63DB\u3059\u308B\n if (el.tagName === 'svg' && el.namespaceURI === SVG_NS) {\n paintSvgChildren(el, alpha, z);\n if (clipBox && clipSaved) finishClip(clipBox, clipSaved, z);\n return;\n }\n for (const node of flatChildNodes(el)) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (visible) paintText(/** @type {Text} */ (node), el, style, next);\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n await visit(/** @type {Element} */ (node), next);\n }\n }\n if (clipBox && clipSaved) finishClip(clipBox, clipSaved, z);\n\n if ((isHead || isFoot) && currentTable && groupStart >= 0) {\n const r = el.getBoundingClientRect();\n const items = out.slice(groupStart);\n if (isHead) {\n currentTable.headTop = r.top + sy;\n currentTable.headBottom = r.bottom + sy;\n currentTable.headItems = items;\n } else {\n currentTable.footTop = r.top + sy;\n currentTable.footBottom = r.bottom + sy;\n currentTable.footItems = items;\n }\n }\n currentTable = savedTable;\n }\n\n /** @param {Element} el @param {CSSStyleDeclaration} style */\n function warnUnsupported(el, style) {\n for (const [prop, isSet] of UNSUPPORTED) {\n const v = String(style[prop] ?? '');\n if (isSet(v)) {\n warnOnce(`css:${prop}`, {\n code: 'unsupported-css',\n message: `CSS property \"${camelToKebab(prop)}\" is not supported in this version and will be ignored (first seen on <${el.tagName.toLowerCase()}>: ${v})`,\n element: el,\n property: camelToKebab(prop),\n });\n }\n }\n if (/^matrix3d/.test(style.transform)) {\n warnOnce('css:transform3d', { code: 'unsupported-css', message: '3D transforms are not supported; the element is drawn untransformed', element: el, property: 'transform' });\n }\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n function paintBackground(r, style, alpha, z, radius) {\n const bg = parseColor(style.backgroundColor);\n if (!bg || bg.a <= 0) return;\n /** @type {RectItem} */\n const item = { type: 'rect', x: r.left + sx, y: r.top + sy, w: r.width, h: r.height, color: withAlpha(bg, alpha), z, seq: seq++ };\n if (radius) item.radius = radius;\n out.push(item);\n }\n\n /**\n * @param {Element} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintBackgroundImage(el, r, style, alpha, z, radius) {\n if (style.backgroundImage === 'none') return;\n\n // background-origin / clip\uFF08\u65E2\u5B9A: padding-box / border-box\uFF09\n const bgClip = boxFor(r, style, style.backgroundClip || 'border-box', radius);\n const bgOrigin = boxFor(r, style, style.backgroundOrigin || 'padding-box', null);\n\n // linear-gradient \u306F PDF \u306E\u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3067\u63CF\u304F\n const gradient = parseLinearGradient(style.backgroundImage, bgOrigin.w, bgOrigin.h);\n if (gradient) {\n out.push({ type: 'gradient', box: bgOrigin, clip: bgClip, gradient, alpha, z, seq: seq++ });\n return;\n }\n\n const url = parseBackgroundUrl(style.backgroundImage);\n if (!url) {\n warnOnce('css:backgroundImage', {\n code: 'unsupported-css',\n message: `background-image \"${style.backgroundImage}\" is not supported (a single url() or linear-gradient() is); ignored`,\n element: el,\n property: 'background-image',\n });\n return;\n }\n const img = await loadImage(new URL(url, el.ownerDocument.baseURI).href, ctx.warn, el);\n if (!img) return;\n const fit = fitImage(bgOrigin, img.width, img.height, style.backgroundSize, style.backgroundPosition);\n\n // background-repeat: \u8EF8\u3054\u3068\u306B\u30BF\u30A4\u30EB\u4F4D\u7F6E\u3092\u6C42\u3081\u3001\u63CF\u753B\u9818\u57DF\uFF08bgClip\uFF09\u3092\u8986\u3046\u307E\u3067\u4E26\u3079\u308B\n const [rx, ry] = splitRepeat(style.backgroundRepeat);\n const ax = tileAxis(rx, fit.x, fit.w, bgClip.x, bgClip.x + bgClip.w);\n const ay = tileAxis(ry, fit.y, fit.h, bgClip.y, bgClip.y + bgClip.h);\n const count = ax.positions.length * ay.positions.length;\n if (count > MAX_BG_TILES) {\n warnOnce('css:backgroundRepeat', {\n code: 'unsupported-css',\n message: `background-repeat would need ${count} tiles (limit ${MAX_BG_TILES}); drawn once instead. Use a larger background-size or a pre-tiled image.`,\n element: el,\n property: 'background-repeat',\n });\n out.push({ type: 'image', ...fit, image: img, clip: bgClip, alpha, z, seq: seq++ });\n return;\n }\n for (const y of ay.positions) {\n for (const x of ax.positions) {\n out.push({ type: 'image', x, y, w: ax.size, h: ay.size, image: img, clip: bgClip, alpha, z, seq: seq++ });\n }\n }\n }\n\n /**\n * @param {HTMLImageElement} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintImg(el, r, style, alpha, z, radius) {\n const src = el.currentSrc || el.src;\n if (!src) return;\n const img = await loadImage(src, ctx.warn, el);\n if (!img) return;\n const content = boxFor(r, style, 'content-box', radius);\n const fit = fitImage(content, img.width, img.height, objectFitToSize(style.objectFit), style.objectPosition);\n if (style.objectFit === 'scale-down' && (fit.w > img.width || fit.h > img.height)) {\n Object.assign(fit, fitImage(content, img.width, img.height, 'auto', style.objectPosition));\n }\n out.push({ type: 'image', ...fit, image: img, clip: content, alpha, z, seq: seq++ });\n }\n\n /**\n * border-box \u306E\u77E9\u5F62\u304B\u3089\u6307\u5B9A\u30DC\u30C3\u30AF\u30B9\u3092\u6C42\u3081\u308B\u3002\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {string} box 'border-box' | 'padding-box' | 'content-box'\n * @param {Radius|null} radius\n * @returns {Box}\n */\n function boxFor(r, style, box, radius) {\n let x = r.left + sx;\n let y = r.top + sy;\n let w = r.width;\n let h = r.height;\n if (box === 'padding-box' || box === 'content-box') {\n const bt = cssPx(style.borderTopWidth);\n const br = cssPx(style.borderRightWidth);\n const bb = cssPx(style.borderBottomWidth);\n const bl = cssPx(style.borderLeftWidth);\n x += bl;\n y += bt;\n w -= bl + br;\n h -= bt + bb;\n if (radius) radius = /** @type {Radius} */ (radius.map((v) => Math.max(0, v - Math.max(bt, br, bb, bl))));\n }\n if (box === 'content-box') {\n const pt = cssPx(style.paddingTop);\n const pr = cssPx(style.paddingRight);\n const pb = cssPx(style.paddingBottom);\n const pl = cssPx(style.paddingLeft);\n x += pl;\n y += pt;\n w -= pl + pr;\n h -= pt + pb;\n }\n /** @type {Box} */\n const b = { x, y, w: Math.max(0, w), h: Math.max(0, h) };\n if (radius && radius.some((v) => v > 0)) b.radius = radius;\n return b;\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {boolean} collapse border-collapse: collapse \u306E\u30C6\u30FC\u30D6\u30EB\u8981\u7D20\u304B\uFF08\u5883\u754C\u7DDA\u3092\u8FBA\u306E\u4E2D\u5FC3\u306B\u63CF\u304F\uFF09\n * @param {Radius|null} radius\n */\n function paintBorders(r, style, alpha, z, collapse, radius) {\n const x = r.left + sx;\n const y = r.top + sy;\n const w = r.width;\n const h = r.height;\n /** @type {('Top'|'Right'|'Bottom'|'Left')[]} */\n const names = ['Top', 'Right', 'Bottom', 'Left'];\n const sides = names.map((side) => ({\n side,\n width: cssPx(/** @type {string} */ (style[`border${side}Width`])),\n style: /** @type {string} */ (style[`border${side}Style`]),\n color: parseColor(/** @type {string} */ (style[`border${side}Color`])),\n }));\n const drawn = sides.filter((s) => s.width > 0 && s.style !== 'none' && s.style !== 'hidden' && s.color && s.color.a > 0);\n if (!drawn.length) return;\n\n // \u89D2\u4E38: 4 \u8FBA\u304C\u540C\u3058\u5E45\u30FB\u8272\u30FB\u30B9\u30BF\u30A4\u30EB\u306A\u3089\u89D2\u4E38\u30D1\u30B9\u3092\u30B9\u30C8\u30ED\u30FC\u30AF\u3059\u308B\n if (radius && radius.some((v) => v > 0)) {\n const f = /** @type {typeof drawn[0]} */ (drawn[0]);\n const uniform =\n drawn.length === 4 &&\n drawn.every((s) => s.width === f.width && s.style === f.style && JSON.stringify(s.color) === JSON.stringify(f.color));\n if (uniform) {\n const bw = f.width;\n out.push({\n type: 'stroke-rrect',\n x: x + bw / 2,\n y: y + bw / 2,\n w: w - bw,\n h: h - bw,\n radius: /** @type {Radius} */ (radius.map((v) => Math.max(0, v - bw / 2))),\n width: bw,\n color: withAlpha(/** @type {Rgba} */ (f.color), alpha),\n dash: dashFor(f.style, bw),\n z,\n seq: seq++,\n });\n return;\n }\n warnOnce('css:borderRadiusNonUniform', {\n code: 'unsupported-css',\n message: 'border-radius with non-uniform borders is approximated with straight borders',\n property: 'border-radius',\n });\n }\n\n for (const s of drawn) {\n const bw = s.width;\n const c = withAlpha(/** @type {Rgba} */ (s.color), alpha);\n const horizontal = s.side === 'Top' || s.side === 'Bottom';\n const dir = s.side === 'Top' || s.side === 'Left' ? 1 : -1;\n const edge = s.side === 'Top' ? y : s.side === 'Bottom' ? y + h : s.side === 'Left' ? x : x + w;\n const dash = dashFor(s.style, bw);\n if (dash) {\n const center = collapse ? edge : edge + (bw / 2) * dir;\n out.push({\n type: 'line',\n x1: horizontal ? x : center,\n y1: horizontal ? center : y,\n x2: horizontal ? x + w : center,\n y2: horizontal ? center : y + h,\n width: bw,\n color: c,\n dash,\n z,\n seq: seq++,\n });\n continue;\n }\n // solid / double / groove / ridge / inset / outset \u306F\u5857\u308A\u77E9\u5F62\u3067\u8FD1\u4F3C\n const start = collapse ? edge - bw / 2 : dir > 0 ? edge : edge - bw;\n if (horizontal) out.push({ type: 'rect', x, y: start, w, h: bw, color: c, z, seq: seq++ });\n else out.push({ type: 'rect', x: start, y, w: bw, h, color: c, z, seq: seq++ });\n }\n }\n\n /**\n * @param {Text} node\n * @param {Element} parent\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inh\n */\n function paintText(node, parent, style, inh) {\n const raw = node.data;\n if (!raw) return;\n if (!/\\S/.test(raw) && !raw.includes('\u00A0')) {\n const range = node.ownerDocument.createRange();\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some((r) => r.width > 0)) return;\n }\n\n const color = withAlpha(parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 }, inh.alpha);\n const size = cssPx(style.fontSize);\n if (size <= 0) return;\n const families = splitFamilies(style.fontFamily);\n const weight = parseWeight(style.fontWeight);\n const fstyle = /** @type {'normal'|'italic'} */ (style.fontStyle === 'italic' || style.fontStyle === 'oblique' ? 'italic' : 'normal');\n\n const primary = ctx.registry.match(families, weight, fstyle) ?? ctx.registry.match(ctx.fontFallback, weight, fstyle);\n if (!primary) {\n const key = families.join(',');\n if (!missingFamilies.has(key)) {\n missingFamilies.add(key);\n ctx.warn({\n code: 'missing-font',\n message: `No registered font matches font-family \"${style.fontFamily}\" and no fallback is available; text will be skipped`,\n element: parent,\n });\n }\n return;\n }\n\n const lines = measureText(node, style, {\n registry: ctx.registry,\n families,\n fallback: ctx.fontFallback,\n primary,\n weight,\n fstyle,\n size,\n textMeasure: ctx.textMeasure,\n features: featureTagsOf(style),\n warn: ctx.warn,\n element: parent,\n });\n\n for (const line of lines) {\n if (!line.glyphs.length) continue;\n atoms.push({ top: line.top + sy, bottom: line.bottom + sy });\n out.push({\n type: 'text',\n x: line.glyphs[0]?.x ?? 0,\n y: line.baseline + sy,\n top: line.top + sy,\n bottom: line.bottom + sy,\n size,\n color,\n font: line.font,\n glyphs: line.glyphs.map((g) => ({ ...g, x: g.x + sx })),\n z: inh.z,\n seq: seq++,\n });\n for (const deco of inh.decorations) {\n const first = line.glyphs[0];\n const last = line.glyphs[line.glyphs.length - 1];\n if (!first || !last) continue;\n const x1 = first.x + sx;\n const x2 = last.x + last.advance + sx;\n const thickness = Math.max(1, size / 14);\n const c = withAlpha(deco.color, inh.alpha);\n if (deco.line.includes('underline')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy + size * 0.08, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n if (deco.line.includes('line-through')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy - size * 0.3, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n }\n }\n }\n\n await visit(root, { z: 0, alpha: 1, decorations: [] });\n sortItems(rootItems);\n // \u6587\u66F8\u306E\u9AD8\u3055: body \u306E\u4E0B\u7AEF\u3068\u3001\u306F\u307F\u51FA\u3057\u305F\u547D\u4EE4\uFF08\u7D76\u5BFE\u914D\u7F6E\u306A\u3069\uFF09\u306E\u4E0B\u7AEF\u306E\u5927\u304D\u3044\u65B9\u3002\n // body.scrollHeight \u306F\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u9AD8\u3055\u306B\u81A8\u3089\u3080\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u4F7F\u308F\u306A\u3044\u3002\n let height = root.getBoundingClientRect().bottom + sy;\n for (const it of rootItems) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') height = Math.max(height, it.y + it.h);\n else if (it.type === 'line') height = Math.max(height, it.y1, it.y2);\n else if (it.type === 'text' || it.type === 'group' || it.type === 'clip') height = Math.max(height, it.bottom);\n }\n /**\n * \u30A4\u30F3\u30E9\u30A4\u30F3 SVG \u306E\u5B50\u8981\u7D20\u3092\u8D70\u67FB\u3057\u3001\u56F3\u5F62\u3092\u30D1\u30B9\u547D\u4EE4\u306B\u5909\u63DB\u3059\u308B\u3002\n * viewBox \u3084\u30D7\u30EC\u30BC\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u5C5E\u6027\u306E\u89E3\u6C7A\u306F\u30D6\u30E9\u30A6\u30B6\u306B\u4EFB\u305B\u3001\n * \u5909\u63DB\u884C\u5217\u306F getScreenCTM()\u3001\u5857\u308A\u3068\u7DDA\u306F getComputedStyle() \u304B\u3089\u53D6\u308B\u3002\n *\n * @param {Element} container\n * @param {number} alpha\n * @param {number} z\n */\n function paintSvgChildren(container, alpha, z) {\n for (const child of container.children) {\n if (child.namespaceURI !== SVG_NS) continue;\n const tag = child.tagName;\n if (SVG_NON_RENDERED.has(tag)) continue;\n const style = win.getComputedStyle(child);\n if (style.display === 'none') continue;\n const op = parseFloat(style.opacity);\n const a = alpha * (Number.isFinite(op) ? op : 1);\n if (a <= 0) continue;\n\n if (SVG_CONTAINERS.has(tag)) {\n paintSvgChildren(child, a, z);\n continue;\n }\n\n // \u5E7E\u4F55\u30D7\u30ED\u30D1\u30C6\u30A3\u306F computed style \u3092\u512A\u5148\u3059\u308B\uFF08% \u6307\u5B9A\u306A\u3069\u3092\u30D6\u30E9\u30A6\u30B6\u306B\u89E3\u6C7A\u3055\u305B\u308B\uFF09\n const attr = (/** @type {string} */ name) => {\n const v = style.getPropertyValue(name);\n if (v && /^-?[\\d.]+px$/.test(v)) return String(parseFloat(v));\n return child.getAttribute(name) ?? '';\n };\n const segs = shapeToPath(child, attr);\n if (segs === null) {\n warnOnce(`svg:${tag}`, {\n code: 'unsupported-css',\n message: `<${tag}> inside an inline <svg> is not supported and was skipped (shapes are: path, rect, circle, ellipse, line, polyline, polygon)`,\n element: child,\n });\n continue;\n }\n if (!segs.length || style.visibility !== 'visible') continue;\n\n const ctm = /** @type {SVGGraphicsElement} */ (/** @type {unknown} */ (child)).getScreenCTM?.();\n if (!ctm) continue;\n const fill = svgPaint(child, style.fill, style.fillOpacity, a, 'fill');\n const stroke = svgStroke(child, style, a);\n if (!fill && !stroke) continue;\n\n const r = child.getBoundingClientRect();\n out.push({\n type: 'path',\n segs,\n matrix: [ctm.a, ctm.b, ctm.c, ctm.d, ctm.e + sx, ctm.f + sy],\n fill,\n evenOdd: style.fillRule === 'evenodd',\n stroke,\n top: r.top + sy,\n bottom: r.bottom + sy,\n z,\n seq: seq++,\n });\n }\n }\n\n /**\n * SVG \u306E paint \u5024\uFF08`none` / `rgb(...)` / `url(#id)`\uFF09\u3092\u8272\u306B\u3059\u308B\u3002\u5857\u3089\u306A\u3044\u306A\u3089 null\u3002\n * @param {Element} el\n * @param {string} value\n * @param {string} opacity\n * @param {number} alpha\n * @param {'fill'|'stroke'} kind\n * @returns {Rgba|null}\n */\n function svgPaint(el, value, opacity, alpha, kind) {\n if (!value || value === 'none') return null;\n if (value.startsWith('url(')) {\n warnOnce(`svg:${kind}:url`, {\n code: 'unsupported-css',\n message: `${kind} with a paint server (${value}) inside an inline <svg> is not supported; the shape is skipped`,\n element: el,\n property: kind,\n });\n return null;\n }\n const c = parseColor(value);\n if (!c) return null;\n const o = parseFloat(opacity);\n const f = alpha * (Number.isFinite(o) ? o : 1);\n return f === 1 ? c : { ...c, a: c.a * f };\n }\n\n /**\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @returns {PathStroke|null}\n */\n function svgStroke(el, style, alpha) {\n const color = svgPaint(el, style.stroke, style.strokeOpacity, alpha, 'stroke');\n if (!color) return null;\n const width = cssPx(style.strokeWidth);\n if (!(width > 0)) return null;\n const dashes = (style.strokeDasharray || 'none')\n .split(/[\\s,]+/)\n .map((v) => cssPx(v))\n .filter((v) => Number.isFinite(v) && v >= 0);\n const cap = style.strokeLinecap === 'round' ? 1 : style.strokeLinecap === 'square' ? 2 : 0;\n const join = style.strokeLinejoin === 'round' ? 1 : style.strokeLinejoin === 'bevel' ? 2 : 0;\n const miter = parseFloat(style.strokeMiterlimit);\n return {\n color,\n width,\n cap: /** @type {0|1|2} */ (cap),\n join: /** @type {0|1|2} */ (join),\n miter: Number.isFinite(miter) && miter >= 1 ? miter : 4,\n dash: dashes.length && dashes.some((v) => v > 0) ? dashes : null,\n dashOffset: cssPx(style.strokeDashoffset) || 0,\n };\n }\n\n /**\n * \u30EA\u30F3\u30AF\u6CE8\u91C8\u3068\u3057\u304A\u308A\u306E\u6750\u6599\u3092\u96C6\u3081\u308B\u3002\n *\n * \u63CF\u753B\u547D\u4EE4\u3067\u306F\u306A\u3044\u306E\u3067 DisplayList \u306B\u306F\u5165\u308C\u305A\u3001WalkResult \u306B\u5225\u3067\u6301\u3064\u3002\n * `getClientRects()` \u306F transform \u9069\u7528\u5F8C\u306E\u77E9\u5F62\u3092\u8FD4\u3059\u306E\u3067\u3001\u5909\u5F62\u306E\u4E2D\u306E\u30EA\u30F3\u30AF\u3082\n * \u305D\u306E\u307E\u307E\u5916\u63A5\u77E9\u5F62\u3068\u3057\u3066\u6271\u3048\u308B\uFF08PDF \u306E\u6CE8\u91C8\u306F\u8EF8\u4E26\u884C\u306E\u77E9\u5F62\u3057\u304B\u6301\u3066\u306A\u3044\uFF09\u3002\n *\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n */\n function collectLinkAndOutline(el, style) {\n // \u98DB\u3073\u5148\u306B\u306A\u308A\u3046\u308B id \u3092\u8A18\u9332\u3059\u308B\uFF08<a name> \u3082\u542B\u3080\uFF09\n const id = el.id || (el.tagName === 'A' ? el.getAttribute('name') : null);\n if (id && !anchors.has(id)) {\n const r = el.getBoundingClientRect();\n anchors.set(id, r.top + sy);\n }\n\n if (/^H[1-6]$/.test(el.tagName)) {\n const text = (el.textContent ?? '').trim().replace(/\\s+/g, ' ');\n if (text) headings.push({ level: Number(el.tagName[1]), text, y: el.getBoundingClientRect().top + sy });\n }\n\n if (el.tagName !== 'A') return;\n const href = el.getAttribute('href');\n if (!href) return;\n if (style.visibility !== 'visible') return;\n // \u540C\u3058\u6587\u66F8\u5185\u3078\u306E\u30EA\u30F3\u30AF\u306F\u98DB\u3073\u5148\u306E id \u3092\u899A\u3048\u3066\u304A\u304D\u3001\u30DA\u30FC\u30B8\u304C\u6C7A\u307E\u3063\u3066\u304B\u3089\u89E3\u6C7A\u3059\u308B\n const fragment = href.startsWith('#') ? decodeURIComponent(href.slice(1)) : null;\n /** @type {string} */\n let uri = href;\n if (!fragment) {\n try {\n uri = new URL(href, el.ownerDocument.baseURI).href;\n } catch {\n return; // \u89E3\u6C7A\u3067\u304D\u306A\u3044 href \u306F\u6CE8\u91C8\u306B\u3057\u306A\u3044\n }\n // javascript: \u306A\u3069\u306F\u6CE8\u91C8\u306B\u3057\u306A\u3044\n if (!/^(https?|mailto|tel|ftp|file):/i.test(uri)) return;\n }\n // \u30A4\u30F3\u30E9\u30A4\u30F3\u3067\u6298\u308A\u8FD4\u3057\u3066\u3044\u308B\u3068\u884C\u3054\u3068\u306B\u77E9\u5F62\u304C\u8FD4\u308B\n for (const r of el.getClientRects()) {\n if (r.width <= 0 || r.height <= 0) continue;\n links.push({ x: r.left + sx, y: r.top + sy, w: r.width, h: r.height, href: uri, fragment });\n }\n }\n\n /**\n * overflow \u30AF\u30EA\u30C3\u30D7\u3092\u9589\u3058\u308B\u3002\u7BC4\u56F2\u5916\u306E\u547D\u4EE4\u306F\u6368\u3066\u308B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\u3002\n * @param {Box} clipBox\n * @param {DisplayItem[]} saved\n * @param {number} z\n */\n function finishClip(clipBox, saved, z) {\n const inside = out.filter((it) => intersects(it, clipBox));\n out = saved;\n if (inside.length) {\n out.push({ type: 'clip', box: clipBox, items: inside, top: clipBox.y, bottom: clipBox.y + clipBox.h, z, seq: seq++ });\n }\n }\n\n /**\n * el \u306E\u5B50\u5B6B\u3092\u98DB\u3070\u3057\u3066\u3001\u6587\u66F8\u9806\u3067\u6B21\u306B\u73FE\u308C\u308B\u7BB1\u3092\u8FD4\u3059\u3002\n * \u5144\u5F1F\u304C\u7121\u3051\u308C\u3070\u89AA\u3092\u3055\u304B\u306E\u307C\u308B\u306E\u3067\u3001`<section>` \u306E\u6700\u5F8C\u306E\u898B\u51FA\u3057\u306B break-after: avoid \u3092\u66F8\u3044\u3066\u3082\n * \u6B21\u306E `<section>` \u3068\u7D50\u3073\u3064\u304F\u3002\n * @param {Element} el\n * @returns {{top: number, bottom: number}|null}\n */\n function nextBoxAfter(el) {\n /** @type {Element|null} */\n let node = el;\n while (node && node !== root) {\n for (let sib = node.nextElementSibling; sib; sib = sib.nextElementSibling) {\n const box = edgeBoxIn(sib, 'first');\n if (box) return box;\n }\n node = node.parentElement;\n }\n return null;\n }\n\n /**\n * el \u306E\u5B50\u5B6B\u3068\u7956\u5148\u3092\u98DB\u3070\u3057\u3066\u3001\u6587\u66F8\u9806\u3067\u76F4\u524D\u306B\u73FE\u308C\u308B\u7BB1\u3092\u8FD4\u3059\u3002\n * @param {Element} el\n * @returns {{top: number, bottom: number}|null}\n */\n function prevBoxBefore(el) {\n /** @type {Element|null} */\n let node = el;\n while (node && node !== root) {\n for (let sib = node.previousElementSibling; sib; sib = sib.previousElementSibling) {\n const box = edgeBoxIn(sib, 'last');\n if (box) return box;\n }\n node = node.parentElement;\n }\n return null;\n }\n\n /**\n * el \u81EA\u8EAB\u304C\u7BB1\u306A\u3089\u305D\u308C\u3092\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070\uFF08display: contents / inline\u3001\u9AD8\u3055 0\uFF09\n * \u5B50\u5B6B\u306E\u6700\u521D\uFF0F\u6700\u5F8C\u306E\u7BB1\u3092\u8FD4\u3059\u3002\n * @param {Element} el\n * @param {'first'|'last'} side\n * @returns {{top: number, bottom: number}|null}\n */\n function edgeBoxIn(el, side) {\n if (SKIP_TAGS.has(el.tagName)) return null;\n const style = win.getComputedStyle(el);\n if (style.display === 'none') return null;\n if (style.display !== 'contents' && style.display !== 'inline') {\n const r = el.getBoundingClientRect();\n if (r.height > 0) return { top: r.top + sy, bottom: r.bottom + sy };\n }\n const children = [...el.children];\n if (side === 'last') children.reverse();\n for (const child of children) {\n const box = edgeBoxIn(child, side);\n if (box) return box;\n }\n return null;\n }\n\n return { items: rootItems, atoms, breaks, joins, tables, links, anchors, headings, height };\n}\n\n/** @param {DisplayItem[]} items */\nfunction sortItems(items) {\n items.sort((a, b) => a.z - b.z || a.seq - b.seq);\n for (const it of items) if (it.type === 'group' || it.type === 'clip') sortItems(it.items);\n}\n\n/**\n * @param {string} style border-style\n * @param {number} bw\n * @returns {number[]|null}\n */\nfunction dashFor(style, bw) {\n if (style === 'dashed') return [bw * 3, bw * 3];\n if (style === 'dotted') return [bw, bw];\n return null;\n}\n\n/**\n * computed border-*-radius\uFF08'4px' / '4px 6px' / '50%'\uFF09\u3092 px \u306E Radius \u306B\u3059\u308B\u3002\n * \u6955\u5186\u306F\u6C34\u5E73\u65B9\u5411\u306E\u534A\u5F84\u3067\u8FD1\u4F3C\u3059\u308B\u3002\n * @param {CSSStyleDeclaration} style\n * @param {DOMRect} r\n * @returns {Radius|null}\n */\nfunction parseRadius(style, r) {\n const one = (/** @type {string} */ v) => {\n const first = v.trim().split(/\\s+/)[0] ?? '0px';\n return first.endsWith('%') ? (parseFloat(first) / 100) * r.width : cssPx(first);\n };\n const radius = /** @type {Radius} */ ([\n one(style.borderTopLeftRadius),\n one(style.borderTopRightRadius),\n one(style.borderBottomRightRadius),\n one(style.borderBottomLeftRadius),\n ]);\n return radius.some((v) => v > 0) ? radius : null;\n}\n\n/**\n * computed transform\uFF08'matrix(a, b, c, d, e, f)'\uFF09\u3092\u89E3\u6790\u3059\u308B\u3002none / 3D \u306F null\u3002\n * @param {string} value\n * @returns {[number, number, number, number, number, number]|null}\n */\nexport function parseTransform(value) {\n if (!value || value === 'none') return null;\n const m = /^matrix\\(([^)]+)\\)$/.exec(value.trim());\n if (!m) return null;\n const n = /** @type {string} */ (m[1]).split(',').map((s) => parseFloat(s));\n if (n.length !== 6 || n.some((v) => !Number.isFinite(v))) return null;\n const [a, b, c, d, e, f] = /** @type {[number, number, number, number, number, number]} */ (n);\n if (a === 1 && b === 0 && c === 0 && d === 1 && e === 0 && f === 0) return null;\n return [a, b, c, d, e, f];\n}\n\n/**\n * computed transform-origin\uFF08'40px 20px' \u307E\u305F\u306F 3 \u5024\uFF09\u2192 [x, y] px\n * @param {string} value\n * @returns {[number, number]}\n */\nfunction parseOrigin(value) {\n const parts = value.trim().split(/\\s+/);\n return [cssPx(parts[0] ?? '0'), cssPx(parts[1] ?? '0')];\n}\n\n/**\n * \u547D\u4EE4\u306E\u5916\u63A5\u77E9\u5F62\u304C\u30DC\u30C3\u30AF\u30B9\u3068\u91CD\u306A\u308B\u304B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u5B8C\u5168\u306B\u6D88\u3048\u308B\u547D\u4EE4\u306E\u9664\u53BB\u306B\u4F7F\u3046\uFF09\u3002\n * @param {DisplayItem} it\n * @param {Box} b\n */\nfunction intersects(it, b) {\n let x1;\n let y1;\n let x2;\n let y2;\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') {\n x1 = it.x; y1 = it.y; x2 = it.x + it.w; y2 = it.y + it.h;\n } else if (it.type === 'line') {\n x1 = Math.min(it.x1, it.x2) - it.width; y1 = Math.min(it.y1, it.y2) - it.width;\n x2 = Math.max(it.x1, it.x2) + it.width; y2 = Math.max(it.y1, it.y2) + it.width;\n } else if (it.type === 'text') {\n const last = it.glyphs[it.glyphs.length - 1];\n x1 = it.x; y1 = it.top; x2 = last ? last.x + last.advance : it.x; y2 = it.bottom;\n } else if (it.type === 'path') {\n return true; // \u5909\u63DB\u884C\u5217\u3067\u56DE\u8EE2\u3057\u3046\u308B\u306E\u3067\u5E38\u306B\u6B8B\u3059\n } else if (it.type === 'clip' || it.type === 'gradient') {\n const b2 = it.type === 'clip' ? it.box : it.clip;\n x1 = b2.x; y1 = b2.y; x2 = b2.x + b2.w; y2 = b2.y + b2.h;\n } else {\n return true; // group\uFF08transform\uFF09\u306F\u5883\u754C\u304C\u56DE\u8EE2\u3059\u308B\u306E\u3067\u5E38\u306B\u6B8B\u3059\n }\n return x2 > b.x && x1 < b.x + b.w && y2 > b.y && y1 < b.y + b.h;\n}\n\n/** @param {Rgba} c @param {number} alpha */\nfunction withAlpha(c, alpha) {\n return alpha === 1 ? c : { ...c, a: c.a * alpha };\n}\n\n/** @param {string} s */\nfunction camelToKebab(s) {\n return s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n", "// @ts-check\n/**\n * Web \u6A19\u6E96 CompressionStream \u306B\u3088\u308B zlib (FlateDecode) \u5727\u7E2E\u3002\n * \u672A\u5BFE\u5FDC\u74B0\u5883\u3067\u306F null \u3092\u8FD4\u3057\u3001\u547C\u3073\u51FA\u3057\u5074\u306F\u7121\u5727\u7E2E\u3067\u51FA\u529B\u3059\u308B\u3002\n */\n\n/**\n * @returns {boolean}\n */\nexport function canCompress() {\n return typeof CompressionStream === 'function';\n}\n\n/**\n * @param {Uint8Array} bytes\n * @returns {Promise<Uint8Array|null>} zlib \u5F62\u5F0F\uFF08PDF \u306E FlateDecode \u304C\u671F\u5F85\u3059\u308B\u5F62\u5F0F\uFF09\n */\nexport async function deflate(bytes) {\n if (!canCompress()) return null;\n try {\n const cs = new CompressionStream('deflate');\n const writer = cs.writable.getWriter();\n void writer.write(/** @type {Uint8Array<ArrayBuffer>} */ (bytes));\n void writer.close();\n const buf = await new Response(cs.readable).arrayBuffer();\n return new Uint8Array(buf);\n } catch {\n return null;\n }\n}\n", "// @ts-check\n/**\n * \u6700\u5C0F\u9650\u306E PDF \u30E9\u30A4\u30BF\u30FC\u3002\n * \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u30E1\u30E2\u30EA\u4E0A\u306B\u4FDD\u6301\u3057\u3001build() \u3067 xref / trailer \u3092\u542B\u3080\u30D0\u30A4\u30C8\u5217\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n */\nimport { deflate } from './compress.js';\nimport { num } from '../units.js';\n\n/** \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u53C2\u7167 */\nexport class Ref {\n /** @param {number} id */\n constructor(id) {\n this.id = id;\n }\n toString() {\n return `${this.id} 0 R`;\n }\n}\n\n/** PDF \u540D\u524D\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF08/Name\uFF09 */\nexport class Name {\n /** @param {string} name */\n constructor(name) {\n this.name = name;\n }\n toString() {\n // \u533A\u5207\u308A\u6587\u5B57\u30FB\u975E ASCII \u306F #xx \u3067\u30A8\u30B9\u30B1\u30FC\u30D7\n let out = '/';\n for (const ch of this.name) {\n const c = ch.charCodeAt(0);\n if (c < 0x21 || c > 0x7e || '#/%()<>[]{}'.includes(ch)) {\n for (const b of new TextEncoder().encode(ch)) out += '#' + b.toString(16).padStart(2, '0');\n } else out += ch;\n }\n return out;\n }\n}\n\n/** \u30D0\u30A4\u30C8\u5217\u305D\u306E\u307E\u307E\uFF08\u65E2\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u6E08\u307F\u306E\u65AD\u7247\uFF09 */\nexport class Raw {\n /** @param {string} text */\n constructor(text) {\n this.text = text;\n }\n toString() {\n return this.text;\n }\n}\n\n/**\n * PDF \u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u3002ASCII \u306E\u307F\u306A\u3089\u30EA\u30C6\u30E9\u30EB\u6587\u5B57\u5217\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 UTF-16BE (BOM \u4ED8\u304D) \u306E 16 \u9032\u6587\u5B57\u5217\u3002\n * @param {string} s\n * @returns {Raw}\n */\nexport function pdfString(s) {\n // eslint-disable-next-line no-control-regex\n if (/^[\\x20-\\x7e]*$/.test(s)) {\n return new Raw('(' + s.replace(/[\\\\()]/g, (c) => '\\\\' + c) + ')');\n }\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).padStart(4, '0');\n return new Raw('<' + hex + '>');\n}\n\n/**\n * PDF \u65E5\u4ED8\u6587\u5B57\u5217 (D:YYYYMMDDHHmmSS+HH'mm')\n * @param {Date} d\n * @returns {Raw}\n */\nexport function pdfDate(d) {\n const p = (/** @type {number} */ n) => String(n).padStart(2, '0');\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = p(Math.floor(Math.abs(tz) / 60));\n const tzm = p(Math.abs(tz) % 60);\n return new Raw(\n `(D:${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}${sign}${tzh}'${tzm}')`,\n );\n}\n\n/**\n * @typedef {number|string|boolean|null|Ref|Name|Raw|PdfArray|PdfDict} PdfValue\n */\n/** @typedef {PdfValue[]} PdfArray */\n/** @typedef {{[key: string]: PdfValue}} PdfDict */\n\n/**\n * \u5024\u3092 PDF \u69CB\u6587\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u3059\u308B\u3002\n * - number \u2192 \u6570\u5024\u3001boolean \u2192 true/false\u3001null \u2192 null\n * - string \u2192 \u540D\u524D (/Foo)\u3002\u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u306F pdfString() \u3067 Raw \u306B\u3057\u3066\u6E21\u3059\n * - \u914D\u5217 \u2192 [ ... ]\u3001\u30D7\u30EC\u30FC\u30F3\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 \u2192 << /Key value ... >>\n * @param {PdfValue} v\n * @returns {string}\n */\nexport function serialize(v) {\n if (v === null) return 'null';\n if (typeof v === 'number') return num(v);\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (typeof v === 'string') return new Name(v).toString();\n if (v instanceof Ref || v instanceof Name || v instanceof Raw) return v.toString();\n if (Array.isArray(v)) return '[' + v.map(serialize).join(' ') + ']';\n const parts = [];\n for (const [k, val] of Object.entries(v)) {\n if (val === undefined) continue;\n parts.push(new Name(k).toString() + ' ' + serialize(val));\n }\n return '<< ' + parts.join(' ') + ' >>';\n}\n\n/**\n * @typedef {object} PdfObject\n * @property {PdfValue} value\n * @property {Uint8Array} [stream]\n */\n\nexport class PdfWriter {\n /**\n * @param {{compress?: boolean, version?: string}} [options]\n */\n constructor(options = {}) {\n /** @type {(PdfObject|null)[]} 0 \u756A\u306F\u30D5\u30EA\u30FC\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 */\n this.objects = [null];\n this.compress = options.compress ?? true;\n this.version = options.version ?? '1.7';\n }\n\n /**\n * \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u4E88\u7D04\u3059\u308B\uFF08\u5F8C\u3067 set \u3067\u4E2D\u8EAB\u3092\u5165\u308C\u308B\uFF09\u3002\n * @returns {Ref}\n */\n reserve() {\n this.objects.push({ value: null });\n return new Ref(this.objects.length - 1);\n }\n\n /**\n * @param {Ref} ref\n * @param {PdfValue} value\n * @param {Uint8Array} [stream]\n */\n set(ref, value, stream) {\n this.objects[ref.id] = { value, stream };\n }\n\n /**\n * @param {PdfValue} value\n * @returns {Ref}\n */\n add(value) {\n const ref = this.reserve();\n this.set(ref, value);\n return ref;\n }\n\n /**\n * \u30B9\u30C8\u30EA\u30FC\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u3002compress \u304C\u6709\u52B9\u306A\u3089 FlateDecode \u3092\u8A66\u307F\u308B\u3002\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n * @returns {Promise<Ref>}\n */\n async addStream(dict, bytes, opts = {}) {\n const ref = this.reserve();\n await this.setStream(ref, dict, bytes, opts);\n return ref;\n }\n\n /**\n * @param {Ref} ref\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n */\n async setStream(ref, dict, bytes, opts = {}) {\n let data = bytes;\n const d = { ...dict };\n const doCompress = opts.compress ?? this.compress;\n if (doCompress && !('Filter' in d)) {\n const z = await deflate(bytes);\n if (z && z.length < bytes.length) {\n data = z;\n d.Filter = 'FlateDecode';\n }\n }\n d.Length = data.length;\n this.set(ref, d, data);\n }\n\n /**\n * \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5168\u4F53\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {Ref} rootRef /Catalog \u3078\u306E\u53C2\u7167\n * @param {Ref} [infoRef] /Info \u3078\u306E\u53C2\u7167\n * @returns {Uint8Array}\n */\n build(rootRef, infoRef) {\n const enc = new TextEncoder();\n /** @type {Uint8Array[]} */\n const chunks = [];\n let offset = 0;\n const push = (/** @type {Uint8Array|string} */ c) => {\n const b = typeof c === 'string' ? enc.encode(c) : c;\n chunks.push(b);\n offset += b.length;\n };\n\n // \u30D8\u30C3\u30C0\u30FC\u30022 \u884C\u76EE\u306E\u30D0\u30A4\u30CA\u30EA\u30B3\u30E1\u30F3\u30C8\u306F\u30D5\u30A1\u30A4\u30EB\u304C\u30D0\u30A4\u30CA\u30EA\u3067\u3042\u308B\u3053\u3068\u3092\u8EE2\u9001\u7CFB\u306B\u77E5\u3089\u305B\u308B\u6163\u4F8B\n push(concat([enc.encode(`%PDF-${this.version}\\n%`), new Uint8Array([0xe2, 0xe3, 0xcf, 0xd3]), enc.encode('\\n')]));\n\n /** @type {number[]} */\n const offsets = [];\n for (let i = 1; i < this.objects.length; i++) {\n const obj = this.objects[i];\n if (!obj) throw new Error(`PDF object ${i} was reserved but never set`);\n offsets[i] = offset;\n push(`${i} 0 obj\\n${serialize(obj.value)}\\n`);\n if (obj.stream) {\n push('stream\\n');\n push(obj.stream);\n push('\\nendstream\\n');\n }\n push('endobj\\n');\n }\n\n const xrefOffset = offset;\n let xref = `xref\\n0 ${this.objects.length}\\n0000000000 65535 f \\n`;\n for (let i = 1; i < this.objects.length; i++) {\n xref += String(offsets[i]).padStart(10, '0') + ' 00000 n \\n';\n }\n push(xref);\n /** @type {{[key: string]: PdfValue}} */\n const trailer = { Size: this.objects.length, Root: rootRef };\n if (infoRef) trailer.Info = infoRef;\n push(`trailer\\n${serialize(trailer)}\\nstartxref\\n${xrefOffset}\\n%%EOF\\n`);\n\n return concat(chunks);\n }\n}\n\n/**\n * @param {Uint8Array[]} chunks\n * @returns {Uint8Array}\n */\nexport function concat(chunks) {\n let len = 0;\n for (const c of chunks) len += c.length;\n const out = new Uint8Array(len);\n let o = 0;\n for (const c of chunks) {\n out.set(c, o);\n o += c.length;\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u30DA\u30FC\u30B8\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u30D3\u30EB\u30C0\u30FC\u3002\n * \u5EA7\u6A19\u306F PDF \u5EA7\u6A19\u7CFB\uFF08\u5DE6\u4E0B\u539F\u70B9\u3001pt\uFF09\u3067\u53D7\u3051\u53D6\u308B\u3002CSS \u5EA7\u6A19\u304B\u3089\u306E\u5909\u63DB\u306F\u547C\u3073\u51FA\u3057\u5074\uFF08page.js\uFF09\u304C\u884C\u3046\u3002\n */\nimport { num } from '../units.js';\n\nexport class ContentStream {\n constructor() {\n /** @type {string[]} */\n this.ops = [];\n this.depth = 0;\n }\n\n save() {\n this.ops.push('q');\n this.depth++;\n return this;\n }\n\n restore() {\n if (this.depth <= 0) throw new Error('ContentStream: unbalanced Q');\n this.ops.push('Q');\n this.depth--;\n return this;\n }\n\n /** @param {number} a @param {number} b @param {number} c @param {number} d @param {number} e @param {number} f */\n transform(a, b, c, d, e, f) {\n this.ops.push(`${num(a)} ${num(b)} ${num(c)} ${num(d)} ${num(e)} ${num(f)} cm`);\n return this;\n }\n\n /** @param {string} gsName ExtGState \u30EA\u30BD\u30FC\u30B9\u540D */\n setGState(gsName) {\n this.ops.push(`/${gsName} gs`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n fillColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} rg`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n strokeColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} RG`);\n return this;\n }\n\n /** @param {number} w */\n lineWidth(w) {\n this.ops.push(`${num(w)} w`);\n return this;\n }\n\n /** @param {number[]} pattern @param {number} [phase] */\n dash(pattern, phase = 0) {\n this.ops.push(`[${pattern.map(num).join(' ')}] ${num(phase)} d`);\n return this;\n }\n\n /** @param {0|1|2} cap */\n lineCap(cap) {\n this.ops.push(`${cap} J`);\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n rect(x, y, w, h) {\n this.ops.push(`${num(x)} ${num(y)} ${num(w)} ${num(h)} re`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n moveTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} m`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n lineTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} l`);\n return this;\n }\n\n /**\n * 3 \u6B21\u30D9\u30B8\u30A7\u66F2\u7DDA\n * @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2 @param {number} x3 @param {number} y3\n */\n curveTo(x1, y1, x2, y2, x3, y3) {\n this.ops.push(`${num(x1)} ${num(y1)} ${num(x2)} ${num(y2)} ${num(x3)} ${num(y3)} c`);\n return this;\n }\n\n closePath() {\n this.ops.push('h');\n return this;\n }\n\n /**\n * \u89D2\u4E38\u77E9\u5F62\u306E\u30D1\u30B9\u3092\u8FFD\u52A0\u3059\u308B\uFF08PDF \u5EA7\u6A19: y \u4E0A\u5411\u304D\u3001(x, y) \u306F\u5DE6\u4E0B\uFF09\u3002\n * @param {number} x @param {number} y @param {number} w @param {number} h\n * @param {[number, number, number, number]} r [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] \u306E\u534A\u5F84\uFF08pt\uFF09\u3002CSS \u306E\u9806\u5E8F\n */\n roundedRect(x, y, w, h, r) {\n const k = 0.5523; // 4/3\u00B7(\u221A2\u22121)\n const max = Math.min(w, h) / 2;\n const clamp = (/** @type {number} */ v) => Math.max(0, Math.min(v, max));\n const tl = clamp(r[0]);\n const tr = clamp(r[1]);\n const br = clamp(r[2]);\n const bl = clamp(r[3]);\n const top = y + h;\n const right = x + w;\n // \u5DE6\u4E0A\u304B\u3089\u6642\u8A08\u56DE\u308A\uFF08PDF \u5EA7\u6A19\u3067\u306F\u4E0A\u8FBA\u304C y+h\uFF09\n this.moveTo(x + tl, top);\n this.lineTo(right - tr, top);\n if (tr) this.curveTo(right - tr + tr * k, top, right, top - tr + tr * k, right, top - tr);\n this.lineTo(right, y + br);\n if (br) this.curveTo(right, y + br - br * k, right - br + br * k, y, right - br, y);\n this.lineTo(x + bl, y);\n if (bl) this.curveTo(x + bl - bl * k, y, x, y + bl - bl * k, x, y + bl);\n this.lineTo(x, top - tl);\n if (tl) this.curveTo(x, top - tl + tl * k, x + tl - tl * k, top, x + tl, top);\n return this.closePath();\n }\n\n /**\n * \u753B\u50CF XObject \u3092 (x, y) \u3092\u5DE6\u4E0B\u3068\u3057\u3066 w\u00D7h \u3067\u63CF\u304F\u3002\n * @param {string} name @param {number} x @param {number} y @param {number} w @param {number} h\n */\n image(name, x, y, w, h) {\n this.ops.push(`q ${num(w)} 0 0 ${num(h)} ${num(x)} ${num(y)} cm /${name} Do Q`);\n return this;\n }\n\n /** @param {0|1|2} join */\n lineJoin(join) {\n this.ops.push(`${join} j`);\n return this;\n }\n\n /** @param {number} limit */\n miterLimit(limit) {\n this.ops.push(`${num(limit)} M`);\n return this;\n }\n\n /** @param {boolean} [evenOdd] */\n fill(evenOdd = false) {\n this.ops.push(evenOdd ? 'f*' : 'f');\n return this;\n }\n\n /** \u5857\u308A\u3068\u7DDA\u306E\u4E21\u65B9\uFF08B / B*\uFF09 @param {boolean} [evenOdd] */\n fillAndStroke(evenOdd = false) {\n this.ops.push(evenOdd ? 'B*' : 'B');\n return this;\n }\n\n /**\n * \u6B63\u898F\u5316\u6E08\u307F\u306E\u30D1\u30B9\uFF08M / L / C / Z\uFF09\u3092\u51FA\u529B\u3059\u308B\u3002\n * @param {import('../walker/svg-path.js').PathSeg[]} segs\n */\n path(segs) {\n for (const s of segs) {\n if (s[0] === 'M') this.moveTo(s[1], s[2]);\n else if (s[0] === 'L') this.lineTo(s[1], s[2]);\n else if (s[0] === 'C') this.curveTo(s[1], s[2], s[3], s[4], s[5], s[6]);\n else this.closePath();\n }\n return this;\n }\n\n stroke() {\n this.ops.push('S');\n return this;\n }\n\n /**\n * \u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u73FE\u5728\u306E\u30AF\u30EA\u30C3\u30D7\u7BC4\u56F2\u3044\u3063\u3071\u3044\u306B\u5857\u308B\u3002\n * @param {string} name Shading \u30EA\u30BD\u30FC\u30B9\u540D\n */\n shading(name) {\n this.ops.push(`/${name} sh`);\n return this;\n }\n\n /** \u73FE\u5728\u306E\u30D1\u30B9\u3067\u30AF\u30EA\u30C3\u30D7\u3057\u3066\u65B0\u3057\u3044\u30D1\u30B9\u3092\u958B\u59CB\u3059\u308B */\n clip() {\n this.ops.push('W n');\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n fillRect(x, y, w, h) {\n return this.rect(x, y, w, h).fill();\n }\n\n /**\n * \u30C6\u30AD\u30B9\u30C8\u3092\u63CF\u753B\u3059\u308B\u3002\n * @param {string} fontName \u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n * @param {number} size \u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA (pt)\n * @param {number} x \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u59CB\u70B9 x (pt)\n * @param {number} y \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y (pt)\n * @param {Array<string|number>} tj TJ \u914D\u5217\u3002\u6587\u5B57\u5217\u306F 16 \u9032 CID \u5217\uFF08<...> \u306A\u3057\uFF09\u3001\u6570\u5024\u306F 1/1000 \u5358\u4F4D\u306E\u4F4D\u7F6E\u8ABF\u6574\n * @param {{charSpacing?: number, rise?: number}} [opts]\n */\n text(fontName, size, x, y, tj, opts = {}) {\n const parts = [];\n for (const t of tj) {\n if (typeof t === 'string') {\n if (t.length) parts.push(`<${t}>`);\n } else if (t !== 0) parts.push(num(t));\n }\n if (!parts.length) return this;\n this.ops.push('BT');\n this.ops.push(`/${fontName} ${num(size)} Tf`);\n if (opts.charSpacing) this.ops.push(`${num(opts.charSpacing)} Tc`);\n if (opts.rise) this.ops.push(`${num(opts.rise)} Ts`);\n this.ops.push(`1 0 0 1 ${num(x)} ${num(y)} Tm`);\n this.ops.push(`[${parts.join(' ')}] TJ`);\n this.ops.push('ET');\n return this;\n }\n\n /** @returns {Uint8Array} */\n toBytes() {\n if (this.depth !== 0) throw new Error(`ContentStream: ${this.depth} unclosed q`);\n return new TextEncoder().encode(this.ops.join('\\n') + '\\n');\n }\n}\n", "// @ts-check\n/**\n * TrueType \u30B5\u30D6\u30BB\u30C3\u30BF\u30FC\u3002\n * \u4F7F\u7528\u30B0\u30EA\u30D5\uFF08\u3068\u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\uFF09\u3060\u3051\u3092\u542B\u3080\u65B0\u3057\u3044 sfnt \u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * GID \u306F 0 \u304B\u3089\u8A70\u3081\u76F4\u3055\u308C\u3001\u65E7 GID \u2192 \u65B0 GID \u306E\u5BFE\u5FDC\u8868\u3092\u8FD4\u3059\u3002\n * cmap \u306F\u51FA\u529B\u3057\u306A\u3044\uFF08PDF \u5074\u3067\u306F CIDToGIDMap /Identity \u3067 CID = \u65B0 GID \u3068\u3057\u3066\u6271\u3046\uFF09\u3002\n */\nimport { glyphData, componentGids } from './parse.js';\nimport { concat } from '../pdf/writer.js';\n\n/**\n * @typedef {object} SubsetResult\n * @property {Uint8Array} data \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3055\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\n * @property {Map<number, number>} gidMap \u65E7 GID \u2192 \u65B0 GID\n * @property {number[]} oldGids \u65B0 GID \u9806\u306B\u4E26\u3093\u3060\u65E7 GID\n */\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {Iterable<number>} usedGids\n * @returns {SubsetResult}\n */\nexport function subsetFont(font, usedGids) {\n // 1. \u30B0\u30EA\u30D5\u96C6\u5408\u3092\u9589\u5305\u3059\u308B\uFF08\u8907\u5408\u30B0\u30EA\u30D5\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u518D\u5E30\u7684\u306B\u8FFD\u52A0\uFF09\n /** @type {Set<number>} */\n const set = new Set([0]);\n const stack = [...usedGids];\n while (stack.length) {\n const gid = /** @type {number} */ (stack.pop());\n if (gid < 0 || gid >= font.numGlyphs || set.has(gid)) continue;\n set.add(gid);\n for (const c of componentGids(glyphData(font, gid))) if (!set.has(c)) stack.push(c);\n }\n const oldGids = [...set].sort((a, b) => a - b);\n /** @type {Map<number, number>} */\n const gidMap = new Map();\n oldGids.forEach((g, i) => gidMap.set(g, i));\n const n = oldGids.length;\n\n // 2. glyf / loca\n /** @type {Uint8Array[]} */\n const glyphChunks = [];\n const loca = new Uint32Array(n + 1);\n let glyfLen = 0;\n for (let i = 0; i < n; i++) {\n let g = glyphData(font, /** @type {number} */ (oldGids[i]));\n if (g.length && new DataView(g.buffer, g.byteOffset, g.byteLength).getInt16(0) < 0) {\n g = remapComposite(g, gidMap);\n }\n loca[i] = glyfLen;\n glyphChunks.push(g);\n glyfLen += g.length;\n const pad = (4 - (glyfLen % 4)) % 4;\n if (pad) {\n glyphChunks.push(new Uint8Array(pad));\n glyfLen += pad;\n }\n }\n loca[n] = glyfLen;\n const glyf = concat(glyphChunks);\n const locaBytes = new Uint8Array(loca.length * 4);\n const ldv = new DataView(locaBytes.buffer);\n loca.forEach((v, i) => ldv.setUint32(i * 4, v));\n\n // 3. hmtx\uFF08\u5168\u30B0\u30EA\u30D5\u5206\u306E advance + lsb \u3092\u66F8\u304F\uFF09\n const origHmtx = /** @type {{offset: number, length: number}} */ (font.tables.get('hmtx'));\n const origHhea = /** @type {{offset: number, length: number}} */ (font.tables.get('hhea'));\n const fdv = new DataView(font.data.buffer, font.data.byteOffset, font.data.byteLength);\n const numberOfHMetrics = fdv.getUint16(origHhea.offset + 34);\n const hmtx = new Uint8Array(n * 4);\n const hdv = new DataView(hmtx.buffer);\n for (let i = 0; i < n; i++) {\n const old = /** @type {number} */ (oldGids[i]);\n const lsbOffset =\n old < numberOfHMetrics\n ? origHmtx.offset + old * 4 + 2\n : origHmtx.offset + numberOfHMetrics * 4 + (old - numberOfHMetrics) * 2;\n hdv.setUint16(i * 4, font.advances[old] ?? 0);\n hdv.setInt16(i * 4 + 2, lsbOffset + 2 <= font.data.byteLength ? fdv.getInt16(lsbOffset) : 0);\n }\n\n // 4. head / hhea / maxp \u3092\u30B3\u30D4\u30FC\u3057\u3066\u66F8\u304D\u63DB\u3048\n const head = copyTable(font, 'head');\n const headDv = new DataView(head.buffer);\n headDv.setUint32(8, 0); // checkSumAdjustment\uFF08\u5F8C\u3067\u8A08\u7B97\uFF09\n headDv.setInt16(50, 1); // indexToLocFormat = long\n\n const hhea = copyTable(font, 'hhea');\n new DataView(hhea.buffer).setUint16(34, n);\n\n const maxp = copyTable(font, 'maxp');\n new DataView(maxp.buffer).setUint16(4, n);\n\n // 5. \u30C6\u30FC\u30D6\u30EB\u7FA4\u3092\u7D44\u307F\u7ACB\u3066\u308B\uFF08\u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\uFF09\n /** @type {[string, Uint8Array][]} */\n const tables = [\n ['glyf', glyf],\n ['head', head],\n ['hhea', hhea],\n ['hmtx', hmtx],\n ['loca', locaBytes],\n ['maxp', maxp],\n ];\n for (const opt of ['cvt ', 'fpgm', 'prep']) {\n if (font.tables.has(opt)) tables.push([opt, copyTable(font, opt)]);\n }\n tables.sort((a, b) => (a[0] < b[0] ? -1 : 1));\n\n const data = buildSfnt(tables);\n return { data, gidMap, oldGids };\n}\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} tag\n * @returns {Uint8Array}\n */\nfunction copyTable(font, tag) {\n const t = font.tables.get(tag);\n if (!t) throw new Error(`missing table ${tag}`);\n // Node \u306E Buffer \u306F slice \u304C\u30D3\u30E5\u30FC\u3092\u8FD4\u3059\u305F\u3081\u3001\u5FC5\u305A\u30B3\u30D4\u30FC\u3092\u4F5C\u308B\n return new Uint8Array(font.data.subarray(t.offset, t.offset + t.length));\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u5185\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u65B0 GID \u306B\u66F8\u304D\u63DB\u3048\u308B\u3002\n * @param {Uint8Array} g\n * @param {Map<number, number>} gidMap\n * @returns {Uint8Array}\n */\nfunction remapComposite(g, gidMap) {\n const out = new Uint8Array(g);\n const dv = new DataView(out.buffer);\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const oldGid = dv.getUint16(p + 2);\n dv.setUint16(p + 2, gidMap.get(oldGid) ?? 0);\n p += 4;\n p += flags & 0x0001 ? 4 : 2;\n if (flags & 0x0008) p += 2;\n else if (flags & 0x0040) p += 4;\n else if (flags & 0x0080) p += 8;\n if (!(flags & 0x0020)) break;\n if (p >= out.length) break;\n }\n return out;\n}\n\n/**\n * \u30C6\u30FC\u30D6\u30EB\u7FA4\u304B\u3089 sfnt \u30D5\u30A1\u30A4\u30EB\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {[string, Uint8Array][]} tables \u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\u6E08\u307F\n * @returns {Uint8Array}\n */\nfunction buildSfnt(tables) {\n const numTables = tables.length;\n let entrySelector = 0;\n while (1 << (entrySelector + 1) <= numTables) entrySelector++;\n const searchRange = (1 << entrySelector) * 16;\n const rangeShift = numTables * 16 - searchRange;\n\n const dirLen = 12 + numTables * 16;\n let offset = dirLen;\n /** @type {{tag: string, data: Uint8Array, offset: number, checksum: number}[]} */\n const entries = [];\n for (const [tag, data] of tables) {\n entries.push({ tag, data, offset, checksum: checksum(data) });\n offset += (data.length + 3) & ~3;\n }\n\n const out = new Uint8Array(offset);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, 0x00010000);\n dv.setUint16(4, numTables);\n dv.setUint16(6, searchRange);\n dv.setUint16(8, entrySelector);\n dv.setUint16(10, rangeShift);\n entries.forEach((e, i) => {\n const p = 12 + i * 16;\n for (let k = 0; k < 4; k++) out[p + k] = e.tag.charCodeAt(k);\n dv.setUint32(p + 4, e.checksum);\n dv.setUint32(p + 8, e.offset);\n dv.setUint32(p + 12, e.data.length);\n out.set(e.data, e.offset);\n });\n\n // head.checkSumAdjustment = 0xB1B0AFBA - checksum(whole font)\n const headEntry = entries.find((e) => e.tag === 'head');\n if (headEntry) {\n const total = checksum(out);\n dv.setUint32(headEntry.offset + 8, (0xb1b0afba - total) >>> 0);\n }\n return out;\n}\n\n/**\n * @param {Uint8Array} data\n * @returns {number}\n */\nfunction checksum(data) {\n let sum = 0;\n const n = data.length;\n for (let i = 0; i < n; i += 4) {\n const b0 = data[i] ?? 0;\n const b1 = data[i + 1] ?? 0;\n const b2 = data[i + 2] ?? 0;\n const b3 = data[i + 3] ?? 0;\n sum = (sum + (((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) >>> 0)) >>> 0;\n }\n return sum;\n}\n", "// @ts-check\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3057\u305F TrueType \u3092 PDF \u306E Type0 / CIDFontType2 \u3068\u3057\u3066\u57CB\u3081\u8FBC\u3080\u3002\n * CID = \u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C\u306E GID\uFF08CIDToGIDMap /Identity\uFF09\u3001\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u306F Identity-H\u3002\n * ToUnicode CMap \u3092\u5FC5\u305A\u4ED8\u3051\u3066\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u30FB\u691C\u7D22\u30FB\u30B3\u30D4\u30FC\u3092\u4FDD\u8A3C\u3059\u308B\u3002\n */\nimport { Raw } from '../pdf/writer.js';\nimport { subsetFont } from './subset.js';\n\n/**\n * PDF \u306B\u57CB\u3081\u8FBC\u3080 1 \u30D5\u30A9\u30F3\u30C8\u5206\u306E\u4F7F\u7528\u72B6\u6CC1\u3002\n * \u8D70\u67FB\u4E2D\u306B addGlyph \u3067\u30B0\u30EA\u30D5\u3092\u96C6\u3081\u3001\u6700\u5F8C\u306B embed \u3067 PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u751F\u6210\u3059\u308B\u3002\n */\nexport class EmbeddedFont {\n /**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} resourceName \u30DA\u30FC\u30B8\u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n */\n constructor(font, resourceName) {\n this.font = font;\n this.resourceName = resourceName;\n /** @type {Map<number, number>} \u65E7 GID \u2192 \u4EE3\u8868\u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08ToUnicode \u7528\uFF09 */\n this.usedGids = new Map();\n /** @type {import('./subset.js').SubsetResult|null} */\n this.subset = null;\n }\n\n /**\n * @param {number} gid \u65E7 GID\n * @param {number} codePoint\n */\n addGlyph(gid, codePoint) {\n if (!this.usedGids.has(gid)) this.usedGids.set(gid, codePoint);\n }\n\n /**\n * \u65E7 GID \u3092 PDF \u4E0A\u306E CID\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C GID\uFF09\u3078\u5909\u63DB\u3059\u308B\u3002embed \u5F8C\u306B\u306E\u307F\u6709\u52B9\u3002\n * @param {number} gid\n * @returns {number}\n */\n cid(gid) {\n if (!this.subset) throw new Error('EmbeddedFont: embed() must be called before cid()');\n return this.subset.gidMap.get(gid) ?? 0;\n }\n\n /**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3092\u78BA\u5B9A\u3055\u305B\u308B\u3002\u4EE5\u5F8C cid() \u304C\u4F7F\u3048\u308B\u3002\n */\n finalize() {\n if (!this.subset) this.subset = subsetFont(this.font, this.usedGids.keys());\n return this.subset;\n }\n\n /**\n * PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u7FA4\u3092\u66F8\u304D\u8FBC\u307F\u3001Type0 \u30D5\u30A9\u30F3\u30C8\u8F9E\u66F8\u3078\u306E\u53C2\u7167\u3092\u8FD4\u3059\u3002\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\n async embed(writer) {\n const subset = this.finalize();\n const f = this.font;\n const scale = 1000 / f.unitsPerEm;\n const tag = subsetTag(this.usedGids);\n const baseFont = `${tag}+${f.postScriptName}`;\n\n const fontFile = await writer.addStream({ Length1: subset.data.length }, subset.data);\n\n // \u30D5\u30E9\u30B0: bit 3 (Symbolic) \u3092\u7ACB\u3066\u308B\u3002Nonsymbolic \u3068\u6392\u4ED6\u3002Italic \u306F bit 7\u3001ForceBold \u306F bit 19\u3002\n let flags = 4;\n if (f.italic) flags |= 1 << 6;\n if (f.bold) flags |= 1 << 18;\n\n const descriptor = writer.add({\n Type: 'FontDescriptor',\n FontName: baseFont,\n Flags: flags,\n FontBBox: f.bbox.map((v) => Math.round(v * scale)),\n ItalicAngle: f.italicAngle,\n Ascent: Math.round(f.ascender * scale),\n Descent: Math.round(f.descender * scale),\n CapHeight: Math.round(f.capHeight * scale),\n StemV: f.bold ? 120 : 80,\n FontFile2: fontFile,\n });\n\n // W \u914D\u5217: \u9023\u7D9A CID \u3092\u307E\u3068\u3081\u308B c [w1 w2 ...] \u5F62\u5F0F\n /** @type {import('../pdf/writer.js').PdfValue[]} */\n const W = [];\n const widths = subset.oldGids.map((g) => Math.round((f.advances[g] ?? 0) * scale));\n let i = 0;\n while (i < widths.length) {\n let j = i;\n while (j + 1 < widths.length && j - i < 100) j++;\n W.push(i, widths.slice(i, j + 1));\n i = j + 1;\n }\n\n const cidFont = writer.add({\n Type: 'Font',\n Subtype: 'CIDFontType2',\n BaseFont: baseFont,\n CIDSystemInfo: { Registry: new Raw('(Adobe)'), Ordering: new Raw('(Identity)'), Supplement: 0 },\n FontDescriptor: descriptor,\n DW: 1000,\n W,\n CIDToGIDMap: 'Identity',\n });\n\n const toUnicode = await writer.addStream({}, buildToUnicode(subset, this.usedGids));\n\n return writer.add({\n Type: 'Font',\n Subtype: 'Type0',\n BaseFont: baseFont,\n Encoding: 'Identity-H',\n DescendantFonts: [cidFont],\n ToUnicode: toUnicode,\n });\n }\n}\n\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u30D5\u30A9\u30F3\u30C8\u540D\u306E\u63A5\u982D\u8F9E\uFF086 \u6587\u5B57\u306E\u5927\u6587\u5B57\uFF09\u3002\u4F7F\u7528\u30B0\u30EA\u30D5\u96C6\u5408\u304B\u3089\u6C7A\u5B9A\u7684\u306B\u751F\u6210\u3059\u308B\u3002\n * @param {Map<number, number>} usedGids\n * @returns {string}\n */\nfunction subsetTag(usedGids) {\n let h = 2166136261;\n for (const g of usedGids.keys()) {\n h ^= g;\n h = Math.imul(h, 16777619) >>> 0;\n }\n let tag = '';\n for (let i = 0; i < 6; i++) {\n tag += String.fromCharCode(65 + (h % 26));\n h = Math.floor(h / 26);\n }\n return tag;\n}\n\n/**\n * ToUnicode CMap\uFF08bfchar \u5F62\u5F0F\uFF09\u3092\u751F\u6210\u3059\u308B\u3002\n * @param {import('./subset.js').SubsetResult} subset\n * @param {Map<number, number>} usedGids \u65E7 GID \u2192 \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\n * @returns {Uint8Array}\n */\nfunction buildToUnicode(subset, usedGids) {\n /** @type {string[]} */\n const entries = [];\n subset.oldGids.forEach((oldGid, cid) => {\n const cp = usedGids.get(oldGid);\n if (cp === undefined) return;\n entries.push(`<${hex4(cid)}> <${utf16Hex(cp)}>`);\n });\n\n let body = '';\n for (let i = 0; i < entries.length; i += 100) {\n const chunk = entries.slice(i, i + 100);\n body += `${chunk.length} beginbfchar\\n${chunk.join('\\n')}\\nendbfchar\\n`;\n }\n\n const cmap =\n `/CIDInit /ProcSet findresource begin\\n` +\n `12 dict begin\\nbegincmap\\n` +\n `/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\\n` +\n `/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n` +\n `1 begincodespacerange\\n<0000> <FFFF>\\nendcodespacerange\\n` +\n body +\n `endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend\\n`;\n return new TextEncoder().encode(cmap);\n}\n\n/** @param {number} n */\nexport function hex4(n) {\n return n.toString(16).toUpperCase().padStart(4, '0');\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u3092 UTF-16BE \u306E 16 \u9032\u8868\u8A18\u306B\u3059\u308B\uFF08\u30B5\u30ED\u30B2\u30FC\u30C8\u30DA\u30A2\u5BFE\u5FDC\uFF09\u3002\n * @param {number} cp\n */\nfunction utf16Hex(cp) {\n if (cp <= 0xffff) return hex4(cp);\n const v = cp - 0x10000;\n return hex4(0xd800 + (v >> 10)) + hex4(0xdc00 + (v & 0x3ff));\n}\n\n", "// @ts-check\n/**\n * \u30C7\u30B3\u30FC\u30C9\u6E08\u307F\u753B\u50CF\u3092 PDF \u306E Image XObject \u3068\u3057\u3066\u66F8\u304D\u51FA\u3059\u3002\n */\n\n/**\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @param {import('../walker/image.js').DecodedImage} img\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\nexport async function embedImage(writer, img) {\n /** @type {{[key: string]: import('../pdf/writer.js').PdfValue}} */\n const dict = {\n Type: 'XObject',\n Subtype: 'Image',\n Width: img.width,\n Height: img.height,\n ColorSpace: 'DeviceRGB',\n BitsPerComponent: 8,\n };\n if (img.jpeg) {\n dict.Filter = 'DCTDecode';\n return writer.addStream(dict, img.jpeg, { compress: false });\n }\n if (!img.rgb) throw new Error('embedImage: image has no pixel data');\n if (img.alpha) {\n dict.SMask = await writer.addStream(\n { Type: 'XObject', Subtype: 'Image', Width: img.width, Height: img.height, ColorSpace: 'DeviceGray', BitsPerComponent: 8 },\n img.alpha,\n );\n }\n return writer.addStream(dict, img.rgb);\n}\n", "// @ts-check\n/**\n * Paginator \u2014 \u8D70\u67FB\u7D50\u679C\uFF08\u30A2\u30C8\u30E0\u30FB\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u30FB\u30C6\u30FC\u30D6\u30EB\uFF09\u304B\u3089\u5404\u30DA\u30FC\u30B8\u306E\u7E26\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\u3002\n *\n * \u65B9\u91DD: \u547D\u4EE4\u306F\u52D5\u304B\u3055\u305A\u3001\u30DA\u30FC\u30B8\u3054\u3068\u306B\u300C\u3053\u306E y \u7BC4\u56F2\u3092\u63CF\u304F\u300D\u3068\u6C7A\u3081\u308B\u3060\u3051\u306B\u3059\u308B\u3002\n * \u5883\u754C\u306F\u3001\u30A2\u30C8\u30E0\uFF08\u30C6\u30AD\u30B9\u30C8\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u4E0A\u3078\u623B\u3059\u3002\n * `break-before/after: avoid` \u3067\u7D50\u3070\u308C\u305F\u7BB1\u306E\u9593\u306B\u3082\u5883\u754C\u3092\u7F6E\u304B\u305A\u3001\u7F6E\u304D\u305D\u3046\u306A\u3089\u524D\u306E\u7BB1\u306E\u5148\u982D\u307E\u3067\u623B\u3059\u3002\n * \u30C6\u30FC\u30D6\u30EB\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\u306F thead \u3092\u5404\u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3057\u3001\u305D\u306E\u9AD8\u3055\u5206\u3060\u3051\u672C\u6587\u3092\u4E0B\u3052\u308B\u3002\n */\n\n/**\n * @typedef {object} RepeatedHead\n * @property {import('./walker/walk.js').TableInfo} table\n * @property {number} shift \u3053\u306E\u30DA\u30FC\u30B8\u3067 thead \u3092\u63CF\u304F\u4F4D\u7F6E\uFF08\u30DA\u30FC\u30B8\u5148\u982D\u304B\u3089\u306E px \u30AA\u30D5\u30BB\u30C3\u30C8\uFF09\n *\n * @typedef {object} PageRange\n * @property {number} start \u672C\u6587\u306E\u63CF\u304D\u59CB\u3081 y\uFF08\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @property {number} end \u672C\u6587\u306E\u63CF\u304D\u7D42\u308F\u308A y\uFF08\u3053\u306E\u5024\u672A\u6E80\u3092\u63CF\u304F\uFF09\n * @property {RepeatedHead[]} heads \u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead\n * @property {number} headShift \u7E70\u308A\u8FD4\u3057 thead \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u306F\u3053\u306E\u5206\u3060\u3051\u4E0B\u304C\u308B\uFF09\n * @property {RepeatedHead[]} feet \u30DA\u30FC\u30B8\u672B\u5C3E\u3067\u7E70\u308A\u8FD4\u3059 tfoot\uFF08\u8868\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\uFF09\n * @property {number} footShift \u7E70\u308A\u8FD4\u3057 tfoot \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u9818\u57DF\u306F\u3053\u306E\u5206\u3060\u3051\u7E2E\u3080\uFF09\n */\n\n/**\n * @param {import('./walker/walk.js').WalkResult} walk\n * @param {number} pageHeightPx \u672C\u6587\u9818\u57DF\u306E\u9AD8\u3055\uFF08px\uFF09\n * @returns {PageRange[]}\n */\nexport function paginate(walk, pageHeightPx) {\n const EPS_INIT = 0.01;\n const H = pageHeightPx;\n const total = walk.height;\n const atoms = [...walk.atoms].sort((a, b) => a.top - b.top);\n const breaks = [...new Set(walk.breaks)].sort((a, b) => a - b);\n // break-before/after: avoid \u3067\u7D50\u3070\u308C\u305F\u7BB1\u3002\n // \u5883\u754C\u306F\u6B21\u306E\u7BB1\u306E\u300C\u5148\u982D\u300D\u3067\u306F\u306A\u304F\u300C\u6700\u521D\u306E\u884C\u300D\u307E\u3067\u8A31\u305B\u306A\u3044\uFF08line-height \u306E\u534A\u884C\u5206\u3060\u3051\u7BB1\u306E\u4E0A\u7AEF\u3088\u308A\u4E0B\u306B\u6765\u308B\u305F\u3081\uFF09\u3002\n const joins = (walk.joins ?? []).map((j) => {\n const first = atoms.find((a) => a.top >= j.end - EPS_INIT);\n return { start: j.start, limit: first ? Math.max(first.top, j.end) : j.end, pullTo: j.pullTo };\n });\n const EPS = 0.01;\n\n /** @type {PageRange[]} */\n const pages = [];\n let start = 0;\n let guard = 0;\n while (start < total - EPS && guard++ < 10000) {\n // \u3053\u306E\u30DA\u30FC\u30B8\u306E\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead: \u30DA\u30FC\u30B8\u958B\u59CB\u4F4D\u7F6E\u304C\u8868\u306E\u9014\u4E2D\u306B\u3042\u308A\u3001thead \u304C\u65E2\u306B\u524D\u30DA\u30FC\u30B8\u3067\u63CF\u304B\u308C\u3066\u3044\u308B\u8868\n /** @type {RepeatedHead[]} */\n const heads = [];\n let headShift = 0;\n for (const t of walk.tables) {\n if (t.headItems.length && t.headBottom <= start + EPS && start < t.bottom - EPS) {\n heads.push({ table: t, shift: headShift });\n headShift += t.headBottom - t.headTop;\n }\n }\n // tfoot \u306E\u7E70\u308A\u8FD4\u3057\u306F\u300C\u3053\u306E\u30DA\u30FC\u30B8\u3067\u8868\u304C\u7D42\u308F\u3089\u306A\u3044\u300D\u3068\u304D\u3060\u3051\u5FC5\u8981\u3067\u3001\u305D\u308C\u306F end \u306B\u4F9D\u5B58\u3059\u308B\u3002\n // \u307E\u305A tfoot \u7121\u3057\u3067 end \u3092\u6C42\u3081\u3001\u7E70\u308A\u8FD4\u3057\u304C\u5FC5\u8981\u306A\u8868\u304C\u3042\u308C\u3070\u5BB9\u91CF\u3092\u6E1B\u3089\u3057\u3066\u8A08\u7B97\u3057\u76F4\u3059\uFF08\u6570\u56DE\u3067\u53CE\u675F\u3059\u308B\uFF09\u3002\n /** @type {RepeatedHead[]} */\n let feet = [];\n let footShift = 0;\n let end = start;\n for (let pass = 0; pass < 4; pass++) {\n const capacity = Math.max(H - headShift - footShift, H * 0.25); // thead/tfoot \u304C\u7570\u5E38\u306B\u9AD8\u3044\u5834\u5408\u306E\u4E0B\u9650\n end = computeEnd(start, capacity);\n /** @type {RepeatedHead[]} */\n const needed = [];\n let shift = 0;\n for (const t of walk.tables) {\n // \u8868\u304C\u3053\u306E\u30DA\u30FC\u30B8\u306E\u9014\u4E2D\u304B\u3089\u59CB\u307E\u308B\u30FB\u307E\u305F\u306F\u7D9A\u3044\u3066\u3044\u3066\u3001\u304B\u3064\u3053\u306E\u30DA\u30FC\u30B8\u3067\u7D42\u308F\u3089\u306A\u3044\uFF08\u672C\u6765\u306E tfoot \u304C\u6B21\u30DA\u30FC\u30B8\u4EE5\u964D\uFF09\n if (t.footItems.length && t.top < end - EPS && t.footTop >= end - EPS && t.bottom > end + EPS) {\n needed.push({ table: t, shift });\n shift += t.footBottom - t.footTop;\n }\n }\n const same = needed.length === feet.length && needed.every((n, i) => n.table === feet[i]?.table);\n feet = needed;\n footShift = shift;\n if (same) break;\n }\n\n pages.push({ start, end, heads, headShift, feet, footShift });\n start = end;\n }\n if (!pages.length) pages.push({ start: 0, end: Math.max(total, 1), heads: [], headShift: 0, feet: [], footShift: 0 });\n return pages;\n\n /**\n * start \u304B\u3089\u5BB9\u91CF capacity \u306E\u30DA\u30FC\u30B8\u306E\u7D42\u7AEF\u3092\u3001\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u3068\u30A2\u30C8\u30E0\u3092\u8003\u616E\u3057\u3066\u6C7A\u3081\u308B\u3002\n * @param {number} start\n * @param {number} capacity\n */\n function computeEnd(start, capacity) {\n let end = Math.min(start + capacity, total);\n\n // \u5F37\u5236\u6539\u30DA\u30FC\u30B8: (start, end) \u306E\u4E2D\u3067\u6700\u521D\u306E\u3082\u306E\n for (const b of breaks) {\n if (b > start + EPS && b < end - EPS) {\n end = b;\n break;\n }\n }\n\n // \u30A2\u30C8\u30E0\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u5883\u754C\u3092\u4E0A\u3052\u308B\uFF08\u4ED6\u306E\u30A2\u30C8\u30E0\u306B\u9023\u9396\u3059\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u7E70\u308A\u8FD4\u3059\uFF09\n if (end < total - EPS) {\n let moved = true;\n let iter = 0;\n while (moved && iter++ < 1000) {\n moved = false;\n for (const a of atoms) {\n if (a.top >= end) break;\n // \u30DA\u30FC\u30B8\u5BB9\u91CF\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\u306F\u3069\u3053\u304B\u3067\u5207\u3089\u3056\u308B\u3092\u5F97\u306A\u3044\u306E\u3067\u7121\u8996\u3059\u308B\n if (a.bottom - a.top > capacity) continue;\n if (a.top < end - EPS && a.bottom > end + EPS && a.top > start + EPS) {\n end = a.top;\n moved = true;\n }\n }\n // break-before/after: avoid \u2014 \u7D50\u3070\u308C\u305F 2 \u3064\u306E\u7BB1\u306E\u9593\u306B\u5883\u754C\u304C\u3042\u308C\u3070\u3001\u524D\u306E\u7BB1\u306E\u5148\u982D\u307E\u3067\u623B\u3059\n for (const j of joins) {\n // \u7D50\u3093\u3060\u7BC4\u56F2\u304C\u30DA\u30FC\u30B8\u306B\u53CE\u307E\u3089\u306A\u3044\u306A\u3089\u8AE6\u3081\u308B\uFF08\u623B\u3057\u3066\u3082\u540C\u3058\u4F4D\u7F6E\u3067\u5207\u308B\u3053\u3068\u306B\u306A\u308B\uFF09\n if (j.limit - j.pullTo > capacity) continue;\n // \u623B\u3057\u5148\u304C\u30DA\u30FC\u30B8\u5148\u982D\u4EE5\u524D\u3060\u3068\u7A7A\u30DA\u30FC\u30B8\u306B\u306A\u308B\u306E\u3067\u8AE6\u3081\u308B\n if (j.pullTo <= start + EPS) continue;\n if (end >= j.start - EPS && end <= j.limit + EPS && end > j.pullTo + EPS) {\n end = j.pullTo;\n moved = true;\n }\n }\n }\n // \u4E0A\u3052\u904E\u304E\u3066\u7A7A\u30DA\u30FC\u30B8\u306B\u306A\u308B\u5834\u5408\uFF08\u30DA\u30FC\u30B8\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\uFF09\u306F\u5BB9\u91CF\u3044\u3063\u3071\u3044\u3067\u5207\u308B\n if (end <= start + EPS) end = Math.min(start + capacity, total);\n }\n return end;\n }\n}\n", "// @ts-check\n/**\n * \u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\uFF08ShadingType 2\uFF09\u306E\u751F\u6210\u3002\n *\n * \u8272\u306F Type 2\uFF08\u6307\u6570\u88DC\u9593\uFF09\u95A2\u6570\u3092\u8272\u6B62\u3081\u306E\u6570\u3060\u3051\u4F5C\u308A\u3001Type 3\uFF08\u7D99\u304E\u5408\u308F\u305B\uFF09\u3067\u3064\u306A\u3050\u3002\n * \u8272\u6B62\u3081\u3054\u3068\u306B\u30A2\u30EB\u30D5\u30A1\u304C\u5909\u308F\u308B\u5834\u5408\u306F\u3001\u540C\u3058\u5F62\u306E\u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\n * \u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u306B\u3057\u3066\u518D\u73FE\u3059\u308B\uFF08PDF \u306B\u306F\u8272\u3068\u30A2\u30EB\u30D5\u30A1\u3092\u540C\u6642\u306B\u6301\u3064\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u304C\u7121\u3044\u305F\u3081\uFF09\u3002\n */\nimport { Name } from './writer.js';\n\n/**\n * @typedef {import('../walker/gradient.js').GradientStop} GradientStop\n */\n\n/**\n * \u8272\u6B62\u3081\u304B\u3089 Type 2/3 \u95A2\u6570\u3092\u4F5C\u308B\u3002\n * @param {import('./writer.js').PdfWriter} writer\n * @param {GradientStop[]} stops\n * @param {(c: import('../units.js').Rgba) => number[]} pick \u8272\u304B\u3089\u6210\u5206\u914D\u5217\u3092\u53D6\u308A\u51FA\u3059\uFF08RGB \u304B \u30B0\u30EC\u30FC\uFF09\n * @returns {import('./writer.js').Ref}\n */\nfunction buildFunction(writer, stops, pick) {\n const first = /** @type {GradientStop} */ (stops[0]);\n const last = /** @type {GradientStop} */ (stops[stops.length - 1]);\n const span = last.t - first.t;\n // \u5168\u533A\u9593\u304C 1 \u70B9\u306B\u6F70\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u5358\u8272\n if (!(span > 0)) {\n return writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(first.color), C1: pick(last.color), N: 1 });\n }\n if (stops.length === 2) {\n return writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(first.color), C1: pick(last.color), N: 1 });\n }\n /** @type {import('./writer.js').PdfValue[]} */\n const functions = [];\n /** @type {number[]} */\n const bounds = [];\n /** @type {number[]} */\n const encode = [];\n for (let i = 0; i < stops.length - 1; i++) {\n const a = /** @type {GradientStop} */ (stops[i]);\n const b = /** @type {GradientStop} */ (stops[i + 1]);\n functions.push(writer.add({ FunctionType: 2, Domain: [0, 1], C0: pick(a.color), C1: pick(b.color), N: 1 }));\n encode.push(0, 1);\n if (i > 0) bounds.push((a.t - first.t) / span);\n }\n return writer.add({ FunctionType: 3, Domain: [0, 1], Functions: functions, Bounds: bounds, Encode: encode });\n}\n\n/**\n * \u8EF8\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u306E\u8F9E\u66F8\u3092\u4F5C\u308B\u3002\u5EA7\u6A19\u306F PDF \u5EA7\u6A19\uFF08pt\uFF09\u3002\n *\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{x0: number, y0: number, x1: number, y1: number}} coords\n * @param {GradientStop[]} stops\n * @param {'rgb'|'gray'} space\n * @returns {import('./writer.js').Ref}\n */\nexport function buildAxialShading(writer, coords, stops, space) {\n const pick =\n space === 'rgb'\n ? (/** @type {import('../units.js').Rgba} */ c) => [c.r, c.g, c.b]\n : (/** @type {import('../units.js').Rgba} */ c) => [c.a];\n return writer.add({\n ShadingType: 2,\n ColorSpace: new Name(space === 'rgb' ? 'DeviceRGB' : 'DeviceGray'),\n Coords: [coords.x0, coords.y0, coords.x1, coords.y1],\n Function: buildFunction(writer, stops, pick),\n Extend: [true, true],\n });\n}\n\n/**\n * \u8272\u6B62\u3081\u306E\u30A2\u30EB\u30D5\u30A1\u304C\u4E00\u5B9A\u306A\u3089\u305D\u306E\u5024\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 null\u3002\n * @param {GradientStop[]} stops\n * @returns {number|null}\n */\nexport function uniformAlpha(stops) {\n const a = /** @type {GradientStop} */ (stops[0]).color.a;\n return stops.every((s) => Math.abs(s.color.a - a) < 0.002) ? a : null;\n}\n\n/**\n * \u30A2\u30EB\u30D5\u30A1\u304C\u5909\u5316\u3059\u308B\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u7528\u306E\u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u3092\u4F5C\u308B\u3002\n * \u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB\u306E\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u63CF\u304F\u30D5\u30A9\u30FC\u30E0 XObject \u3092 /SMask \u306B\u5165\u308C\u305F ExtGState \u3092\u8FD4\u3059\u3002\n *\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{x0: number, y0: number, x1: number, y1: number}} coords PDF \u5EA7\u6A19\n * @param {GradientStop[]} stops\n * @param {{x: number, y: number, w: number, h: number}} bbox \u30DE\u30B9\u30AF\u3092\u5857\u308B\u7BC4\u56F2\uFF08PDF \u5EA7\u6A19\uFF09\n * @param {number} groupAlpha \u8981\u7D20\u304B\u3089\u7D99\u627F\u3057\u305F\u4E0D\u900F\u660E\u5EA6\uFF08\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u5168\u4F53\u306B\u639B\u304B\u308B\uFF09\n * @returns {Promise<import('./writer.js').Ref>} ExtGState \u306E\u53C2\u7167\n */\nexport async function buildAlphaMaskGState(writer, coords, stops, bbox, groupAlpha) {\n const scaled = groupAlpha === 1 ? stops : stops.map((s) => ({ t: s.t, color: { ...s.color, a: s.color.a * groupAlpha } }));\n const shading = buildAxialShading(writer, coords, scaled, 'gray');\n const content = new TextEncoder().encode(`q ${bbox.x} ${bbox.y} ${bbox.w} ${bbox.h} re W n /Sh0 sh Q\\n`);\n const form = await writer.addStream(\n {\n Type: new Name('XObject'),\n Subtype: new Name('Form'),\n BBox: [bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h],\n Group: { Type: new Name('Group'), S: new Name('Transparency'), CS: new Name('DeviceGray') },\n Resources: { Shading: { Sh0: shading } },\n },\n content,\n );\n return writer.add({\n Type: new Name('ExtGState'),\n SMask: { Type: new Name('Mask'), S: new Name('Luminosity'), G: form, BC: [0] },\n ca: 1,\n CA: 1,\n });\n}\n", "// @ts-check\n/**\n * \u3057\u304A\u308A\uFF08/Outlines\uFF09\u3068\u30EA\u30F3\u30AF\u6CE8\u91C8\uFF08/Annots\uFF09\u306E\u7D44\u307F\u7ACB\u3066\u3002\n */\nimport { Name, pdfString } from './writer.js';\n\n/**\n * @typedef {{page: number, x: number, y: number}} DestPoint \u98DB\u3073\u5148\uFF080 \u59CB\u307E\u308A\u306E\u30DA\u30FC\u30B8\u756A\u53F7\u3068\u3001\u305D\u306E\u30DA\u30FC\u30B8\u306E PDF \u5EA7\u6A19\uFF09\n */\n\n/**\n * \u30EA\u30F3\u30AF\u6CE8\u91C8\u3092\u4F5C\u308B\u3002\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{x: number, y: number, w: number, h: number}} rect PDF \u5EA7\u6A19\uFF08\u5DE6\u4E0B\u539F\u70B9\uFF09\n * @param {{uri: string}|{dest: import('./writer.js').PdfValue}} action\n * @returns {import('./writer.js').Ref}\n */\nexport function buildLinkAnnot(writer, rect, action) {\n /** @type {{[key: string]: import('./writer.js').PdfValue}} */\n const annot = {\n Type: new Name('Annot'),\n Subtype: new Name('Link'),\n Rect: [rect.x, rect.y, rect.x + rect.w, rect.y + rect.h],\n // \u65E2\u5B9A\u306E\u67A0\u7DDA\u3092\u6D88\u3059\uFF08\u591A\u304F\u306E\u30D3\u30E5\u30FC\u30A2\u306F\u63CF\u304B\u306A\u3044\u304C\u3001\u4ED5\u69D8\u4E0A\u306F\u6B8B\u308B\uFF09\n Border: [0, 0, 0],\n F: 4, // Print\n };\n if ('uri' in action) annot.A = { S: new Name('URI'), URI: pdfString(action.uri) };\n else annot.Dest = action.dest;\n return writer.add(annot);\n}\n\n/**\n * \u898B\u51FA\u3057\u306E\u4E26\u3073\u304B\u3089\u3001\u30EC\u30D9\u30EB\u306B\u5FDC\u3058\u305F\u6728\u69CB\u9020\u306E\u3057\u304A\u308A\u3092\u4F5C\u308A\u3001\u30AB\u30BF\u30ED\u30B0\u306B\u5165\u308C\u308B\u53C2\u7167\u3092\u8FD4\u3059\u3002\n * \u98DB\u3073\u5148\u304C\u89E3\u6C7A\u3067\u304D\u306A\u3044\u898B\u51FA\u3057\u306F\u98DB\u3070\u3059\u3002\n *\n * @param {import('./writer.js').PdfWriter} writer\n * @param {{level: number, text: string, dest: import('./writer.js').PdfValue|null}[]} entries\n * @returns {import('./writer.js').Ref|null}\n */\nexport function buildOutline(writer, entries) {\n const usable = entries.filter((e) => e.dest !== null);\n if (!usable.length) return null;\n\n /**\n * @typedef {{level: number, text: string, dest: import('./writer.js').PdfValue, children: Node[], ref: import('./writer.js').Ref}} Node\n */\n /** @type {Node[]} */\n const roots = [];\n /** @type {Node[]} \u73FE\u5728\u306E\u7956\u5148\u30C1\u30A7\u30FC\u30F3 */\n const stack = [];\n for (const e of usable) {\n /** @type {Node} */\n const node = { level: e.level, text: e.text, dest: /** @type {import('./writer.js').PdfValue} */ (e.dest), children: [], ref: writer.reserve() };\n while (stack.length && /** @type {Node} */ (stack[stack.length - 1]).level >= node.level) stack.pop();\n const parent = stack[stack.length - 1];\n if (parent) parent.children.push(node);\n else roots.push(node);\n stack.push(node);\n }\n\n const outlineRef = writer.reserve();\n\n /**\n * \u5144\u5F1F\u306E\u4E26\u3073\u3092\u66F8\u304D\u51FA\u3057\u3001\u958B\u3044\u3066\u3044\u308B\u9805\u76EE\u6570\uFF08Count \u7528\uFF09\u3092\u8FD4\u3059\u3002\n * @param {Node[]} nodes\n * @param {import('./writer.js').Ref} parentRef\n * @returns {number}\n */\n const emit = (nodes, parentRef) => {\n let total = 0;\n nodes.forEach((node, i) => {\n const childCount = emit(node.children, node.ref);\n /** @type {{[key: string]: import('./writer.js').PdfValue}} */\n const dict = {\n Title: pdfString(node.text),\n Parent: parentRef,\n Dest: node.dest,\n };\n const prev = nodes[i - 1];\n const next = nodes[i + 1];\n if (prev) dict.Prev = prev.ref;\n if (next) dict.Next = next.ref;\n if (node.children.length) {\n dict.First = /** @type {Node} */ (node.children[0]).ref;\n dict.Last = /** @type {Node} */ (node.children[node.children.length - 1]).ref;\n dict.Count = childCount; // \u6B63\u306E\u5024 = \u65E2\u5B9A\u3067\u958B\u3044\u305F\u72B6\u614B\n }\n writer.set(node.ref, dict);\n total += 1 + childCount;\n });\n return total;\n };\n\n const count = emit(roots, outlineRef);\n writer.set(outlineRef, {\n Type: new Name('Outlines'),\n First: /** @type {Node} */ (roots[0]).ref,\n Last: /** @type {Node} */ (roots[roots.length - 1]).ref,\n Count: count,\n });\n return outlineRef;\n}\n", "// @ts-check\n/**\n * DisplayList \u3092\u7528\u7D19\u306B\u5272\u308A\u4ED8\u3051\u3001PDF \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * \u30DA\u30FC\u30B8\u7BC4\u56F2\u306E\u6C7A\u5B9A\u306F paginate.js\u3001\u3053\u3053\u3067\u306F\u5404\u30DA\u30FC\u30B8\u306B\u300C\u672C\u6587\uFF08\u7BC4\u56F2\u6307\u5B9A\uFF09\u30FB\u7E70\u308A\u8FD4\u3057 thead\u30FB\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30C3\u30BF\u30FC\u300D\u3092\u63CF\u304F\u3002\n */\nimport { PdfWriter, pdfString, pdfDate, Name } from './pdf/writer.js';\nimport { ContentStream } from './pdf/content.js';\nimport { EmbeddedFont, hex4 } from './font/cid.js';\nimport { embedImage } from './pdf/image.js';\nimport { PX_TO_PT, PAGE_SIZES, lengthToPt, num } from './units.js';\nimport { paginate } from './paginate.js';\nimport { releasePixels, loadImage } from './walker/image.js';\nimport { buildAxialShading, uniformAlpha, buildAlphaMaskGState } from './pdf/shading.js';\nimport { buildLinkAnnot, buildOutline } from './pdf/outline.js';\n\n/**\n * @typedef {object} PageGeometry\n * @property {number} width pt\n * @property {number} height pt\n * @property {number} top pt \u4E0A\u4F59\u767D\n * @property {number} right pt\n * @property {number} bottom pt \u4E0B\u4F59\u767D\n * @property {number} left pt\n */\n\n/**\n * @typedef {object} PageDecoration \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\uFF08\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u6E08\u307F\u306E\u8D70\u67FB\u7D50\u679C\uFF09\n * @property {number} heightPx\n * @property {(pageNumber: number, totalPages: number) => Promise<import('./walker/walk.js').WalkResult>} render\n */\n\n/**\n * @param {import('./index.js').PageOptions|undefined} page\n * @returns {PageGeometry}\n */\nexport function resolvePage(page = {}) {\n const sizeOpt = page.size ?? 'A4';\n let width;\n let height;\n if (typeof sizeOpt === 'string') {\n const s = PAGE_SIZES[sizeOpt];\n if (!s) throw new Error(`Unknown page size \"${sizeOpt}\". Use one of ${Object.keys(PAGE_SIZES).join(', ')} or {width, height}.`);\n width = s.width;\n height = s.height;\n } else {\n width = lengthToPt(sizeOpt.width);\n height = lengthToPt(sizeOpt.height);\n }\n if ((page.orientation ?? 'portrait') === 'landscape' && width < height) [width, height] = [height, width];\n\n const m = page.margin ?? '15mm';\n const margins =\n typeof m === 'string'\n ? { top: lengthToPt(m), right: lengthToPt(m), bottom: lengthToPt(m), left: lengthToPt(m) }\n : { top: lengthToPt(m.top), right: lengthToPt(m.right), bottom: lengthToPt(m.bottom), left: lengthToPt(m.left) };\n return { width, height, ...margins };\n}\n\n/**\n * @param {import('./walker/walk.js').WalkResult} body\n * @param {PageGeometry} geo\n * @param {{compress: boolean, metadata?: import('./index.js').PdfMetadata, header?: PageDecoration|null, footer?: PageDecoration|null, pacer?: import('./pacer.js').Pacer, progress?: (p: import('./index.js').ConversionProgress) => void, warn?: (w: import('./index.js').ConversionWarning) => void, links?: boolean, outline?: boolean}} opts\n * @returns {Promise<Uint8Array>}\n */\nexport async function buildPdf(body, geo, opts) {\n const writer = new PdfWriter({ compress: opts.compress });\n const headerPt = (opts.header?.heightPx ?? 0) * PX_TO_PT;\n const footerPt = (opts.footer?.heightPx ?? 0) * PX_TO_PT;\n const contentW = geo.width - geo.left - geo.right;\n const contentTop = geo.height - geo.top - headerPt; // \u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF\uFF08PDF \u5EA7\u6A19\uFF09\n const contentH = geo.height - geo.top - geo.bottom - headerPt - footerPt;\n if (contentH <= 0) throw new Error('Page content area is empty: margins + header + footer exceed the page height');\n const contentHpx = contentH / PX_TO_PT;\n\n // 1. \u30DA\u30FC\u30B8\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\n const ranges = paginate(body, contentHpx);\n const totalPages = ranges.length;\n\n // 2. \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u3092\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u3057\u3066\u8D70\u67FB\u7D50\u679C\u3092\u5F97\u308B\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const headers = [];\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const footers = [];\n for (let p = 0; p < totalPages; p++) {\n headers.push(opts.header ? await opts.header.render(p + 1, totalPages) : null);\n footers.push(opts.footer ? await opts.footer.render(p + 1, totalPages) : null);\n }\n\n // 3. \u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\u306E\u4F7F\u7528\u3092\u96C6\u3081\u308B\n /** @type {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} */\n const fonts = new Map();\n /** @type {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} */\n const images = new Map();\n const collect = (/** @type {import('./walker/walk.js').DisplayItem[]} */ list) => {\n for (const it of list) {\n if (it.type === 'text') {\n let ef = fonts.get(it.font);\n if (!ef) {\n ef = new EmbeddedFont(it.font.parsed, `F${fonts.size + 1}`);\n fonts.set(it.font, ef);\n }\n for (const g of it.glyphs) ef.addGlyph(g.gid, g.cp);\n } else if (it.type === 'image') {\n if (!images.has(it.image.key)) images.set(it.image.key, { name: `Im${images.size + 1}`, image: it.image });\n } else if (it.type === 'group' || it.type === 'clip') {\n collect(it.items);\n }\n }\n };\n collect(body.items);\n for (const w of [...headers, ...footers]) if (w) collect(w.items);\n for (const ef of fonts.values()) ef.finalize();\n\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const fontDict = {};\n for (const ef of fonts.values()) fontDict[ef.resourceName] = await ef.embed(writer);\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const xobjDict = {};\n for (const im of images.values()) {\n let img = im.image;\n // \u4E26\u884C\u3057\u3066\u8D70\u308B\u5225\u306E\u5909\u63DB\u304C\u5148\u306B\u89E3\u653E\u3057\u3066\u3044\u305F\u5834\u5408\u306F\u8AAD\u307F\u76F4\u3059\n if (!img.jpeg && !img.rgb) {\n const again = await loadImage(img.key, opts.warn ?? (() => {}));\n if (!again) continue;\n img = again;\n }\n xobjDict[im.name] = await embedImage(writer, img);\n // \u57CB\u3081\u8FBC\u307F\u304C\u6E08\u3081\u3070\u30D4\u30AF\u30BB\u30EB\u30C7\u30FC\u30BF\u306F\u4E0D\u8981\u3002\u5927\u304D\u306A\u6587\u66F8\u306E\u30D4\u30FC\u30AF\u4F7F\u7528\u91CF\u3092\u6291\u3048\u308B\n releasePixels(img);\n if (opts.pacer) await opts.pacer();\n }\n\n // ExtGState\uFF08\u900F\u660E\u5EA6\uFF09\n /** @type {Map<string, string>} */\n const gstates = new Map();\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const gstateDict = {};\n const gsName = (/** @type {number} */ a, /** @type {number} */ strokeA = a) => {\n const key = `${num(a)}/${num(strokeA)}`;\n let name = gstates.get(key);\n if (!name) {\n name = `GS${gstates.size + 1}`;\n gstates.set(key, name);\n gstateDict[name] = writer.add({ Type: 'ExtGState', ca: a, CA: strokeA });\n }\n return name;\n };\n\n // Shading\uFF08linear-gradient\uFF09\u3002\u5EA7\u6A19\u306F\u7BB1\u30ED\u30FC\u30AB\u30EB\u306E CSS px \u3067\u6301\u3061\u3001\u63CF\u753B\u6642\u306B cm \u3067\u7528\u7D19\u5EA7\u6A19\u3078\u5199\u3059\u3002\n // \u3053\u3046\u3059\u308B\u3068\u30DA\u30FC\u30B8\u3054\u3068\u306B\u4F5C\u308A\u76F4\u3055\u305A\u306B\u6E08\u3080\u3002\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const shadingDict = {};\n /** @type {Map<import('./walker/walk.js').DisplayItem, {sh: string, gs: string|null}>} */\n const gradients = new Map();\n /** @param {import('./walker/walk.js').DisplayItem[]} list */\n const prepareGradients = async (list) => {\n for (const it of list) {\n if (it.type === 'gradient') {\n const name = `Sh${Object.keys(shadingDict).length + 1}`;\n shadingDict[name] = buildAxialShading(writer, it.gradient, it.gradient.stops, 'rgb');\n const alpha = uniformAlpha(it.gradient.stops);\n let gs = null;\n if (alpha === null) {\n // \u8272\u6B62\u3081\u3054\u3068\u306B\u30A2\u30EB\u30D5\u30A1\u304C\u5909\u308F\u308B \u2192 \u8F1D\u5EA6\u30BD\u30D5\u30C8\u30DE\u30B9\u30AF\u3067\u518D\u73FE\u3059\u308B\n const gsRef = await buildAlphaMaskGState(writer, it.gradient, it.gradient.stops, { x: 0, y: 0, w: it.box.w, h: it.box.h }, it.alpha);\n gs = `GM${gradients.size + 1}`;\n gstateDict[gs] = gsRef;\n }\n gradients.set(it, { sh: name, gs });\n } else if (it.type === 'group' || it.type === 'clip') {\n await prepareGradients(it.items);\n }\n }\n };\n await prepareGradients(body.items);\n for (const w of [...headers, ...footers]) if (w) await prepareGradients(w.items);\n\n const pagesRef = writer.reserve();\n /** @type {import('./pdf/writer.js').Ref[]} */\n const pageRefs = [];\n // \u30EA\u30F3\u30AF\u306E\u98DB\u3073\u5148\u306F\u524D\u5F8C\u3069\u3061\u3089\u306E\u30DA\u30FC\u30B8\u306B\u3082\u306A\u308A\u3046\u308B\u306E\u3067\u3001\u30DA\u30FC\u30B8\u53C2\u7167\u3092\u5148\u306B\u78BA\u4FDD\u3057\u3066\u304A\u304F\n const pageSlots = Array.from({ length: totalPages }, () => writer.reserve());\n /** @param {number} i @returns {import('./pdf/writer.js').Ref} */\n const slotOf = (i) => /** @type {import('./pdf/writer.js').Ref} */ (pageSlots[i]);\n\n /**\n * \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y \u304C\u8F09\u308B\u30DA\u30FC\u30B8\u3068\u3001\u305D\u306E\u30DA\u30FC\u30B8\u3067\u306E PDF \u5EA7\u6A19\u3092\u6C42\u3081\u308B\u3002\n * @param {number} docY\n * @returns {{page: number, x: number, y: number}|null}\n */\n const locate = (docY) => {\n for (let i = 0; i < totalPages; i++) {\n const r = /** @type {import('./paginate.js').PageRange} */ (ranges[i]);\n if (docY >= r.start - 0.01 && (docY < r.end - 0.01 || i === totalPages - 1)) {\n const top = contentTop - r.headShift * PX_TO_PT;\n return { page: i, x: geo.left, y: top - (docY - r.start) * PX_TO_PT };\n }\n }\n return null;\n };\n\n // 4. \u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\n opts.progress?.({ phase: 'layout', totalPages });\n for (let p = 0; p < totalPages; p++) {\n if (opts.pacer) await opts.pacer();\n opts.progress?.({ phase: 'page', page: p + 1, totalPages });\n const range = /** @type {import('./paginate.js').PageRange} */ (ranges[p]);\n const cs = new ContentStream();\n const painter = new Painter(cs, geo, fonts, images, gsName, gradients);\n\n // \u672C\u6587: \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = range.start \u304C\u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF + \u7E70\u308A\u8FD4\u3057 thead \u306E\u9AD8\u3055 \u306B\u6765\u308B\n const bodyShiftPt = range.headShift * PX_TO_PT;\n const footShiftPt = range.footShift * PX_TO_PT;\n cs.save();\n cs.rect(geo.left, contentTop - contentH + footShiftPt, contentW, contentH - bodyShiftPt - footShiftPt).clip();\n painter.setOrigin(contentTop - bodyShiftPt, range.start);\n painter.render(body.items, range);\n cs.restore();\n\n // \u7E70\u308A\u8FD4\u3057 tfoot: \u30D6\u30E9\u30A6\u30B6\u306E\u5370\u5237\u3068\u540C\u3058\u304F\u3001\u3053\u306E\u30DA\u30FC\u30B8\u306B\u8F09\u3063\u305F\u6700\u5F8C\u306E\u884C\u306E\u76F4\u4E0B\u306B\u7F6E\u304F\n const bodyEndPt = contentTop - bodyShiftPt - (range.end - range.start) * PX_TO_PT;\n for (const f of range.feet) {\n const fPt = (f.table.footBottom - f.table.footTop) * PX_TO_PT;\n const bottomPt = bodyEndPt - f.shift * PX_TO_PT - fPt;\n cs.save();\n cs.rect(geo.left, bottomPt, contentW, fPt).clip();\n painter.setOrigin(bottomPt + fPt, f.table.footTop);\n painter.render(f.table.footItems);\n cs.restore();\n }\n\n // \u7E70\u308A\u8FD4\u3057 thead\n for (const h of range.heads) {\n cs.save();\n const hPt = (h.table.headBottom - h.table.headTop) * PX_TO_PT;\n cs.rect(geo.left, contentTop - h.shift * PX_TO_PT - hPt, contentW, hPt).clip();\n painter.setOrigin(contentTop - h.shift * PX_TO_PT, h.table.headTop);\n painter.render(h.table.headItems);\n cs.restore();\n }\n\n // \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\n const header = headers[p];\n if (header) {\n cs.save();\n cs.rect(geo.left, geo.height - geo.top - headerPt, contentW, headerPt).clip();\n painter.setOrigin(geo.height - geo.top, 0);\n painter.render(header.items);\n cs.restore();\n }\n const footer = footers[p];\n if (footer) {\n cs.save();\n cs.rect(geo.left, geo.bottom, contentW, footerPt).clip();\n painter.setOrigin(geo.bottom + footerPt, 0);\n painter.render(footer.items);\n cs.restore();\n }\n\n // \u30EA\u30F3\u30AF\u6CE8\u91C8\u3002\u30DA\u30FC\u30B8\u7BC4\u56F2\u3067\u5207\u308A\u53D6\u3063\u3066\u304B\u3089\u7528\u7D19\u5EA7\u6A19\u3078\u5199\u3059\n /** @type {import('./pdf/writer.js').PdfValue[]} */\n const annots = [];\n if (opts.links !== false) {\n /**\n * @param {import('./walker/walk.js').LinkRect[]} list\n * @param {number} pdfTop \u3053\u306E\u5E2F\u306E\u4E0A\u7AEF\uFF08PDF \u5EA7\u6A19\uFF09\n * @param {number} docTop \u305D\u306E\u4F4D\u7F6E\u306B\u5BFE\u5FDC\u3059\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y\n * @param {number} docEnd \u3053\u306E\u5E2F\u306B\u51FA\u305B\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y \u306E\u7D42\u308F\u308A\n */\n const addLinks = (list, pdfTop, docTop, docEnd) => {\n for (const link of list) {\n const y0 = Math.max(link.y, docTop);\n const y1 = Math.min(link.y + link.h, docEnd);\n if (y1 - y0 <= 0.01) continue;\n const rect = {\n x: geo.left + link.x * PX_TO_PT,\n y: pdfTop - (y1 - docTop) * PX_TO_PT,\n w: link.w * PX_TO_PT,\n h: (y1 - y0) * PX_TO_PT,\n };\n if (link.fragment === null) {\n annots.push(buildLinkAnnot(writer, rect, { uri: link.href }));\n continue;\n }\n const targetY = body.anchors?.get(link.fragment);\n if (targetY === undefined) continue; // \u98DB\u3073\u5148\u304C\u7121\u3044\u30EA\u30F3\u30AF\u306F\u6CE8\u91C8\u306B\u3057\u306A\u3044\n const at = locate(targetY);\n if (!at) continue;\n annots.push(buildLinkAnnot(writer, rect, { dest: [slotOf(at.page), new Name('XYZ'), at.x, at.y, null] }));\n }\n };\n addLinks(body.links ?? [], contentTop - bodyShiftPt, range.start, range.end);\n if (header) addLinks(header.links ?? [], geo.height - geo.top, 0, headerPt / PX_TO_PT);\n if (footer) addLinks(footer.links ?? [], geo.bottom + footerPt, 0, footerPt / PX_TO_PT);\n }\n\n const contentRef = await writer.addStream({}, cs.toBytes());\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const pageDict = {\n Type: 'Page',\n Parent: pagesRef,\n MediaBox: [0, 0, geo.width, geo.height],\n Resources: {\n Font: fontDict,\n XObject: xobjDict,\n ExtGState: gstateDict,\n Shading: shadingDict,\n ProcSet: [new Name('PDF'), new Name('Text'), new Name('ImageC')],\n },\n Contents: contentRef,\n };\n if (annots.length) pageDict.Annots = annots;\n const slot = slotOf(p);\n writer.set(slot, pageDict);\n pageRefs.push(slot);\n }\n\n writer.set(pagesRef, { Type: 'Pages', Kids: pageRefs, Count: pageRefs.length });\n\n // \u3057\u304A\u308A: \u898B\u51FA\u3057\u304B\u3089\u6728\u3092\u4F5C\u308B\n let outlineRef = null;\n if (opts.outline) {\n outlineRef = buildOutline(\n writer,\n (body.headings ?? []).map((h) => {\n const at = locate(h.y);\n return { level: h.level, text: h.text, dest: at ? [slotOf(at.page), new Name('XYZ'), at.x, at.y, null] : null };\n }),\n );\n }\n\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const catalogDict = { Type: 'Catalog', Pages: pagesRef };\n if (outlineRef) {\n catalogDict.Outlines = outlineRef;\n catalogDict.PageMode = new Name('UseOutlines');\n }\n const catalog = writer.add(catalogDict);\n\n const md = opts.metadata ?? {};\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const info = {\n Producer: pdfString('receipt-html-to-pdf'),\n Creator: pdfString(md.creator ?? 'receipt-html-to-pdf'),\n CreationDate: pdfDate(md.creationDate ?? new Date()),\n };\n if (md.title) info.Title = pdfString(md.title);\n if (md.author) info.Author = pdfString(md.author);\n if (md.subject) info.Subject = pdfString(md.subject);\n if (md.keywords) info.Keywords = pdfString(md.keywords);\n const infoRef = writer.add(info);\n\n return writer.build(catalog, infoRef);\n}\n\n/**\n * \u547D\u4EE4\u304C\u30DA\u30FC\u30B8\u7BC4\u56F2 [start, end) \u306B\u5C5E\u3059\u308B\u304B\u3002\n * \u30C6\u30AD\u30B9\u30C8\u306F\u884C\u304C\u5206\u5272\u3055\u308C\u306A\u3044\u524D\u63D0\u3067\u884C\u306E\u4E2D\u5FC3\u4F4D\u7F6E\u3067\u5224\u5B9A\u3057\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\u3001\n * \u77E9\u5F62\u30FB\u7DDA\u30FB\u753B\u50CF\u30FB\u30B0\u30EB\u30FC\u30D7\u306F\u7BC4\u56F2\u3068\u91CD\u306A\u308C\u3070\u542B\u3081\u308B\uFF08\u898B\u3048\u306A\u3044\u90E8\u5206\u306F\u30AF\u30EA\u30C3\u30D7\u3055\u308C\u308B\uFF09\u3002\n * @param {import('./walker/walk.js').DisplayItem} it\n * @param {{start: number, end: number}} range\n */\nfunction inRange(it, range) {\n const EPS = 0.01;\n if (it.type === 'text') {\n const mid = (it.top + it.bottom) / 2;\n return mid >= range.start - EPS && mid < range.end - EPS;\n }\n return itemBottom(it) > range.start + EPS && itemTop(it) < range.end - EPS;\n}\n\n/**\n * DisplayList \u3092 PDF \u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u3078\u63CF\u304F\u3002\n * setOrigin() \u3067\u300C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = docY \u3092 PDF \u306E y = pdfY \u306B\u7F6E\u304F\u300D\u5BFE\u5FDC\u3092\u5207\u308A\u66FF\u3048\u308B\u3002\n */\nclass Painter {\n /**\n * @param {ContentStream} cs\n * @param {PageGeometry} geo\n * @param {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} fonts\n * @param {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} images\n * @param {(alpha: number, strokeAlpha?: number) => string} gsName\n * @param {Map<import('./walker/walk.js').DisplayItem, {sh: string, gs: string|null}>} gradients\n */\n constructor(cs, geo, fonts, images, gsName, gradients) {\n this.cs = cs;\n this.geo = geo;\n this.fonts = fonts;\n this.images = images;\n this.gsName = gsName;\n this.gradients = gradients;\n this.pdfTop = geo.height - geo.top;\n this.docTop = 0;\n this.curAlpha = 1;\n }\n\n /**\n * @param {number} pdfY PDF \u5EA7\u6A19\uFF08pt, \u4E0A\u5411\u304D\uFF09\n * @param {number} docY \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08px, \u4E0B\u5411\u304D\uFF09\n */\n setOrigin(pdfY, docY) {\n this.pdfTop = pdfY;\n this.docTop = docY;\n }\n\n /** @param {number} x */\n X(x) {\n return this.geo.left + x * PX_TO_PT;\n }\n\n /** @param {number} y */\n Y(y) {\n return this.pdfTop - (y - this.docTop) * PX_TO_PT;\n }\n\n /** @param {number} a */\n setAlpha(a) {\n if (Math.abs(a - this.curAlpha) < 0.001) return;\n this.cs.setGState(this.gsName(a));\n this.curAlpha = a;\n }\n\n /** @param {import('./walker/walk.js').Radius|undefined} r */\n radiusPt(r) {\n return /** @type {[number, number, number, number]} */ ((r ?? [0, 0, 0, 0]).map((v) => v * PX_TO_PT));\n }\n\n /** @param {import('./walker/walk.js').Box} b */\n clipBox(b) {\n const cs = this.cs;\n if (b.radius) cs.roundedRect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT, this.radiusPt(b.radius));\n else cs.rect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT);\n cs.clip();\n }\n\n /**\n * @param {import('./walker/walk.js').DisplayItem[]} list\n * @param {{start: number, end: number}} [range] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u7BC4\u56F2\u306B\u5C5E\u3059\u308B\u547D\u4EE4\u3060\u3051\u3092\u63CF\u304F\uFF08\u5B50\u30B0\u30EB\u30FC\u30D7\u306B\u3082\u9069\u7528\uFF09\n */\n render(list, range) {\n const cs = this.cs;\n for (const it of list) {\n if (range && !inRange(it, range)) continue;\n if (it.type === 'rect') {\n if (it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n if (it.radius) cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).fill();\n else cs.fillRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'line') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.moveTo(this.X(it.x1), this.Y(it.y1)).lineTo(this.X(it.x2), this.Y(it.y2)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'stroke-rrect') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'path') {\n if (!it.segs.length) continue;\n const [a, b2, c, d, e, f] = it.matrix;\n // \u30E6\u30FC\u30B6\u30FC\u5358\u4F4D \u2192 \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px \u2192 PDF pt\uFF08y \u53CD\u8EE2\uFF09\u3092 1 \u3064\u306E\u884C\u5217\u306B\u307E\u3068\u3081\u308B\n const S = PX_TO_PT;\n const tx = this.geo.left;\n const ty = this.pdfTop + this.docTop * S;\n cs.save();\n cs.transform(S * a, -S * b2, S * c, -S * d, S * e + tx, -S * f + ty);\n if (it.fill) cs.fillColor(it.fill.r, it.fill.g, it.fill.b);\n if (it.stroke) {\n cs.strokeColor(it.stroke.color.r, it.stroke.color.g, it.stroke.color.b);\n cs.lineWidth(it.stroke.width);\n cs.lineCap(it.stroke.cap);\n cs.lineJoin(it.stroke.join);\n if (it.stroke.join === 0) cs.miterLimit(it.stroke.miter);\n if (it.stroke.dash) cs.dash(it.stroke.dash, it.stroke.dashOffset);\n }\n // \u5857\u308A\u3068\u7DDA\u3067\u30A2\u30EB\u30D5\u30A1\u304C\u9055\u3046\u3053\u3068\u304C\u3042\u308B\u306E\u3067 ExtGState \u306B\u306F\u4E21\u65B9\u3092\u6E21\u3059\n const fa = it.fill ? it.fill.a : 1;\n const sa = it.stroke ? it.stroke.color.a : 1;\n if (fa !== 1 || sa !== 1) cs.setGState(this.gsName(fa, sa));\n cs.path(it.segs);\n if (it.fill && it.stroke) cs.fillAndStroke(it.evenOdd);\n else if (it.fill) cs.fill(it.evenOdd);\n else cs.stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'gradient') {\n const g = this.gradients.get(it);\n if (!g || it.box.w <= 0 || it.box.h <= 0) continue;\n cs.save();\n this.clipBox(it.clip);\n // \u7BB1\u30ED\u30FC\u30AB\u30EB\u306E CSS px \u7A7A\u9593\uFF08\u5DE6\u4E0A\u539F\u70B9\u30FBy \u4E0B\u5411\u304D\uFF09\u3078\u5199\u3059\u3002\u30B7\u30A7\u30FC\u30C7\u30A3\u30F3\u30B0\u306E\u5EA7\u6A19\u7CFB\u3082\u3053\u308C\u3002\n cs.transform(PX_TO_PT, 0, 0, -PX_TO_PT, this.X(it.box.x), this.Y(it.box.y));\n if (g.gs) cs.setGState(g.gs);\n else this.setAlpha(it.alpha);\n cs.shading(g.sh);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'image') {\n const im = this.images.get(it.image.key);\n if (!im || it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.alpha);\n if (it.clip) this.clipBox(it.clip);\n cs.image(im.name, this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'text') {\n const ef = /** @type {EmbeddedFont} */ (this.fonts.get(it.font));\n const tj = buildTJ(it, ef);\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n cs.text(ef.resourceName, it.size * PX_TO_PT, this.X(it.x), this.Y(it.y), tj);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'group') {\n // CSS \u884C\u5217 (a b c d e f) \u3092\u3001PDF \u5EA7\u6A19\uFF08y \u53CD\u8EE2\u30FB0.75 \u500D\uFF09\u3067\u540C\u3058\u5909\u63DB\u306B\u306A\u308B\u884C\u5217\u306B\u5199\u3059\u3002\n // \u7DDA\u5F62\u90E8\u306F y \u53CD\u8EE2\u306B\u3088\u308A b, c \u306E\u7B26\u53F7\u304C\u53CD\u8EE2\u3057\u3001\u5909\u63DB\u306E\u4E2D\u5FC3 origin \u306F\u4E0D\u52D5\u70B9\u3068\u3057\u3066\u6B8B\u3059\u3002\n const [a, b, c, d] = it.matrix;\n const ox = this.X(it.origin.x);\n const oy = this.Y(it.origin.y);\n const a2 = a;\n const b2 = -b;\n const c2 = -c;\n const d2 = d;\n const e2 = ox - (a2 * ox + c2 * oy) + it.matrix[4] * PX_TO_PT;\n const f2 = oy - (b2 * ox + d2 * oy) - it.matrix[5] * PX_TO_PT;\n cs.save();\n cs.transform(a2, b2, c2, d2, e2, f2);\n this.render(it.items, range);\n cs.restore();\n } else if (it.type === 'clip') {\n cs.save();\n this.clipBox(it.box);\n this.render(it.items, range);\n cs.restore();\n }\n }\n }\n}\n\n/**\n * \u30B0\u30EA\u30D5\u5217\u3092 TJ \u914D\u5217\u306B\u3059\u308B\u3002\n * \u5B9F\u6E2C\u3057\u305F\u30DA\u30F3\u4F4D\u7F6E\u3068\u3001\u30D5\u30A9\u30F3\u30C8\u306E advance \u304B\u3089\u8A08\u7B97\u3057\u305F\u4F4D\u7F6E\u3068\u306E\u5DEE\u3092 1/1000 \u5358\u4F4D\u306E\u8ABF\u6574\u5024\u3068\u3057\u3066\u633F\u5165\u3059\u308B\u3002\n * \u3053\u308C\u306B\u3088\u308A\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u4E21\u7AEF\u63C3\u3048\u304C\u305D\u306E\u307E\u307E\u518D\u73FE\u3055\u308C\u308B\u3002\n * @param {import('./walker/walk.js').TextItem} it\n * @param {EmbeddedFont} ef\n * @returns {Array<string|number>}\n */\nfunction buildTJ(it, ef) {\n /** @type {Array<string|number>} */\n const out = [];\n let hex = '';\n for (let i = 0; i < it.glyphs.length; i++) {\n const g = /** @type {import('./walker/walk.js').Glyph} */ (it.glyphs[i]);\n hex += hex4(ef.cid(g.gid));\n const next = it.glyphs[i + 1];\n if (!next) break;\n const expected = g.x + g.advance;\n const gap = next.x - expected; // px\n const adj = (-gap / it.size) * 1000; // \u6B63\u306E\u5024\u3067\u5DE6\u3078\u5BC4\u308B\n if (Math.abs(adj) >= 0.5) {\n out.push(hex, Math.round(adj * 10) / 10);\n hex = '';\n }\n }\n if (hex) out.push(hex);\n return out;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemTop(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y;\n if (it.type === 'gradient') return it.clip.y;\n if (it.type === 'path') return it.top;\n if (it.type === 'line') return Math.min(it.y1, it.y2) - it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.top;\n return it.top;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemBottom(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y + it.h;\n if (it.type === 'gradient') return it.clip.y + it.clip.h;\n if (it.type === 'path') return it.bottom;\n if (it.type === 'line') return Math.max(it.y1, it.y2) + it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.bottom;\n return it.bottom;\n}\n", "// @ts-check\n/**\n * \u9577\u3044\u5909\u63DB\u3067\u30E1\u30A4\u30F3\u30B9\u30EC\u30C3\u30C9\u3092\u5360\u6709\u3057\u306A\u3044\u305F\u3081\u306E\u3001\u6642\u9593\u30D9\u30FC\u30B9\u306E\u8B72\u6E21\u3002\n *\n * \u4E00\u5B9A\u6642\u9593\uFF08\u65E2\u5B9A 12ms\uFF09\u3092\u8D85\u3048\u3066\u52D5\u304D\u7D9A\u3051\u3066\u3044\u305F\u3089 1 \u56DE\u3060\u3051\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u3002\n * \u5C0F\u3055\u306A\u6587\u66F8\u3067\u306F\u307B\u3068\u3093\u3069\u767A\u706B\u305B\u305A\u3001\u5927\u304D\u306A\u6587\u66F8\u3067\u306F\u753B\u9762\u304C\u56FA\u307E\u3089\u306A\u304F\u306A\u308B\u3002\n */\n\n/**\n * \u30DE\u30AF\u30ED\u30BF\u30B9\u30AF\u3078\u8B72\u308B\u3002`setTimeout(0)` \u306F\u30CD\u30B9\u30C8\u3059\u308B\u3068 4ms \u306B\u30AF\u30E9\u30F3\u30D7\u3055\u308C\u308B\u306E\u3067\u3001\n * `scheduler.yield()` \u304B MessageChannel \u3092\u4F7F\u3046\u3002\n * @returns {Promise<void>}\n */\nfunction yieldToEventLoop() {\n const sched = /** @type {{yield?: () => Promise<void>}|undefined} */ (/** @type {any} */ (globalThis).scheduler);\n if (sched && typeof sched.yield === 'function') return sched.yield();\n return new Promise((resolve) => {\n if (typeof MessageChannel === 'function') {\n const ch = new MessageChannel();\n ch.port1.onmessage = () => {\n ch.port1.close();\n resolve();\n };\n ch.port2.postMessage(0);\n } else {\n setTimeout(resolve, 0);\n }\n });\n}\n\n/**\n * @typedef {() => Promise<void>} Pacer\n */\n\n/**\n * @param {number} [intervalMs] \u3053\u306E\u6642\u9593\u3092\u8D85\u3048\u3066\u52D5\u304D\u7D9A\u3051\u3066\u3044\u305F\u3089\u8B72\u308B\n * @returns {Pacer}\n */\nexport function createPacer(intervalMs = 12) {\n const now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());\n let last = now();\n return async () => {\n if (now() - last < intervalMs) return;\n await yieldToEventLoop();\n last = now();\n };\n}\n\n/** \u4F55\u3082\u3057\u306A\u3044 Pacer\uFF08\u30C6\u30B9\u30C8\u3084\u540C\u671F\u5B9F\u884C\u3057\u305F\u3044\u5834\u5408\u306B\u4F7F\u3046\uFF09 */\nexport const noPacer = /** @type {Pacer} */ (async () => {});\n", "// @ts-check\n/**\n * Receipt html to pdf \u2014 \u516C\u958B API\n *\n * \u30D6\u30E9\u30A6\u30B6\u5185\u3067 HTML/CSS \u3092\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u53EF\u80FD\u306A\u30D9\u30AF\u30BF\u30FC PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u8A2D\u8A08\u66F8: docs/design.md\n */\nimport { FontRegistry } from './font/registry.js';\nimport { renderDocument } from './renderer.js';\nimport { walk } from './walker/walk.js';\nimport { resolvePage, buildPdf } from './page.js';\nimport { PX_TO_PT } from './units.js';\nimport { createPacer } from './pacer.js';\n\nexport { expandPrintMediaCss } from './renderer.js';\n\n/**\n * \u767B\u9332\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E\u5B9A\u7FA9\u3002\n * `src` \u306F TrueType \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\uFF08glyf\uFF09\u3092\u6301\u3064\u9759\u7684 TTF \u306E\u307F\u5BFE\u5FDC\u3002\n *\n * @typedef {object} FontSource\n * @property {string} family CSS \u306E font-family \u3068\u4E00\u81F4\u3055\u305B\u308B\u540D\u524D\n * @property {number} [weight=400] 100\u301C900\n * @property {'normal'|'italic'} [style='normal']\n * @property {string|ArrayBuffer|Uint8Array} src URL \u307E\u305F\u306F \u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\u306E\u30D0\u30A4\u30C8\u5217\n */\n\n/**\n * \u7528\u7D19\u30B5\u30A4\u30BA\u3002\u65E2\u5B9A\u540D\u304B\u3001\u5E45\u30FB\u9AD8\u3055\u3092 CSS \u9577\u3055\uFF08'80mm' \u306A\u3069\uFF09\u3067\u6307\u5B9A\u3059\u308B\u3002\n *\n * @typedef {'A3'|'A4'|'A5'|'B4'|'B5'|'Letter'|'Legal'|{width: string, height: string}} PageSize\n */\n\n/**\n * @typedef {object} PageOptions\n * @property {PageSize} [size='A4']\n * @property {'portrait'|'landscape'} [orientation='portrait']\n * @property {string|{top: string, right: string, bottom: string, left: string}} [margin='15mm']\n */\n\n/**\n * @typedef {object} PdfMetadata\n * @property {string} [title]\n * @property {string} [author]\n * @property {string} [subject]\n * @property {string} [keywords]\n * @property {string} [creator]\n * @property {Date} [creationDate]\n */\n\n/**\n * \u5909\u63DB\u4E2D\u306B\u767A\u751F\u3057\u305F\u975E\u81F4\u547D\u7684\u306A\u554F\u984C\u3002\u4F8B\u5916\u306B\u306F\u305B\u305A onWarning \u306B\u6D41\u3059\u3002\n *\n * @typedef {object} ConversionWarning\n * @property {'unsupported-css'|'missing-font'|'missing-glyph'|'image-failed'|'other'} code\n * @property {string} message\n * @property {Element} [element]\n * @property {string} [property] unsupported-css \u306E\u3068\u304D\u306E CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u540D\n * @property {string} [text] missing-glyph \u306E\u3068\u304D\u306E\u8A72\u5F53\u6587\u5B57\n */\n\n/**\n * \u5909\u63DB\u306E\u9032\u307F\u5177\u5408\u3002\u9577\u3044\u6587\u66F8\u3067\u9032\u6357\u8868\u793A\u3092\u51FA\u3059\u305F\u3081\u306B\u4F7F\u3046\u3002\n *\n * @typedef {object} ConversionProgress\n * @property {'render'|'walk'|'layout'|'page'|'done'} phase\n * @property {number} [page] phase \u304C 'page' \u306E\u3068\u304D\u306E 1 \u59CB\u307E\u308A\u306E\u30DA\u30FC\u30B8\u756A\u53F7\n * @property {number} [totalPages] phase \u304C 'layout' \u4EE5\u964D\u3067\u78BA\u5B9A\u3059\u308B\u7DCF\u30DA\u30FC\u30B8\u6570\n */\n\n/**\n * @typedef {object} ConvertOptions\n * @property {PageOptions} [page]\n * @property {string[]} [fontFallback] \u672A\u767B\u9332\u30D5\u30A1\u30DF\u30EA\u30FC\u304C\u8981\u6C42\u3055\u308C\u305F\u3068\u304D\u306B\u8A66\u3059 family \u306E\u9806\u5E8F\n * @property {'inherit'|'none'|string[]} [stylesheets='inherit'] \u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u7D99\u627F\u3059\u308B\u304B\u3001URL/CSS \u30C6\u30AD\u30B9\u30C8\u3092\u660E\u793A\u3059\u308B\u304B\n * @property {boolean} [mediaPrint=false] `@media print` \u30EB\u30FC\u30EB\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u9069\u7528\u3059\u308B\n * @property {boolean} [compress=true] CompressionStream \u304C\u4F7F\u3048\u308C\u3070 FlateDecode \u3092\u9069\u7528\u3059\u308B\n * @property {PdfMetadata} [metadata]\n * @property {string|null} [header=null] \u5404\u30DA\u30FC\u30B8\u4E0A\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002{{pageNumber}} {{totalPages}} \u3092\u7F6E\u63DB\u3059\u308B\n * @property {string|null} [footer=null] \u5404\u30DA\u30FC\u30B8\u4E0B\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002\u540C\u4E0A\n * @property {'font'|'measure'|'auto'} [textMeasure='auto'] \u30B0\u30EA\u30D5\u4F4D\u7F6E\u306E\u6C7A\u3081\u65B9\uFF08\u73FE\u5728\u306F\u5E38\u306B\u5B9F\u6E2C\uFF09\n * @property {'blob'|'uint8array'|'dataurl'} [output='blob']\n * @property {string} [baseUrl] \u76F8\u5BFE URL\uFF08\u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\uFF09\u306E\u57FA\u6E96\u3002\u65E2\u5B9A\u306F\u73FE\u5728\u306E\u6587\u66F8\n * @property {(warning: ConversionWarning) => void} [onWarning]\n * @property {boolean} [links=true] `<a href>` \u3092 PDF \u306E\u30EA\u30F3\u30AF\u6CE8\u91C8\u306B\u3059\u308B\n * @property {boolean} [outline=false] \u898B\u51FA\u3057\uFF08h1\u301Ch6\uFF09\u304B\u3089\u3057\u304A\u308A\uFF08PDF \u306E\u76EE\u6B21\uFF09\u3092\u4F5C\u308B\n * @property {(progress: ConversionProgress) => void} [onProgress] \u9032\u6357\u901A\u77E5\u3002\u9577\u3044\u6587\u66F8\u3067\u306F\u9014\u4E2D\u3067\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\u306E\u3067\u3001UI \u3092\u66F4\u65B0\u3067\u304D\u308B\n */\n\n/**\n * \u5909\u63DB\u306E\u5165\u529B\u3002DOM \u8981\u7D20\u3001\u307E\u305F\u306F HTML \u6587\u5B57\u5217\u3002\n * @typedef {Element|string} ConvertInput\n */\n\n/** \u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\uFF08package.json \u3068\u540C\u671F\uFF09 */\nexport const version = '0.4.0';\n\n/** \u30E2\u30B8\u30E5\u30FC\u30EB\u5171\u6709\u306E\u30D5\u30A9\u30F3\u30C8\u30EC\u30B8\u30B9\u30C8\u30EA */\nconst registry = new FontRegistry();\n\n/**\n * \u30D5\u30A9\u30F3\u30C8\u3092\u767B\u9332\u3059\u308B\u3002\u540C\u3058 family/weight/style \u3092\u518D\u767B\u9332\u3057\u305F\u5834\u5408\u306F\u4E0A\u66F8\u304D\u3059\u308B\u3002\n * \u30D1\u30FC\u30B9\u7D50\u679C\u306F\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306B\u30AD\u30E3\u30C3\u30B7\u30E5\u3055\u308C\u3001\u4EE5\u964D\u306E htmlToPdf \u547C\u3073\u51FA\u3057\u3067\u518D\u5229\u7528\u3055\u308C\u308B\u3002\n *\n * @param {FontSource} font\n * @returns {Promise<void>}\n */\nexport async function registerFont(font) {\n if (!font || !font.family || !font.src) throw new TypeError('registerFont: { family, src } are required');\n const entry = await registry.register(font);\n if (entry.parsed.variable) {\n console.warn(\n `[receipt-html-to-pdf] \"${font.family}\" is a variable font; only the default instance outlines are embedded. ` +\n 'Use static TTF instances for other weights.',\n );\n }\n}\n\n/**\n * \u767B\u9332\u6E08\u307F\u30D5\u30A9\u30F3\u30C8\u306E\u4E00\u89A7\uFF08\u30C7\u30D0\u30C3\u30B0\u7528\uFF09\u3002\n * @returns {{family: string, weight: number, style: string, glyphs: number}[]}\n */\nexport function listFonts() {\n return registry.fonts.map((f) => ({ family: f.displayFamily, weight: f.weight, style: f.style, glyphs: f.parsed.numGlyphs }));\n}\n\n/**\n * HTML \u3092 PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n *\n * @param {ConvertInput} input\n * @param {ConvertOptions} [options]\n * @returns {Promise<Blob|Uint8Array|string>} options.output \u306B\u5FDC\u3058\u305F PDF\n */\nexport async function htmlToPdf(input, options = {}) {\n if (typeof document === 'undefined') throw new Error('htmlToPdf must run in a browser (needs DOM layout)');\n if (registry.fonts.length === 0) {\n throw new Error('htmlToPdf: no fonts registered. Call registerFont() with at least one TrueType font first.');\n }\n const warn = options.onWarning ?? (() => {});\n const progress = options.onProgress ?? (() => {});\n // \u9577\u3044\u5909\u63DB\u3067\u30E1\u30A4\u30F3\u30B9\u30EC\u30C3\u30C9\u3092\u5360\u6709\u3057\u306A\u3044\u3088\u3046\u3001\u4E00\u5B9A\u6642\u9593\u3054\u3068\u306B\u30A4\u30D9\u30F3\u30C8\u30EB\u30FC\u30D7\u3078\u623B\u3059\n const pacer = createPacer();\n const geo = resolvePage(options.page);\n const widthPx = (geo.width - geo.left - geo.right) / PX_TO_PT;\n\n progress({ phase: 'render' });\n const rendered = await renderDocument(input, {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n });\n\n /** @type {import('./walker/walk.js').WalkContext} */\n const walkCtx = {\n registry,\n fontFallback: options.fontFallback ?? [],\n warn,\n textMeasure: options.textMeasure ?? 'auto',\n pacer,\n };\n const renderOpts = {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n };\n\n try {\n progress({ phase: 'walk' });\n const body = await walk(rendered.root, walkCtx);\n const header = options.header ? await makeDecoration(options.header, renderOpts, walkCtx) : null;\n const footer = options.footer ? await makeDecoration(options.footer, renderOpts, walkCtx) : null;\n const bytes = await buildPdf(body, geo, {\n compress: options.compress ?? true,\n metadata: options.metadata,\n header,\n footer,\n links: options.links ?? true,\n outline: options.outline ?? false,\n pacer,\n progress,\n warn,\n });\n progress({ phase: 'done' });\n return toOutput(bytes, options.output ?? 'blob');\n } finally {\n rendered.destroy();\n }\n}\n\n/**\n * \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u63CF\u753B\u3059\u308B\u6E96\u5099\u3092\u3059\u308B\u3002\n * \u9AD8\u3055\u306F 1 \u30DA\u30FC\u30B8\u76EE\u76F8\u5F53\uFF08{{pageNumber}} = {{totalPages}} = 1\uFF09\u3067\u6E2C\u308A\u3001\u5168\u30DA\u30FC\u30B8\u540C\u3058\u3068\u307F\u306A\u3059\u3002\n * @param {string} template\n * @param {Parameters<typeof renderDocument>[1]} renderOpts\n * @param {import('./walker/walk.js').WalkContext} walkCtx\n * @returns {Promise<import('./page.js').PageDecoration>}\n */\nasync function makeDecoration(template, renderOpts, walkCtx) {\n const renderOnce = async (/** @type {number} */ page, /** @type {number} */ total) => {\n const html = template.replace(/\\{\\{\\s*pageNumber\\s*\\}\\}/g, String(page)).replace(/\\{\\{\\s*totalPages\\s*\\}\\}/g, String(total));\n const rendered = await renderDocument(html, renderOpts);\n try {\n return await walk(rendered.root, walkCtx);\n } finally {\n rendered.destroy();\n }\n };\n const probe = await renderOnce(1, 1);\n /** @type {Map<string, import('./walker/walk.js').WalkResult>} */\n const cache = new Map([['1/1', probe]]);\n return {\n heightPx: probe.height,\n render: async (page, total) => {\n const key = `${page}/${total}`;\n let r = cache.get(key);\n if (!r) {\n r = await renderOnce(page, total);\n cache.set(key, r);\n }\n return r;\n },\n };\n}\n\n/**\n * @param {Uint8Array} bytes\n * @param {'blob'|'uint8array'|'dataurl'} output\n * @returns {Blob|Uint8Array|string}\n */\nfunction toOutput(bytes, output) {\n if (output === 'uint8array') return bytes;\n if (output === 'dataurl') {\n let bin = '';\n for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return 'data:application/pdf;base64,' + btoa(bin);\n }\n return new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)], { type: 'application/pdf' });\n}\n\n/**\n * \u751F\u6210\u3057\u305F PDF \u3092\u30D6\u30E9\u30A6\u30B6\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3055\u305B\u308B\u88DC\u52A9\u95A2\u6570\u3002\n *\n * @param {Blob|Uint8Array} pdf\n * @param {string} filename\n * @returns {void}\n */\nexport function downloadPdf(pdf, filename) {\n const blob =\n pdf instanceof Blob\n ? pdf\n : new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (pdf)], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["parseFont", "buffer", "data", "dv", "tag", "numTables", "tables", "i", "p", "name", "variable", "req", "t", "head", "unitsPerEm", "bbox", "macStyle", "indexToLocFormat", "hhea", "ascender", "descender", "lineGap", "numberOfHMetrics", "numGlyphs", "hmtx", "advances", "lastAdvance", "g", "locaT", "loca", "cmapT", "cmap", "parseCmap", "capHeight", "useTypoMetrics", "typoAscender", "typoDescender", "winAscent", "winDescent", "bold", "italic", "os2", "version", "fsSelection", "ch", "italicAngle", "post", "postScriptName", "parsePostScriptName", "base", "best", "bestScore", "platform", "encoding", "offset", "format", "score", "map", "segCountX2", "segCount", "endP", "startP", "deltaP", "rangeP", "s", "end", "start", "delta", "rangeOffset", "c", "gid", "gp", "nGroups", "startGid", "nameT", "count", "stringOffset", "fallback", "nameId", "length", "sanitizePsName", "j", "glyphData", "font", "glyf", "componentGids", "out", "flags", "glyphIndex", "FontRegistry", "source", "bytes", "loadBytes", "parsed", "parseFont", "entry", "normalizeFamily", "idx", "f", "family", "families", "weight", "style", "codePoint", "fam", "n", "candidates", "pickFace", "styled", "pool", "exact", "sorted", "a", "b", "heavier", "lighter", "mid", "splitFamilies", "value", "out", "cur", "quote", "ch", "parseWeight", "src", "res", "renderDocument", "input", "opts", "iframe", "win", "doc", "html", "buildHtml", "defineStubElements", "fit", "waitForStylesheets", "waitForFonts", "waitForImages", "materializePseudoElements", "warnIfTooWide", "baseUrl", "base", "escapeAttr", "reset", "m", "expandPrintMedia", "styles", "collectStyles", "shadowHostStyles", "htmlAttrs", "copyAttrs", "bodyAttrs", "body", "serializeElement", "stylesheets", "mediaPrint", "parts", "el", "css", "expandPrintMediaCss", "adopted", "cssTextOf", "node", "root", "widthPx", "warn", "width", "over", "mm", "px", "VOID_TAGS", "whole", "roots", "collectShadowRoots", "host", "restore", "inlineAdoptedStyleSheets", "inner", "tag", "out", "walk", "child", "added", "style", "sheets", "sheet", "rule", "registry", "Base", "names", "scan", "name", "_m", "attrs", "i", "hit", "depth", "j", "query", "a", "s", "links", "l", "resolve", "link", "loading", "f", "imgs", "img", "jobs", "deepQueryAll", "pseudo", "ps", "content", "text", "parseContentString", "prop", "disableCss", "r", "job", "span", "value", "hosts", "v", "ch", "quote", "hex", "MM_TO_PT", "PAGE_SIZES", "lengthToPt", "value", "m", "cssPx", "value", "n", "parseColor", "v", "m", "a", "clamp01", "h", "c", "num", "s", "t", "parseGsub", "font", "dv", "base", "featureListOff", "lookupListOff", "features", "featureCount", "i", "rec", "tag", "featureOff", "count", "list", "j", "lookupCount", "cache", "index", "result", "off", "readLookup", "lookupOff", "type", "subTableCount", "offsetsAt", "map", "sub", "readSingleSubst", "format", "coverage", "readCoverage", "delta", "gid", "out", "start", "end", "startIndex", "g", "buildSubstitution", "tags", "gsub", "indices", "a", "b", "maps", "m", "memo", "hit", "VARIANT_TAGS", "featureTagsOf", "style", "words", "w", "ffs", "part", "value", "WHITESPACE", "measureText", "node", "style", "o", "doc", "text", "applyTextTransform", "range", "baselineOffset", "probeBaseline", "lines", "cur", "curTop", "warnedCps", "i", "cp", "len", "end", "rect", "pickRect", "resolved", "resolveGlyph", "font", "gid", "cpForUnicode", "top", "subst", "substitutionFor", "outGid", "advance", "substCache", "parsed", "features", "byKey", "key", "fn", "buildSubstitution", "rects", "best", "r", "tryFont", "f", "hit", "sub", "s", "transform", "out", "m", "sp", "ch", "probeCache", "cache", "cached", "probe", "textNode", "mark", "textRect", "offset", "result", "cache", "loadImage", "url", "warn", "element", "p", "decode", "e", "bytes", "res", "dims", "jpegDimensions", "img", "loaded", "resolve", "reject", "blobUrl", "w", "h", "canvas", "ctx", "data", "px", "rgb", "alpha", "opaque", "i", "j", "k", "a", "b", "marker", "len", "parseBackgroundUrl", "value", "parts", "splitTopLevelCommas", "m", "s", "out", "depth", "cur", "ch", "fitImage", "box", "iw", "ih", "size", "position", "scale", "sw", "sh", "rw", "sizeComponent", "rh", "py", "x", "positionComponent", "y", "v", "ref", "free", "objectFitToSize", "fit", "splitRepeat", "norm", "tileAxis", "mode", "start", "areaStart", "areaEnd", "area", "n", "_", "gap", "first", "positions", "releasePixels", "parseLinearGradient", "value", "width", "height", "m", "args", "splitTopLevelCommas", "i", "angle", "first", "head", "dir", "parseDirection", "rawStops", "s", "rad", "sin", "cos", "length", "stops", "raw", "sp", "splitColorAndPositions", "color", "parseColor", "pos", "t", "resolvePosition", "fillMissingPositions", "cx", "cy", "dx", "dy", "deg", "to", "words", "fn", "splitWords", "kw", "pct", "px", "last", "j", "from", "k", "prev", "out", "depth", "cur", "ch", "parsePathData", "d", "out", "tokens", "tokenize", "i", "x", "y", "startX", "startY", "lastC", "lastQ", "cmd", "num", "t", "hasNum", "rel", "C", "ox", "oy", "x1", "y1", "x2", "y2", "rx", "ry", "qx", "qy", "px", "py", "rot", "large", "sweep", "seg", "arcToCurves", "re", "m", "rotDeg", "phi", "cosP", "sinP", "dx", "dy", "x1p", "y1p", "lambda", "s", "sign", "den", "co", "cxp", "cyp", "cx", "cy", "angle", "ux", "uy", "vx", "vy", "dot", "len", "a", "theta1", "dTheta", "parts", "delta", "th", "th2", "cos1", "sin1", "cos2", "sin2", "map", "ex", "ey", "px1", "py1", "px2", "py2", "c1x", "c1y", "c2x", "c2y", "shapeToPath", "el", "attr", "name", "dflt", "v", "w", "h", "rectPath", "roundRectPath", "r", "ellipsePath", "pts", "K", "b", "SKIP_TAGS", "MAX_BG_TILES", "SVG_NS", "SVG_NON_RENDERED", "SVG_CONTAINERS", "flatChildNodes", "el", "shadow", "slot", "UNSUPPORTED", "v", "walk", "root", "ctx", "win", "sx", "sy", "out", "rootItems", "atoms", "breaks", "joins", "links", "anchors", "headings", "tables", "currentTable", "seq", "warned", "missingFamilies", "warnOnce", "key", "w", "visit", "inherited", "style", "matrix", "parseTransform", "hel", "transformedRect", "prev", "plainRect", "ox", "oy", "parseOrigin", "origin", "saved", "visitInner", "items", "zOf", "inheritedZ", "zi", "z", "opacity", "alpha", "visible", "r", "top", "bottom", "bb", "ba", "bi", "next", "nextBoxAfter", "prevBoxBefore", "collectLinkAndOutline", "openedTable", "savedTable", "isHead", "isFoot", "groupStart", "clips", "clipSaved", "clipBox", "boxFor", "parseRadius", "warnUnsupported", "rects", "collapse", "radius", "paintBackground", "paintBackgroundImage", "paintBorders", "paintImg", "decorations", "decoLine", "color", "parseColor", "paintSvgChildren", "finishClip", "node", "paintText", "prop", "isSet", "camelToKebab", "bg", "item", "withAlpha", "bgClip", "bgOrigin", "gradient", "parseLinearGradient", "url", "parseBackgroundUrl", "img", "loadImage", "fit", "fitImage", "rx", "ry", "splitRepeat", "ax", "tileAxis", "ay", "count", "y", "x", "src", "content", "objectFitToSize", "box", "h", "bt", "cssPx", "br", "bl", "pt", "pr", "pb", "pl", "b", "drawn", "side", "s", "f", "bw", "dashFor", "c", "horizontal", "dir", "edge", "dash", "center", "start", "parent", "inh", "raw", "range", "size", "families", "splitFamilies", "weight", "parseWeight", "fstyle", "primary", "lines", "measureText", "featureTagsOf", "line", "g", "deco", "first", "last", "x1", "x2", "thickness", "sortItems", "height", "it", "container", "child", "tag", "op", "a", "segs", "shapeToPath", "name", "ctm", "fill", "svgPaint", "stroke", "svgStroke", "value", "kind", "o", "width", "dashes", "cap", "join", "miter", "id", "text", "href", "fragment", "uri", "inside", "intersects", "sib", "edgeBoxIn", "children", "one", "m", "d", "e", "parts", "y1", "y2", "b2", "canCompress", "deflate", "bytes", "cs", "writer", "buf", "Ref", "id", "Name", "name", "out", "ch", "c", "b", "Raw", "text", "pdfString", "s", "hex", "i", "pdfDate", "d", "p", "n", "tz", "sign", "tzh", "tzm", "serialize", "v", "num", "parts", "k", "val", "PdfWriter", "options", "ref", "value", "stream", "dict", "bytes", "opts", "data", "z", "deflate", "rootRef", "infoRef", "enc", "chunks", "offset", "push", "concat", "offsets", "obj", "xrefOffset", "xref", "trailer", "len", "o", "ContentStream", "a", "b", "c", "d", "e", "f", "num", "gsName", "r", "g", "w", "pattern", "phase", "cap", "x", "y", "h", "x1", "y1", "x2", "y2", "x3", "y3", "max", "clamp", "v", "tl", "tr", "br", "bl", "top", "right", "name", "join", "limit", "evenOdd", "segs", "s", "fontName", "size", "tj", "opts", "parts", "t", "subsetFont", "font", "usedGids", "set", "stack", "gid", "c", "componentGids", "glyphData", "oldGids", "a", "b", "gidMap", "g", "i", "n", "glyphChunks", "loca", "glyfLen", "remapComposite", "pad", "glyf", "concat", "locaBytes", "ldv", "v", "origHmtx", "origHhea", "fdv", "numberOfHMetrics", "hmtx", "hdv", "old", "lsbOffset", "head", "copyTable", "headDv", "hhea", "maxp", "tables", "opt", "buildSfnt", "tag", "t", "out", "dv", "p", "flags", "oldGid", "numTables", "entrySelector", "searchRange", "rangeShift", "offset", "entries", "data", "checksum", "e", "k", "headEntry", "total", "sum", "b0", "b1", "b2", "b3", "EmbeddedFont", "font", "resourceName", "gid", "codePoint", "subsetFont", "writer", "subset", "f", "scale", "baseFont", "subsetTag", "fontFile", "flags", "descriptor", "v", "W", "widths", "g", "i", "j", "cidFont", "Raw", "toUnicode", "buildToUnicode", "usedGids", "h", "tag", "entries", "oldGid", "cid", "cp", "hex4", "utf16Hex", "body", "chunk", "cmap", "n", "embedImage", "writer", "img", "dict", "paginate", "walk", "pageHeightPx", "H", "total", "atoms", "a", "b", "breaks", "joins", "j", "first", "EPS", "pages", "start", "guard", "heads", "headShift", "t", "feet", "footShift", "end", "pass", "capacity", "computeEnd", "needed", "shift", "same", "n", "i", "moved", "iter", "buildFunction", "writer", "stops", "pick", "first", "last", "span", "functions", "bounds", "encode", "i", "a", "b", "buildAxialShading", "coords", "space", "c", "Name", "uniformAlpha", "s", "buildAlphaMaskGState", "bbox", "groupAlpha", "scaled", "shading", "content", "form", "buildLinkAnnot", "writer", "rect", "action", "annot", "Name", "pdfString", "buildOutline", "entries", "usable", "e", "roots", "stack", "node", "parent", "outlineRef", "emit", "nodes", "parentRef", "total", "i", "childCount", "dict", "prev", "next", "count", "resolvePage", "page", "sizeOpt", "width", "height", "s", "PAGE_SIZES", "lengthToPt", "m", "margins", "buildPdf", "body", "geo", "opts", "writer", "PdfWriter", "headerPt", "footerPt", "contentW", "contentTop", "contentH", "contentHpx", "ranges", "paginate", "totalPages", "headers", "footers", "p", "fonts", "images", "collect", "list", "it", "ef", "EmbeddedFont", "g", "w", "fontDict", "xobjDict", "im", "img", "again", "loadImage", "embedImage", "releasePixels", "gstates", "gstateDict", "gsName", "a", "strokeA", "key", "num", "name", "shadingDict", "gradients", "prepareGradients", "buildAxialShading", "alpha", "uniformAlpha", "gs", "gsRef", "buildAlphaMaskGState", "pagesRef", "pageRefs", "pageSlots", "slotOf", "i", "locate", "docY", "r", "top", "range", "cs", "ContentStream", "painter", "Painter", "bodyShiftPt", "footShiftPt", "bodyEndPt", "f", "fPt", "bottomPt", "h", "hPt", "header", "footer", "annots", "addLinks", "pdfTop", "docTop", "docEnd", "link", "y0", "y1", "rect", "buildLinkAnnot", "targetY", "at", "Name", "contentRef", "pageDict", "slot", "outlineRef", "buildOutline", "catalogDict", "catalog", "md", "info", "pdfString", "pdfDate", "infoRef", "inRange", "mid", "itemBottom", "itemTop", "pdfY", "x", "y", "v", "b", "d", "b2", "e", "S", "tx", "ty", "fa", "sa", "tj", "buildTJ", "ox", "oy", "a2", "c2", "d2", "e2", "f2", "out", "hex", "hex4", "next", "expected", "adj", "yieldToEventLoop", "sched", "resolve", "ch", "createPacer", "intervalMs", "now", "last", "version", "registry", "FontRegistry", "registerFont", "font", "listFonts", "f", "htmlToPdf", "input", "options", "warn", "progress", "pacer", "createPacer", "geo", "resolvePage", "widthPx", "rendered", "renderDocument", "walkCtx", "renderOpts", "body", "walk", "header", "makeDecoration", "footer", "bytes", "buildPdf", "toOutput", "template", "renderOnce", "page", "total", "html", "probe", "cache", "key", "r", "output", "bin", "i", "downloadPdf", "pdf", "filename", "blob", "url", "a"]
7
7
  }