From 9bccb8c8d724be7fde078246c445b9326b8011d4 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 5 Feb 2024 21:30:45 -0500 Subject: [PATCH] LibPDF: Make CFF::parse_charset() return SIDs ...and do string expansion at the call site. CID-keyed fonts treat the charset as CIDs instead of as SIDs, so having access to the SIDs in numberic form will be useful when we implement support for CID-keyed CFF fonts. No behavior change. --- Userland/Libraries/LibPDF/Fonts/CFF.cpp | 17 ++++++++++------- Userland/Libraries/LibPDF/Fonts/CFF.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibPDF/Fonts/CFF.cpp b/Userland/Libraries/LibPDF/Fonts/CFF.cpp index 71985fa7a5..a58ce77bc1 100644 --- a/Userland/Libraries/LibPDF/Fonts/CFF.cpp +++ b/Userland/Libraries/LibPDF/Fonts/CFF.cpp @@ -267,10 +267,13 @@ PDFErrorOr> CFF::create(ReadonlyBytes const& cff_bytes, RefPt for (SID sid : s_predefined_charset_expert_subset) TRY(charset_names.try_append(resolve_sid(sid, strings))); break; - default: - charset_names = TRY(parse_charset(Reader { cff_bytes.slice(charset_offset) }, glyphs.size(), strings)); + default: { + auto charset = TRY(parse_charset(Reader { cff_bytes.slice(charset_offset) }, glyphs.size())); + for (SID sid : charset) + TRY(charset_names.try_append(resolve_sid(sid, strings))); break; } + } // Adjust glyphs' widths as they are deltas from nominalWidthX for (auto& glyph : glyphs) { @@ -734,17 +737,17 @@ DeprecatedFlyString CFF::resolve_sid(SID sid, Vector const& strings) return DeprecatedFlyString("space"); } -PDFErrorOr> CFF::parse_charset(Reader&& reader, size_t glyph_count, Vector const& strings) +PDFErrorOr> CFF::parse_charset(Reader&& reader, size_t glyph_count) { // CFF spec, "13 Charsets" - Vector names; + Vector names; auto format = TRY(reader.try_read()); if (format == 0) { // CFF spec, "Table 17 Format 0" dbgln_if(CFF_DEBUG, "CFF charset format 0"); for (size_t i = 0; i < glyph_count - 1; i++) { SID sid = TRY(reader.try_read>()); - TRY(names.try_append(resolve_sid(sid, strings))); + TRY(names.try_append(sid)); } } else if (format == 1) { // CFF spec, "Table 18 Format 1" @@ -754,7 +757,7 @@ PDFErrorOr> CFF::parse_charset(Reader&& reader, size auto first_sid = TRY(reader.try_read>()); int left = TRY(reader.try_read()); for (SID sid = first_sid; left >= 0 && names.size() < glyph_count - 1; left--, sid++) - TRY(names.try_append(resolve_sid(sid, strings))); + TRY(names.try_append(sid)); } } else if (format == 2) { // CFF spec, "Table 20 Format 2" @@ -765,7 +768,7 @@ PDFErrorOr> CFF::parse_charset(Reader&& reader, size auto first_sid = TRY(reader.try_read>()); int left = TRY(reader.try_read>()); for (SID sid = first_sid; left >= 0 && names.size() < glyph_count - 1; left--, sid++) - TRY(names.try_append(resolve_sid(sid, strings))); + TRY(names.try_append(sid)); } } else { dbgln("CFF: Unknown charset format {}", format); diff --git a/Userland/Libraries/LibPDF/Fonts/CFF.h b/Userland/Libraries/LibPDF/Fonts/CFF.h index 50ff7fb4eb..3b160f80f9 100644 --- a/Userland/Libraries/LibPDF/Fonts/CFF.h +++ b/Userland/Libraries/LibPDF/Fonts/CFF.h @@ -97,7 +97,7 @@ public: static PDFErrorOr> parse_charstrings(Reader&&, Vector const& local_subroutines, Vector const& global_subroutines); static DeprecatedFlyString resolve_sid(SID, Vector const&); - static PDFErrorOr> parse_charset(Reader&&, size_t, Vector const&); + static PDFErrorOr> parse_charset(Reader&&, size_t); static PDFErrorOr> parse_encoding(Reader&&, HashMap& supplemental); };