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&);