From 5b7dfe848d88e00eef594524f6c9e80135253b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= Date: Mon, 9 Jan 2023 16:06:21 +0100 Subject: [PATCH] LibGfx: Implement TrimmedTable mappings for Cmaps --- Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp | 16 ++++++++++++++++ Userland/Libraries/LibGfx/Font/OpenType/Cmap.h | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp b/Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp index a754062acd..0dede0c8d0 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp +++ b/Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp @@ -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)); diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Cmap.h b/Userland/Libraries/LibGfx/Font/OpenType/Cmap.h index 19660e30e7..049c356796 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Cmap.h +++ b/Userland/Libraries/LibGfx/Font/OpenType/Cmap.h @@ -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;