mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 22:07:35 +00:00
LibGfx: Implement TrimmedTable mappings for Cmaps
This commit is contained in:
parent
04ee181b21
commit
5b7dfe848d
2 changed files with 22 additions and 0 deletions
|
@ -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);
|
return glyph_id_for_code_point_table_0(code_point);
|
||||||
case Format::SegmentToDelta:
|
case Format::SegmentToDelta:
|
||||||
return glyph_id_for_code_point_table_4(code_point);
|
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:
|
case Format::SegmentedCoverage:
|
||||||
return glyph_id_for_code_point_table_12(code_point);
|
return glyph_id_for_code_point_table_12(code_point);
|
||||||
default:
|
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;
|
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 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));
|
u32 num_groups = be_u32(m_slice.offset_pointer((u32)Table12Offsets::NumGroups));
|
||||||
|
|
|
@ -67,6 +67,11 @@ public:
|
||||||
Constant = 16,
|
Constant = 16,
|
||||||
NonConstMultiplier = 4,
|
NonConstMultiplier = 4,
|
||||||
};
|
};
|
||||||
|
enum class Table6Offsets {
|
||||||
|
FirstCode = 6,
|
||||||
|
EntryCount = 8,
|
||||||
|
GlyphIdArray = 10
|
||||||
|
};
|
||||||
enum class Table12Offsets {
|
enum class Table12Offsets {
|
||||||
NumGroups = 12,
|
NumGroups = 12,
|
||||||
Record_StartCode = 16,
|
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_0(u32 code_point) const;
|
||||||
u32 glyph_id_for_code_point_table_4(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;
|
u32 glyph_id_for_code_point_table_12(u32 code_point) const;
|
||||||
|
|
||||||
ReadonlyBytes m_slice;
|
ReadonlyBytes m_slice;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue