diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp index 2d94e64131..c68116f361 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp +++ b/Userland/Libraries/LibGfx/Font/OpenType/Font.cpp @@ -271,11 +271,16 @@ ErrorOr> Font::try_load_from_offset(ReadonlyBytes buffer, u3 return Error::from_string_literal("Font is missing Maxp"); auto maxp = TRY(Maxp::from_slice(opt_maxp_slice.value())); + bool can_omit_hmtx = (options.skip_tables & Options::SkipTables::Hmtx); Optional hmtx; - if (!(options.skip_tables & Options::SkipTables::Hmtx)) { - if (!opt_hmtx_slice.has_value()) - return Error::from_string_literal("Font is missing Hmtx"); - hmtx = TRY(Hmtx::from_slice(opt_hmtx_slice.value(), maxp.num_glyphs(), hhea.number_of_h_metrics())); + if (opt_hmtx_slice.has_value()) { + auto hmtx_or_error = Hmtx::from_slice(opt_hmtx_slice.value(), maxp.num_glyphs(), hhea.number_of_h_metrics()); + if (!hmtx_or_error.is_error()) + hmtx = hmtx_or_error.release_value(); + else if (!can_omit_hmtx) + return hmtx_or_error.release_error(); + } else if (!can_omit_hmtx) { + return Error::from_string_literal("Font is missing Hmtx"); } if (!options.external_cmap && !opt_cmap_slice.has_value()) @@ -292,9 +297,12 @@ ErrorOr> Font::try_load_from_offset(ReadonlyBytes buffer, u3 } Optional os2; - if (!(options.skip_tables & Options::SkipTables::OS2)) { - if (opt_os2_slice.has_value()) - os2 = TRY(OS2::from_slice(opt_os2_slice.value())); + if (opt_os2_slice.has_value()) { + auto os2_or_error = OS2::from_slice(opt_os2_slice.value()); + if (!os2_or_error.is_error()) + os2 = os2_or_error.release_value(); + else if (!(options.skip_tables & Options::SkipTables::OS2)) + return os2_or_error.release_error(); } Optional kern {}; diff --git a/Userland/Libraries/LibGfx/Font/OpenType/Font.h b/Userland/Libraries/LibGfx/Font/OpenType/Font.h index f792e78dc7..d257b5473c 100644 --- a/Userland/Libraries/LibGfx/Font/OpenType/Font.h +++ b/Userland/Libraries/LibGfx/Font/OpenType/Font.h @@ -35,10 +35,10 @@ struct FontOptions { // If set, do not try to read the 'name' table. family() and variant() will return empty strings. Name = 1 << 0, - // If set, do not try to read the 'hmtx' table. This will make glyph_metrics() return 0 for everyting and is_fixed_width() return true. + // If set, tolerate a missing or broken 'hmtx' table. This will make glyph_metrics() return 0 for everyting and is_fixed_width() return true. Hmtx = 1 << 1, - // If set, do not try to read the 'OS/2' table. metrics(), resolve_ascender_and_descender(), weight(), width(), and slope() will return different values. + // If set, tolerate a missing or broken 'OS/2' table. metrics(), resolve_ascender_and_descender(), weight(), width(), and slope() will return different values. OS2 = 1 << 2, }; u32 skip_tables { 0 };