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:
parent
d201acf102
commit
f04a878e55
2 changed files with 30 additions and 6 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue