Ver código fonte

LibGfx/OpenType: Tweak Font::try_load_from_externally_owned_memory()

It now takes an Options object instead of passing several default
parameters.

No behavior change.
Nico Weber 1 ano atrás
pai
commit
41eca52b50

+ 8 - 8
Userland/Libraries/LibGfx/Font/OpenType/Font.cpp

@@ -151,12 +151,12 @@ float be_fword(u8 const* ptr)
 
 ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_resource(Core::Resource const& resource, unsigned index)
 {
-    auto font = TRY(try_load_from_externally_owned_memory(resource.data(), index));
+    auto font = TRY(try_load_from_externally_owned_memory(resource.data(), { .index = index }));
     font->m_resource = resource;
     return font;
 }
 
-ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_externally_owned_memory(ReadonlyBytes buffer, unsigned index, OwnPtr<CharCodeToGlyphIndex> external_cmap)
+ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_externally_owned_memory(ReadonlyBytes buffer, Options options)
 {
     FixedMemoryStream stream { buffer };
 
@@ -167,12 +167,12 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_externally_owned_memory(Readonl
         auto ttc_header_v1 = TRY(stream.read_in_place<TTCHeaderV1>());
         // FIXME: Check for major_version == 2.
 
-        if (index >= ttc_header_v1->num_fonts)
+        if (options.index >= ttc_header_v1->num_fonts)
             return Error::from_string_literal("Requested font index is too large");
 
-        TRY(stream.seek(ttc_header_v1->table_directory_offsets + sizeof(u32) * index, SeekMode::SetPosition));
+        TRY(stream.seek(ttc_header_v1->table_directory_offsets + sizeof(u32) * options.index, SeekMode::SetPosition));
         auto offset = TRY(stream.read_value<BigEndian<u32>>());
-        return try_load_from_offset(buffer, offset, move(external_cmap));
+        return try_load_from_offset(buffer, offset, move(options));
     }
     if (tag == Tag("OTTO"))
         return Error::from_string_literal("CFF fonts not supported yet");
@@ -180,11 +180,11 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_externally_owned_memory(Readonl
     if (tag.to_u32() != 0x00010000 && tag != Tag("true"))
         return Error::from_string_literal("Not a valid font");
 
-    return try_load_from_offset(buffer, 0, move(external_cmap));
+    return try_load_from_offset(buffer, 0, move(options));
 }
 
 // FIXME: "loca" and "glyf" are not available for CFF fonts.
-ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u32 offset, OwnPtr<CharCodeToGlyphIndex> external_cmap)
+ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u32 offset, Options options)
 {
     FixedMemoryStream stream { buffer };
     TRY(stream.seek(offset, AK::SeekMode::SetPosition));
@@ -272,7 +272,7 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
         return Error::from_string_literal("Font is missing Hmtx");
     auto hmtx = TRY(Hmtx::from_slice(opt_hmtx_slice.value(), maxp.num_glyphs(), hhea.number_of_h_metrics()));
 
-    NonnullOwnPtr<CharCodeToGlyphIndex> cmap = external_cmap ? external_cmap.release_nonnull() : TRY(CmapCharCodeToGlyphIndex::from_slice(opt_cmap_slice.value()));
+    NonnullOwnPtr<CharCodeToGlyphIndex> cmap = options.external_cmap ? options.external_cmap.release_nonnull() : TRY(CmapCharCodeToGlyphIndex::from_slice(opt_cmap_slice.value()));
 
     Optional<Loca> loca;
     if (opt_loca_slice.has_value())

+ 9 - 2
Userland/Libraries/LibGfx/Font/OpenType/Font.h

@@ -26,12 +26,19 @@ public:
     virtual u32 glyph_id_for_code_point(u32) const = 0;
 };
 
+// This is not a nested struct to work around https://llvm.org/PR36684
+struct FontOptions {
+    unsigned index { 0 };
+    OwnPtr<CharCodeToGlyphIndex> external_cmap {};
+};
+
 class Font : public Gfx::VectorFont {
     AK_MAKE_NONCOPYABLE(Font);
 
 public:
+    using Options = FontOptions;
     static ErrorOr<NonnullRefPtr<Font>> try_load_from_resource(Core::Resource const&, unsigned index = 0);
-    static ErrorOr<NonnullRefPtr<Font>> try_load_from_externally_owned_memory(ReadonlyBytes bytes, unsigned index = 0, OwnPtr<CharCodeToGlyphIndex> external_cmap = {});
+    static ErrorOr<NonnullRefPtr<Font>> try_load_from_externally_owned_memory(ReadonlyBytes bytes, Options options = {});
 
     virtual Gfx::ScaledFontMetrics metrics(float x_scale, float y_scale) const override;
     virtual Gfx::ScaledGlyphMetrics glyph_metrics(u32 glyph_id, float x_scale, float y_scale, float point_width, float point_height) const override;
@@ -74,7 +81,7 @@ private:
 
     EmbeddedBitmapData embedded_bitmap_data_for_glyph(u32 glyph_id) const;
 
-    static ErrorOr<NonnullRefPtr<Font>> try_load_from_offset(ReadonlyBytes, unsigned index, OwnPtr<CharCodeToGlyphIndex> external_cmap);
+    static ErrorOr<NonnullRefPtr<Font>> try_load_from_offset(ReadonlyBytes, u32 offset, Options options);
 
     Font(
         Head&& head,

+ 1 - 1
Userland/Libraries/LibGfx/Font/WOFF/Font.cpp

@@ -158,7 +158,7 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_externally_owned_memory(Readonl
     if (header.total_sfnt_size != expected_total_sfnt_size)
         return Error::from_string_literal("Invalid WOFF total sfnt size");
 
-    auto input_font = TRY(OpenType::Font::try_load_from_externally_owned_memory(font_buffer.bytes(), index));
+    auto input_font = TRY(OpenType::Font::try_load_from_externally_owned_memory(font_buffer.bytes(), { .index = index }));
     auto font = adopt_ref(*new Font(input_font, move(font_buffer)));
     return font;
 }

+ 1 - 1
Userland/Libraries/LibPDF/Fonts/Type0Font.cpp

@@ -183,7 +183,7 @@ PDFErrorOr<NonnullOwnPtr<CIDFontType2>> CIDFontType2::create(Document* document,
     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;
-        auto ttf_font = TRY(OpenType::Font::try_load_from_externally_owned_memory(font_file_stream->bytes(), 0, move(cid_to_gid_map)));
+        auto ttf_font = TRY(OpenType::Font::try_load_from_externally_owned_memory(font_file_stream->bytes(), { .external_cmap = move(cid_to_gid_map) }));
         font = adopt_ref(*new Gfx::ScaledFont(*ttf_font, point_size, point_size));
     }