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:
parent
3b616b6af8
commit
41eca52b50
4 changed files with 19 additions and 12 deletions
|
@ -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())
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue