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

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.
This commit is contained in:
Nico Weber 2024-02-05 21:30:45 -05:00 committed by Andreas Kling
parent 9750261921
commit 9bccb8c8d7
2 changed files with 11 additions and 8 deletions

View file

@ -267,10 +267,13 @@ PDFErrorOr<NonnullRefPtr<CFF>> CFF::create(ReadonlyBytes const& cff_bytes, RefPt
for (SID sid : s_predefined_charset_expert_subset) for (SID sid : s_predefined_charset_expert_subset)
TRY(charset_names.try_append(resolve_sid(sid, strings))); TRY(charset_names.try_append(resolve_sid(sid, strings)));
break; break;
default: default: {
charset_names = TRY(parse_charset(Reader { cff_bytes.slice(charset_offset) }, glyphs.size(), strings)); 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; break;
} }
}
// Adjust glyphs' widths as they are deltas from nominalWidthX // Adjust glyphs' widths as they are deltas from nominalWidthX
for (auto& glyph : glyphs) { for (auto& glyph : glyphs) {
@ -734,17 +737,17 @@ DeprecatedFlyString CFF::resolve_sid(SID sid, Vector<StringView> const& strings)
return DeprecatedFlyString("space"); return DeprecatedFlyString("space");
} }
PDFErrorOr<Vector<DeprecatedFlyString>> CFF::parse_charset(Reader&& reader, size_t glyph_count, Vector<StringView> const& strings) PDFErrorOr<Vector<CFF::SID>> CFF::parse_charset(Reader&& reader, size_t glyph_count)
{ {
// CFF spec, "13 Charsets" // CFF spec, "13 Charsets"
Vector<DeprecatedFlyString> names; Vector<SID> names;
auto format = TRY(reader.try_read<Card8>()); auto format = TRY(reader.try_read<Card8>());
if (format == 0) { if (format == 0) {
// CFF spec, "Table 17 Format 0" // CFF spec, "Table 17 Format 0"
dbgln_if(CFF_DEBUG, "CFF charset format 0"); dbgln_if(CFF_DEBUG, "CFF charset format 0");
for (size_t i = 0; i < glyph_count - 1; i++) { for (size_t i = 0; i < glyph_count - 1; i++) {
SID sid = TRY(reader.try_read<BigEndian<SID>>()); SID sid = TRY(reader.try_read<BigEndian<SID>>());
TRY(names.try_append(resolve_sid(sid, strings))); TRY(names.try_append(sid));
} }
} else if (format == 1) { } else if (format == 1) {
// CFF spec, "Table 18 Format 1" // CFF spec, "Table 18 Format 1"
@ -754,7 +757,7 @@ PDFErrorOr<Vector<DeprecatedFlyString>> CFF::parse_charset(Reader&& reader, size
auto first_sid = TRY(reader.try_read<BigEndian<SID>>()); auto first_sid = TRY(reader.try_read<BigEndian<SID>>());
int left = TRY(reader.try_read<Card8>()); int left = TRY(reader.try_read<Card8>());
for (SID sid = first_sid; left >= 0 && names.size() < glyph_count - 1; left--, sid++) 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) { } else if (format == 2) {
// CFF spec, "Table 20 Format 2" // CFF spec, "Table 20 Format 2"
@ -765,7 +768,7 @@ PDFErrorOr<Vector<DeprecatedFlyString>> CFF::parse_charset(Reader&& reader, size
auto first_sid = TRY(reader.try_read<BigEndian<SID>>()); auto first_sid = TRY(reader.try_read<BigEndian<SID>>());
int left = TRY(reader.try_read<BigEndian<Card16>>()); int left = TRY(reader.try_read<BigEndian<Card16>>());
for (SID sid = first_sid; left >= 0 && names.size() < glyph_count - 1; left--, sid++) 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 { } else {
dbgln("CFF: Unknown charset format {}", format); dbgln("CFF: Unknown charset format {}", format);

View file

@ -97,7 +97,7 @@ public:
static PDFErrorOr<Vector<CFF::Glyph>> parse_charstrings(Reader&&, Vector<ByteBuffer> const& local_subroutines, Vector<ByteBuffer> const& global_subroutines); static PDFErrorOr<Vector<CFF::Glyph>> parse_charstrings(Reader&&, Vector<ByteBuffer> const& local_subroutines, Vector<ByteBuffer> const& global_subroutines);
static DeprecatedFlyString resolve_sid(SID, Vector<StringView> const&); static DeprecatedFlyString resolve_sid(SID, Vector<StringView> const&);
static PDFErrorOr<Vector<DeprecatedFlyString>> parse_charset(Reader&&, size_t, Vector<StringView> const&); static PDFErrorOr<Vector<SID>> parse_charset(Reader&&, size_t);
static PDFErrorOr<Vector<u8>> parse_encoding(Reader&&, HashMap<Card8, SID>& supplemental); static PDFErrorOr<Vector<u8>> parse_encoding(Reader&&, HashMap<Card8, SID>& supplemental);
}; };