from __future__ import annotations
import os
import pathlib
import re
import sys
FONTS = {
"FoxitFixed.cpp": ("kFoxitFixedFontData", "FoxitFixed.cff", 17597),
"FoxitFixedBold.cpp": ("kFoxitFixedBoldFontData", "FoxitFixedBold.cff", 18055),
"FoxitFixedBoldItalic.cpp": (
"kFoxitFixedBoldItalicFontData",
"FoxitFixedBoldItalic.cff",
19151,
),
"FoxitFixedItalic.cpp": (
"kFoxitFixedItalicFontData",
"FoxitFixedItalic.cff",
18746,
),
"FoxitSans.cpp": ("kFoxitSansFontData", "FoxitSans.cff", 15025),
"FoxitSansBold.cpp": ("kFoxitSansBoldFontData", "FoxitSansBold.cff", 16344),
"FoxitSansBoldItalic.cpp": (
"kFoxitSansBoldItalicFontData",
"FoxitSansBoldItalic.cff",
16418,
),
"FoxitSansItalic.cpp": ("kFoxitSansItalicFontData", "FoxitSansItalic.cff", 16339),
"FoxitSerif.cpp": ("kFoxitSerifFontData", "FoxitSerif.cff", 19469),
"FoxitSerifBold.cpp": ("kFoxitSerifBoldFontData", "FoxitSerifBold.cff", 19395),
"FoxitSerifBoldItalic.cpp": (
"kFoxitSerifBoldItalicFontData",
"FoxitSerifBoldItalic.cff",
20733,
),
"FoxitSerifItalic.cpp": (
"kFoxitSerifItalicFontData",
"FoxitSerifItalic.cff",
21227,
),
"FoxitSymbol.cpp": ("kFoxitSymbolFontData", "FoxitSymbol.cff", 16729),
"FoxitDingbats.cpp": ("kFoxitDingbatsFontData", "FoxitDingbats.cff", 29513),
}
BYTE = re.compile(rb"0[xX]([0-9a-fA-F]{1,2})\b")
def extract(source: bytes, symbol: str) -> bytes:
start = source.index(symbol.encode())
body = source[source.index(b"{{", start) + 2 : source.index(b"}}", start)]
return bytes(int(m.group(1), 16) for m in BYTE.finditer(body))
def oracle_checkout(argv_index: int = 1) -> pathlib.Path:
if len(sys.argv) > argv_index:
return pathlib.Path(sys.argv[argv_index])
repo = pathlib.Path(__file__).resolve().parents[3]
return pathlib.Path(os.environ.get("PDFRUM_ORACLE_CHECKOUT", repo.parent / "pdfium-c++"))
def main() -> int:
oracle = oracle_checkout()
src = oracle / "core/fxge/fontdata/chromefontdata"
out = pathlib.Path(
sys.argv[2] if len(sys.argv) > 2 else pathlib.Path(__file__).resolve().parent
).resolve()
out.mkdir(parents=True, exist_ok=True)
header = (src / "chromefontdata.h").read_text()
bounds = {
m.group(2): int(m.group(1))
for m in re.finditer(r"std::array<uint8_t,\s*(\d+)>\s+(\w+);", header)
}
failed = False
for cpp, (symbol, name, expected_len) in FONTS.items():
if bounds.get(symbol) != expected_len:
print(
f"{symbol}: chromefontdata.h declares {bounds.get(symbol)}, "
f"script expects {expected_len}",
file=sys.stderr,
)
failed = True
continue
blob = extract((src / cpp).read_bytes(), symbol)
if len(blob) != expected_len:
print(
f"{cpp}: got {len(blob)} bytes, expected {expected_len}",
file=sys.stderr,
)
failed = True
continue
(out / name).write_bytes(blob)
print(f"{name}: {len(blob)} bytes, first 4 = {blob[:4].hex(' ')}")
return 1 if failed else 0
if __name__ == "__main__":
raise SystemExit(main())