From 524a4f6256ea3e77e5e39027a996d13d995c4066 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 14 Feb 2024 08:05:34 -0500 Subject: [PATCH] LibPDF/CFF: Make parse_top_dict() return all top dicts This happens for CFFs that contain multiple fonts. This doesn't happen in practice, but the same code will be used for fdarray parsing, which will contain several dicts. No behavior change. --- Userland/Libraries/LibPDF/Fonts/CFF.cpp | 22 +++++++++++++++------- Userland/Libraries/LibPDF/Fonts/CFF.h | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibPDF/Fonts/CFF.cpp b/Userland/Libraries/LibPDF/Fonts/CFF.cpp index fcde0accd2..89db34ddb8 100644 --- a/Userland/Libraries/LibPDF/Fonts/CFF.cpp +++ b/Userland/Libraries/LibPDF/Fonts/CFF.cpp @@ -121,7 +121,10 @@ PDFErrorOr> CFF::create(ReadonlyBytes const& cff_bytes, RefPt auto cff = adopt_ref(*new CFF()); cff->set_font_matrix({ 0.001f, 0.0f, 0.0f, 0.001f, 0.0f, 0.0f }); - auto top_dict = TRY(parse_top_dict(reader, cff_bytes)); + auto top_dicts = TRY(parse_top_dicts(reader, cff_bytes)); + if (top_dicts.size() != 1) + return error("CFFs with more than one font not yet implemented"); + auto const& top_dict = top_dicts[0]; auto strings = TRY(parse_strings(reader)); @@ -233,13 +236,15 @@ PDFErrorOr> CFF::create(ReadonlyBytes const& cff_bytes, RefPt return cff; } -PDFErrorOr CFF::parse_top_dict(Reader& reader, ReadonlyBytes const& cff_bytes) +PDFErrorOr> CFF::parse_top_dicts(Reader& reader, ReadonlyBytes const& cff_bytes) { - TopDict top_dict; + Vector top_dicts; + + TRY(parse_index(reader, [&](ReadonlyBytes const& element_data) -> PDFErrorOr { + TopDict top_dict; - TRY(parse_index(reader, [&](ReadonlyBytes const& element_data) { Reader element_reader { element_data }; - return parse_dict(element_reader, [&](TopDictOperator op, Vector const& operands) -> PDFErrorOr { + TRY(parse_dict(element_reader, [&](TopDictOperator op, Vector const& operands) -> PDFErrorOr { switch (op) { case TopDictOperator::Version: case TopDictOperator::Notice: @@ -355,10 +360,13 @@ PDFErrorOr CFF::parse_top_dict(Reader& reader, ReadonlyBytes const dbgln("CFF: Unhandled top dict entry {}", static_cast(op)); } return {}; - }); + })); + + top_dicts.append((move(top_dict))); + return {}; })); - return top_dict; + return top_dicts; } /// Appendix A: Standard Strings diff --git a/Userland/Libraries/LibPDF/Fonts/CFF.h b/Userland/Libraries/LibPDF/Fonts/CFF.h index bed4cee274..c884094437 100644 --- a/Userland/Libraries/LibPDF/Fonts/CFF.h +++ b/Userland/Libraries/LibPDF/Fonts/CFF.h @@ -128,7 +128,7 @@ public: float nominalWidthX = 0; int fdselect_offset = 0; }; - static PDFErrorOr parse_top_dict(Reader&, ReadonlyBytes const& cff_bytes); + static PDFErrorOr> parse_top_dicts(Reader&, ReadonlyBytes const& cff_bytes); static PDFErrorOr> parse_strings(Reader&);