From 41eca52b500977e9fb2694327e75bdeaf82b4313 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 20 Feb 2024 11:12:09 -0500 Subject: [PATCH] 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. --- Userland/Libraries/LibGfx/Font/OpenType/Font.cpp | 16 ++++++++-------- Userland/Libraries/LibGfx/Font/OpenType/Font.h | 11 +++++++++-- Userland/Libraries/LibGfx/Font/WOFF/Font.cpp | 2 +- Userland/Libraries/LibPDF/Fonts/Type0Font.cpp | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp index 5ad33cb1bd..a7eaedc608 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp +++ b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp @@ -151,12 +151,12 @@ float be_fword(u8 const* ptr) ErrorOr> 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> Font::try_load_from_externally_owned_memory(ReadonlyBytes buffer, unsigned index, OwnPtr external_cmap) +ErrorOr> Font::try_load_from_externally_owned_memory(ReadonlyBytes buffer, Options options) { FixedMemoryStream stream { buffer }; @@ -167,12 +167,12 @@ ErrorOr> Font::try_load_from_externally_owned_memory(Readonl auto ttc_header_v1 = TRY(stream.read_in_place()); // 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>()); - 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> 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> Font::try_load_from_offset(ReadonlyBytes buffer, u32 offset, OwnPtr external_cmap) +ErrorOr> 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> 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 cmap = external_cmap ? external_cmap.release_nonnull() : TRY(CmapCharCodeToGlyphIndex::from_slice(opt_cmap_slice.value())); + NonnullOwnPtr cmap = options.external_cmap ? options.external_cmap.release_nonnull() : TRY(CmapCharCodeToGlyphIndex::from_slice(opt_cmap_slice.value())); Optional loca; if (opt_loca_slice.has_value()) diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Font.h b/Userland/Libraries/LibGfx/Font/OpenType/Font.h index a37cfa56c3..722ba26bff 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Font.h +++ b/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 external_cmap {}; +}; + class Font : public Gfx::VectorFont { AK_MAKE_NONCOPYABLE(Font); public: + using Options = FontOptions; static ErrorOr> try_load_from_resource(Core::Resource const&, unsigned index = 0); - static ErrorOr> try_load_from_externally_owned_memory(ReadonlyBytes bytes, unsigned index = 0, OwnPtr external_cmap = {}); + static ErrorOr> 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> try_load_from_offset(ReadonlyBytes, unsigned index, OwnPtr external_cmap); + static ErrorOr> try_load_from_offset(ReadonlyBytes, u32 offset, Options options); Font( Head&& head, diff --git a/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp b/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp index cc01e9ab85..501884c0ac 100644 --- a/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp +++ b/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp @@ -158,7 +158,7 @@ ErrorOr> 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; } diff --git a/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp b/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp index 1346e649e1..18881db15d 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp +++ b/Userland/Libraries/LibPDF/Fonts/Type0Font.cpp @@ -183,7 +183,7 @@ PDFErrorOr> 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)); }