1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:57:45 +00:00

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.
This commit is contained in:
Nico Weber 2024-02-14 08:05:34 -05:00 committed by Andreas Kling
parent 9f1cf8babc
commit 524a4f6256
2 changed files with 16 additions and 8 deletions

View file

@ -121,7 +121,10 @@ PDFErrorOr<NonnullRefPtr<CFF>> CFF::create(ReadonlyBytes const& cff_bytes, RefPt
auto cff = adopt_ref(*new CFF()); auto cff = adopt_ref(*new CFF());
cff->set_font_matrix({ 0.001f, 0.0f, 0.0f, 0.001f, 0.0f, 0.0f }); 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)); auto strings = TRY(parse_strings(reader));
@ -233,13 +236,15 @@ PDFErrorOr<NonnullRefPtr<CFF>> CFF::create(ReadonlyBytes const& cff_bytes, RefPt
return cff; return cff;
} }
PDFErrorOr<CFF::TopDict> CFF::parse_top_dict(Reader& reader, ReadonlyBytes const& cff_bytes) PDFErrorOr<Vector<CFF::TopDict>> CFF::parse_top_dicts(Reader& reader, ReadonlyBytes const& cff_bytes)
{ {
Vector<TopDict> top_dicts;
TRY(parse_index(reader, [&](ReadonlyBytes const& element_data) -> PDFErrorOr<void> {
TopDict top_dict; TopDict top_dict;
TRY(parse_index(reader, [&](ReadonlyBytes const& element_data) {
Reader element_reader { element_data }; Reader element_reader { element_data };
return parse_dict<TopDictOperator>(element_reader, [&](TopDictOperator op, Vector<DictOperand> const& operands) -> PDFErrorOr<void> { TRY(parse_dict<TopDictOperator>(element_reader, [&](TopDictOperator op, Vector<DictOperand> const& operands) -> PDFErrorOr<void> {
switch (op) { switch (op) {
case TopDictOperator::Version: case TopDictOperator::Version:
case TopDictOperator::Notice: case TopDictOperator::Notice:
@ -355,10 +360,13 @@ PDFErrorOr<CFF::TopDict> CFF::parse_top_dict(Reader& reader, ReadonlyBytes const
dbgln("CFF: Unhandled top dict entry {}", static_cast<int>(op)); dbgln("CFF: Unhandled top dict entry {}", static_cast<int>(op));
} }
return {}; return {};
});
})); }));
return top_dict; top_dicts.append((move(top_dict)));
return {};
}));
return top_dicts;
} }
/// Appendix A: Standard Strings /// Appendix A: Standard Strings

View file

@ -128,7 +128,7 @@ public:
float nominalWidthX = 0; float nominalWidthX = 0;
int fdselect_offset = 0; int fdselect_offset = 0;
}; };
static PDFErrorOr<TopDict> parse_top_dict(Reader&, ReadonlyBytes const& cff_bytes); static PDFErrorOr<Vector<TopDict>> parse_top_dicts(Reader&, ReadonlyBytes const& cff_bytes);
static PDFErrorOr<Vector<StringView>> parse_strings(Reader&); static PDFErrorOr<Vector<StringView>> parse_strings(Reader&);