1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:37:46 +00:00

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.
This commit is contained in:
Nico Weber 2024-02-20 11:12:09 -05:00 committed by Andreas Kling
parent 3b616b6af8
commit 41eca52b50
4 changed files with 19 additions and 12 deletions

View file

@ -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())

View file

@ -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,

View file

@ -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;
}

View file

@ -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));
}