diff --git a/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp b/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp index e2da3eef1c..47f2ba84b4 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp +++ b/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include @@ -36,9 +37,39 @@ PDFErrorOr CIDFontType0::draw_string(Gfx::Painter&, Gfx::FloatP class CIDFontType2 : public CIDFontType { public: + static PDFErrorOr> create(Document*, NonnullRefPtr const& descendant, float font_size); + PDFErrorOr draw_string(Gfx::Painter&, Gfx::FloatPoint, DeprecatedString const&, Color const&, float, float, float, float) override; }; +PDFErrorOr> CIDFontType2::create(Document* document, NonnullRefPtr const& descendant, float font_size) +{ + auto descriptor = TRY(descendant->get_dict(document, CommonNames::FontDescriptor)); + + if (descendant->contains(CommonNames::CIDToGIDMap)) { + auto value = TRY(descendant->get_object(document, CommonNames::CIDToGIDMap)); + if (value->is()) { + TODO(); + } else if (value->cast()->name() != "Identity") { + TODO(); + } + } + + RefPtr font; + if (descriptor->contains(CommonNames::FontFile2)) { + auto font_file_stream = TRY(descriptor->get_stream(document, CommonNames::FontFile2)); + float point_size = (font_size * POINTS_PER_INCH) / DEFAULT_DPI; + // FIXME: Load font_file_stream->bytes() as TTF data, similar to TrueTypeFont::initialize(). + // Unfortunately, TTF data in Type0 CIDFontType2 fonts don't contain the "cmap" table + // that's mandatory per TTF spec and the PDF stores that mapping in CIDToGIDMap instead. + // OpenType::Font::try_load currently rejects TTF data without "cmap" data. + (void)font_file_stream; + (void)point_size; + } + + return TRY(adopt_nonnull_own_or_enomem(new (nothrow) CIDFontType2())); +} + PDFErrorOr CIDFontType2::draw_string(Gfx::Painter&, Gfx::FloatPoint, DeprecatedString const&, Color const&, float, float, float, float) { // ISO 32000 (PDF 2.0) 9.7.4.2 Glyph selection in CIDFonts @@ -84,13 +115,11 @@ PDFErrorOr Type0Font::initialize(Document* document, NonnullRefPtr()); } else if (subtype == CommonNames::CIDFontType2) { // TrueType-based - m_cid_font_type = TRY(try_make()); + m_cid_font_type = TRY(CIDFontType2::create(document, descendant_font, font_size)); } else { return Error { Error::Type::MalformedPDF, "invalid /Subtype for Type 0 font" }; } - auto font_descriptor = TRY(descendant_font->get_dict(document, CommonNames::FontDescriptor)); - u16 default_width = 1000; if (descendant_font->contains(CommonNames::DW)) default_width = descendant_font->get_value(CommonNames::DW).to_int(); @@ -122,15 +151,6 @@ PDFErrorOr Type0Font::initialize(Document* document, NonnullRefPtrcontains(CommonNames::CIDToGIDMap)) { - auto value = TRY(dict->get_object(document, CommonNames::CIDToGIDMap)); - if (value->is()) { - TODO(); - } else if (value->cast()->name() != "Identity") { - TODO(); - } - } - m_system_info = move(system_info); m_widths = move(widths); m_missing_width = default_width;