LibGfx: Implement TrimmedTable mappings for Cmaps

This commit is contained in:
Julian Offenhäuser 2023-01-09 16:06:21 +01:00 committed by Linus Groh
parent 04ee181b21
commit 5b7dfe848d
Notes: sideshowbarker 2024-07-17 07:48:42 +09:00
2 changed files with 22 additions and 0 deletions
Userland/Libraries/LibGfx/Font/OpenType

View file

@ -83,6 +83,8 @@ u32 Cmap::Subtable::glyph_id_for_code_point(u32 code_point) const
return glyph_id_for_code_point_table_0(code_point);
case Format::SegmentToDelta:
return glyph_id_for_code_point_table_4(code_point);
case Format::TrimmedTable:
return glyph_id_for_code_point_table_6(code_point);
case Format::SegmentedCoverage:
return glyph_id_for_code_point_table_12(code_point);
default:
@ -129,6 +131,20 @@ u32 Cmap::Subtable::glyph_id_for_code_point_table_4(u32 code_point) const
return (be_u16(m_slice.offset_pointer(glyph_offset)) + delta) & 0xffff;
}
u32 Cmap::Subtable::glyph_id_for_code_point_table_6(u32 code_point) const
{
u32 first_code = be_u16(m_slice.offset_pointer((u32)Table6Offsets::FirstCode));
if (code_point < first_code)
return 0;
u32 entry_count = be_u16(m_slice.offset_pointer((u32)Table6Offsets::EntryCount));
u32 code_offset = code_point - first_code;
if (code_offset > entry_count)
return 0;
return be_u16(m_slice.offset_pointer((u32)Table6Offsets::GlyphIdArray + code_offset * 2));
}
u32 Cmap::Subtable::glyph_id_for_code_point_table_12(u32 code_point) const
{
u32 num_groups = be_u32(m_slice.offset_pointer((u32)Table12Offsets::NumGroups));

View file

@ -67,6 +67,11 @@ public:
Constant = 16,
NonConstMultiplier = 4,
};
enum class Table6Offsets {
FirstCode = 6,
EntryCount = 8,
GlyphIdArray = 10
};
enum class Table12Offsets {
NumGroups = 12,
Record_StartCode = 16,
@ -80,6 +85,7 @@ public:
u32 glyph_id_for_code_point_table_0(u32 code_point) const;
u32 glyph_id_for_code_point_table_4(u32 code_point) const;
u32 glyph_id_for_code_point_table_6(u32 code_point) const;
u32 glyph_id_for_code_point_table_12(u32 code_point) const;
ReadonlyBytes m_slice;