1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 02:27:35 +00:00

LibGfx/OpenType: Read "maxp" table using a C++ struct

This commit is contained in:
Andreas Kling 2022-12-19 13:54:16 +01:00
parent d201acf102
commit f04a878e55
2 changed files with 30 additions and 6 deletions

View file

@ -140,7 +140,7 @@ u16 Hhea::number_of_h_metrics() const
Optional<Maxp> Maxp::from_slice(ReadonlyBytes slice)
{
if (slice.size() < (size_t)Sizes::TableV0p5) {
if (slice.size() < sizeof(MaximumProfileVersion0_5)) {
return {};
}
return Maxp(slice);
@ -148,7 +148,7 @@ Optional<Maxp> Maxp::from_slice(ReadonlyBytes slice)
u16 Maxp::num_glyphs() const
{
return be_u16(m_slice.offset_pointer((u32)Offsets::NumGlyphs));
return header().num_glyphs;
}
Optional<Hmtx> Hmtx::from_slice(ReadonlyBytes slice, u32 num_glyphs, u32 number_of_h_metrics)

View file

@ -28,6 +28,11 @@ struct LongDateTime {
BigEndian<u64> value;
};
struct Version16Dot16 {
BigEndian<u16> major;
BigEndian<u16> minor;
};
using FWord = BigEndian<i16>;
using UFWord = BigEndian<u16>;
@ -122,16 +127,35 @@ private:
class Maxp {
public:
static Optional<Maxp> from_slice(ReadonlyBytes);
u16 num_glyphs() const;
private:
enum class Offsets {
NumGlyphs = 4
struct MaximumProfileVersion0_5 {
Version16Dot16 version;
BigEndian<u16> num_glyphs;
};
enum class Sizes {
TableV0p5 = 6,
struct MaximumProfileVersion1_0 {
Version16Dot16 version;
BigEndian<u16> num_glyphs;
BigEndian<u16> max_points;
BigEndian<u16> max_contours;
BigEndian<u16> max_composite_points;
BigEndian<u16> max_composite_contours;
BigEndian<u16> max_zones;
BigEndian<u16> max_twilight_points;
BigEndian<u16> max_storage;
BigEndian<u16> max_function_defs;
BigEndian<u16> max_instruction_defs;
BigEndian<u16> max_stack_elements;
BigEndian<u16> max_size_of_instructions;
BigEndian<u16> max_component_elements;
BigEndian<u16> max_component_depths;
};
MaximumProfileVersion0_5 const& header() const { return *bit_cast<MaximumProfileVersion0_5 const*>(m_slice.data()); }
Maxp(ReadonlyBytes slice)
: m_slice(slice)
{