diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp index 7ccab56f72..4a67a39ba2 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp +++ b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp @@ -107,7 +107,7 @@ IndexToLocFormat Head::index_to_loc_format() const Optional Hhea::from_slice(ReadonlyBytes slice) { - if (slice.size() < (size_t)Sizes::Table) { + if (slice.size() < sizeof(HorizontalHeaderTable)) { return {}; } return Hhea(slice); @@ -115,27 +115,27 @@ Optional Hhea::from_slice(ReadonlyBytes slice) i16 Hhea::ascender() const { - return be_i16(m_slice.offset_pointer((u32)Offsets::Ascender)); + return header().ascender; } i16 Hhea::descender() const { - return be_i16(m_slice.offset_pointer((u32)Offsets::Descender)); + return header().descender; } i16 Hhea::line_gap() const { - return be_i16(m_slice.offset_pointer((u32)Offsets::LineGap)); + return header().line_gap; } u16 Hhea::advance_width_max() const { - return be_u16(m_slice.offset_pointer((u32)Offsets::AdvanceWidthMax)); + return header().advance_width_max; } u16 Hhea::number_of_h_metrics() const { - return be_u16(m_slice.offset_pointer((u32)Offsets::NumberOfHMetrics)); + return header().number_of_h_metrics; } Optional Maxp::from_slice(ReadonlyBytes slice) diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Tables.h b/Userland/Libraries/LibGfx/Font/OpenType/Tables.h index d49dd53deb..4f83da55c2 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Tables.h +++ b/Userland/Libraries/LibGfx/Font/OpenType/Tables.h @@ -28,6 +28,9 @@ struct LongDateTime { BigEndian value; }; +using FWord = BigEndian; +using UFWord = BigEndian; + // https://learn.microsoft.com/en-us/typography/opentype/spec/head // head: Font Header Table class Head { @@ -86,17 +89,26 @@ public: u16 number_of_h_metrics() const; private: - enum class Offsets { - Ascender = 4, - Descender = 6, - LineGap = 8, - AdvanceWidthMax = 10, - NumberOfHMetrics = 34, - }; - enum class Sizes { - Table = 36, + struct HorizontalHeaderTable { + BigEndian major_version; + BigEndian minor_version; + FWord ascender; + FWord descender; + FWord line_gap; + UFWord advance_width_max; + FWord min_left_side_bearing; + FWord min_right_side_bearing; + FWord x_max_extent; + BigEndian caret_slope_rise; + BigEndian caret_slope_run; + BigEndian caret_offset; + BigEndian reserved[4]; + BigEndian metric_data_format; + BigEndian number_of_h_metrics; }; + HorizontalHeaderTable const& header() const { return *bit_cast(m_slice.data()); } + Hhea(ReadonlyBytes slice) : m_slice(slice) {