浏览代码

LibPDF: Add FIXME for CIDFontType2 creation

Move some code only needed for CIDFontType2 creation into a new
function and add a FIXME describing what needs to happen there.
Nico Weber 1 年之前
父节点
当前提交
934340d845
共有 1 个文件被更改,包括 32 次插入12 次删除
  1. 32 12
      Userland/Libraries/LibPDF/Fonts/Type0Font.cpp

+ 32 - 12
Userland/Libraries/LibPDF/Fonts/Type0Font.cpp

@@ -4,6 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <LibGfx/Font/ScaledFont.h>
 #include <LibPDF/CommonNames.h>
 #include <LibPDF/Fonts/Type0Font.h>
 
@@ -36,9 +37,39 @@ PDFErrorOr<Gfx::FloatPoint> CIDFontType0::draw_string(Gfx::Painter&, Gfx::FloatP
 
 class CIDFontType2 : public CIDFontType {
 public:
+    static PDFErrorOr<NonnullOwnPtr<CIDFontType2>> create(Document*, NonnullRefPtr<DictObject> const& descendant, float font_size);
+
     PDFErrorOr<Gfx::FloatPoint> draw_string(Gfx::Painter&, Gfx::FloatPoint, DeprecatedString const&, Color const&, float, float, float, float) override;
 };
 
+PDFErrorOr<NonnullOwnPtr<CIDFontType2>> CIDFontType2::create(Document* document, NonnullRefPtr<DictObject> 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<StreamObject>()) {
+            TODO();
+        } else if (value->cast<NameObject>()->name() != "Identity") {
+            TODO();
+        }
+    }
+
+    RefPtr<Gfx::Font> 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<Gfx::FloatPoint> 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<void> Type0Font::initialize(Document* document, NonnullRefPtr<DictObj
         m_cid_font_type = TRY(try_make<CIDFontType0>());
     } else if (subtype == CommonNames::CIDFontType2) {
         // TrueType-based
-        m_cid_font_type = TRY(try_make<CIDFontType2>());
+        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<void> Type0Font::initialize(Document* document, NonnullRefPtr<DictObj
         }
     }
 
-    if (dict->contains(CommonNames::CIDToGIDMap)) {
-        auto value = TRY(dict->get_object(document, CommonNames::CIDToGIDMap));
-        if (value->is<StreamObject>()) {
-            TODO();
-        } else if (value->cast<NameObject>()->name() != "Identity") {
-            TODO();
-        }
-    }
-
     m_system_info = move(system_info);
     m_widths = move(widths);
     m_missing_width = default_width;