From 9f93ae4bfccb0fc0b9d4e7b40680834212422b29 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Sun, 22 Oct 2023 13:59:37 +0100 Subject: [PATCH] LibGfx: Use offset table structs when reading WOFF font data --- Userland/Libraries/LibGfx/Font/WOFF/Font.cpp | 46 ++++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp b/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp index fe666c1df1..f4a0e5befd 100644 --- a/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp +++ b/Userland/Libraries/LibGfx/Font/WOFF/Font.cpp @@ -60,22 +60,6 @@ public: namespace WOFF { static constexpr u32 WOFF_SIGNATURE = 0x774F4646; -static constexpr size_t SFNT_HEADER_SIZE = 12; -static constexpr size_t SFNT_TABLE_SIZE = 16; - -static void be_u16(u8* ptr, u16 value) -{ - ptr[0] = (value >> 8) & 0xff; - ptr[1] = value & 0xff; -} - -static void be_u32(u8* ptr, u32 value) -{ - ptr[0] = (value >> 24) & 0xff; - ptr[1] = (value >> 16) & 0xff; - ptr[2] = (value >> 8) & 0xff; - ptr[3] = value & 0xff; -} static u16 pow_2_less_than_or_equal(u16 x) { @@ -121,15 +105,17 @@ ErrorOr> Font::try_load_from_externally_owned_memory(Readonl return Error::from_string_literal("Uncompressed font is more than 10 MiB"); auto font_buffer = TRY(ByteBuffer::create_zeroed(header.total_sfnt_size)); - // ISO-IEC 14496-22:2019 4.5.1 Offset table u16 search_range = pow_2_less_than_or_equal(header.num_tables); - be_u32(font_buffer.data() + 0, header.flavor); - be_u16(font_buffer.data() + 4, header.num_tables); - be_u16(font_buffer.data() + 6, search_range * 16); - be_u16(font_buffer.data() + 8, AK::log2(search_range)); - be_u16(font_buffer.data() + 10, header.num_tables * 16 - search_range * 16); + OpenType::TableDirectory table_directory { + .sfnt_version = header.flavor, + .num_tables = header.num_tables, + .search_range = search_range * 16, + .entry_selector = AK::log2(search_range), + .range_shift = header.num_tables * 16 - search_range * 16, + }; + font_buffer.overwrite(0, &table_directory, sizeof(table_directory)); - size_t font_buffer_offset = SFNT_HEADER_SIZE + header.num_tables * SFNT_TABLE_SIZE; + size_t font_buffer_offset = sizeof(OpenType::TableDirectory) + header.num_tables * sizeof(OpenType::TableRecord); for (size_t i = 0; i < header.num_tables; ++i) { auto entry = TRY(stream.read_value()); @@ -150,12 +136,14 @@ ErrorOr> Font::try_load_from_externally_owned_memory(Readonl font_buffer.overwrite(font_buffer_offset, buffer.data() + entry.offset, entry.orig_length); } - // ISO-IEC 14496-22:2019 4.5.2 Table directory - size_t table_directory_offset = SFNT_HEADER_SIZE + i * SFNT_TABLE_SIZE; - be_u32(font_buffer.data() + table_directory_offset, entry.tag); - be_u32(font_buffer.data() + table_directory_offset + 4, entry.orig_checksum); - be_u32(font_buffer.data() + table_directory_offset + 8, font_buffer_offset); - be_u32(font_buffer.data() + table_directory_offset + 12, entry.orig_length); + size_t table_directory_offset = sizeof(OpenType::TableDirectory) + i * sizeof(OpenType::TableRecord); + OpenType::TableRecord table_record { + .table_tag = entry.tag, + .checksum = entry.orig_checksum, + .offset = font_buffer_offset, + .length = entry.orig_length, + }; + font_buffer.overwrite(table_directory_offset, &table_record, sizeof(table_record)); font_buffer_offset += entry.orig_length; }