1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:27:46 +00:00

LibGfx: Use offset table structs when reading WOFF font data

This commit is contained in:
Sam Atkins 2023-10-22 13:59:37 +01:00 committed by Andreas Kling
parent d80c528eb4
commit 9f93ae4bfc

View file

@ -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<NonnullRefPtr<Font>> 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<TableDirectoryEntry>());
@ -150,12 +136,14 @@ ErrorOr<NonnullRefPtr<Font>> 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;
}