mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 21:27:34 +00:00
LibGfx: Parse the TTF fpgm and prep tables
These contain the font and CVT programs respectively.
This commit is contained in:
parent
3b282ba8bb
commit
4e5dc169a6
3 changed files with 52 additions and 2 deletions
|
@ -396,6 +396,8 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
|
||||||
Optional<ReadonlyBytes> opt_glyf_slice = {};
|
Optional<ReadonlyBytes> opt_glyf_slice = {};
|
||||||
Optional<ReadonlyBytes> opt_os2_slice = {};
|
Optional<ReadonlyBytes> opt_os2_slice = {};
|
||||||
Optional<ReadonlyBytes> opt_kern_slice = {};
|
Optional<ReadonlyBytes> opt_kern_slice = {};
|
||||||
|
Optional<ReadonlyBytes> opt_fpgm_slice = {};
|
||||||
|
Optional<ReadonlyBytes> opt_prep_slice = {};
|
||||||
|
|
||||||
Optional<Head> opt_head = {};
|
Optional<Head> opt_head = {};
|
||||||
Optional<Name> opt_name = {};
|
Optional<Name> opt_name = {};
|
||||||
|
@ -406,6 +408,8 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
|
||||||
Optional<Loca> opt_loca = {};
|
Optional<Loca> opt_loca = {};
|
||||||
Optional<OS2> opt_os2 = {};
|
Optional<OS2> opt_os2 = {};
|
||||||
Optional<Kern> opt_kern = {};
|
Optional<Kern> opt_kern = {};
|
||||||
|
Optional<Fpgm> opt_fpgm = {};
|
||||||
|
Optional<Prep> opt_prep = {};
|
||||||
|
|
||||||
auto num_tables = be_u16(buffer.offset_pointer(offset + (u32)Offsets::NumTables));
|
auto num_tables = be_u16(buffer.offset_pointer(offset + (u32)Offsets::NumTables));
|
||||||
if (buffer.size() < offset + (u32)Sizes::OffsetTable + num_tables * (u32)Sizes::TableRecord)
|
if (buffer.size() < offset + (u32)Sizes::OffsetTable + num_tables * (u32)Sizes::TableRecord)
|
||||||
|
@ -446,6 +450,10 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
|
||||||
opt_os2_slice = buffer_here;
|
opt_os2_slice = buffer_here;
|
||||||
} else if (tag == tag_from_str("kern")) {
|
} else if (tag == tag_from_str("kern")) {
|
||||||
opt_kern_slice = buffer_here;
|
opt_kern_slice = buffer_here;
|
||||||
|
} else if (tag == tag_from_str("fpgm")) {
|
||||||
|
opt_fpgm_slice = buffer_here;
|
||||||
|
} else if (tag == tag_from_str("prep")) {
|
||||||
|
opt_prep_slice = buffer_here;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,6 +497,14 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
|
||||||
if (opt_kern_slice.has_value())
|
if (opt_kern_slice.has_value())
|
||||||
kern = TRY(Kern::from_slice(opt_kern_slice.value()));
|
kern = TRY(Kern::from_slice(opt_kern_slice.value()));
|
||||||
|
|
||||||
|
Optional<Fpgm> fpgm;
|
||||||
|
if (opt_fpgm_slice.has_value())
|
||||||
|
fpgm = Fpgm(opt_fpgm_slice.value());
|
||||||
|
|
||||||
|
Optional<Prep> prep;
|
||||||
|
if (opt_prep_slice.has_value())
|
||||||
|
prep = Prep(opt_prep_slice.value());
|
||||||
|
|
||||||
// Select cmap table. FIXME: Do this better. Right now, just looks for platform "Windows"
|
// Select cmap table. FIXME: Do this better. Right now, just looks for platform "Windows"
|
||||||
// and corresponding encoding "Unicode full repertoire", or failing that, "Unicode BMP"
|
// and corresponding encoding "Unicode full repertoire", or failing that, "Unicode BMP"
|
||||||
for (u32 i = 0; i < cmap.num_subtables(); i++) {
|
for (u32 i = 0; i < cmap.num_subtables(); i++) {
|
||||||
|
@ -516,7 +532,7 @@ ErrorOr<NonnullRefPtr<Font>> Font::try_load_from_offset(ReadonlyBytes buffer, u3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return adopt_ref(*new Font(move(buffer), move(head), move(name), move(hhea), move(maxp), move(hmtx), move(cmap), move(loca), move(glyf), move(os2), move(kern)));
|
return adopt_ref(*new Font(move(buffer), move(head), move(name), move(hhea), move(maxp), move(hmtx), move(cmap), move(loca), move(glyf), move(os2), move(kern), move(fpgm), move(prep)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Gfx::ScaledFontMetrics Font::metrics([[maybe_unused]] float x_scale, float y_scale) const
|
Gfx::ScaledFontMetrics Font::metrics([[maybe_unused]] float x_scale, float y_scale) const
|
||||||
|
|
|
@ -52,7 +52,7 @@ private:
|
||||||
|
|
||||||
static ErrorOr<NonnullRefPtr<Font>> try_load_from_offset(ReadonlyBytes, unsigned index = 0);
|
static ErrorOr<NonnullRefPtr<Font>> try_load_from_offset(ReadonlyBytes, unsigned index = 0);
|
||||||
|
|
||||||
Font(ReadonlyBytes bytes, Head&& head, Name&& name, Hhea&& hhea, Maxp&& maxp, Hmtx&& hmtx, Cmap&& cmap, Loca&& loca, Glyf&& glyf, Optional<OS2> os2, Optional<Kern>&& kern)
|
Font(ReadonlyBytes bytes, Head&& head, Name&& name, Hhea&& hhea, Maxp&& maxp, Hmtx&& hmtx, Cmap&& cmap, Loca&& loca, Glyf&& glyf, Optional<OS2> os2, Optional<Kern>&& kern, Optional<Fpgm> fpgm, Optional<Prep> prep)
|
||||||
: m_buffer(move(bytes))
|
: m_buffer(move(bytes))
|
||||||
, m_head(move(head))
|
, m_head(move(head))
|
||||||
, m_name(move(name))
|
, m_name(move(name))
|
||||||
|
@ -64,6 +64,8 @@ private:
|
||||||
, m_cmap(move(cmap))
|
, m_cmap(move(cmap))
|
||||||
, m_os2(move(os2))
|
, m_os2(move(os2))
|
||||||
, m_kern(move(kern))
|
, m_kern(move(kern))
|
||||||
|
, m_fpgm(move(fpgm))
|
||||||
|
, m_prep(move(prep))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +84,8 @@ private:
|
||||||
Cmap m_cmap;
|
Cmap m_cmap;
|
||||||
Optional<OS2> m_os2;
|
Optional<OS2> m_os2;
|
||||||
Optional<Kern> m_kern;
|
Optional<Kern> m_kern;
|
||||||
|
Optional<Fpgm> m_fpgm;
|
||||||
|
Optional<Prep> m_prep;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,6 +171,36 @@ struct GlyphHorizontalMetrics {
|
||||||
i16 left_side_bearing;
|
i16 left_side_bearing;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// https://learn.microsoft.com/en-us/typography/opentype/spec/fpgm
|
||||||
|
// fpgm: Font Program
|
||||||
|
struct Fpgm {
|
||||||
|
public:
|
||||||
|
explicit Fpgm(ReadonlyBytes slice)
|
||||||
|
: m_slice(slice)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadonlyBytes program_data() const { return m_slice; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ReadonlyBytes m_slice;
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://learn.microsoft.com/en-us/typography/opentype/spec/prep
|
||||||
|
// prep: Control Value Program
|
||||||
|
struct Prep {
|
||||||
|
public:
|
||||||
|
explicit Prep(ReadonlyBytes slice)
|
||||||
|
: m_slice(slice)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadonlyBytes program_data() const { return m_slice; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ReadonlyBytes m_slice;
|
||||||
|
};
|
||||||
|
|
||||||
// https://learn.microsoft.com/en-us/typography/opentype/spec/hmtx
|
// https://learn.microsoft.com/en-us/typography/opentype/spec/hmtx
|
||||||
// hmtx: Horizontal Metrics Table
|
// hmtx: Horizontal Metrics Table
|
||||||
class Hmtx {
|
class Hmtx {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue