From b10fe7c1365c917ec11e998efc4354f196331fb5 Mon Sep 17 00:00:00 2001 From: Simon Danner Date: Fri, 6 Jan 2023 16:04:02 +0100 Subject: [PATCH] LibGfx: Prefer largest image with best depth for ICO display Some favicons contain multiple icons of the same size, but with increasing depth. Use the largest one to make things look nicer. --- Userland/Libraries/LibGfx/ICOLoader.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibGfx/ICOLoader.cpp b/Userland/Libraries/LibGfx/ICOLoader.cpp index 4771808996..27a00f211f 100644 --- a/Userland/Libraries/LibGfx/ICOLoader.cpp +++ b/Userland/Libraries/LibGfx/ICOLoader.cpp @@ -39,6 +39,7 @@ static_assert(AssertSize()); struct ICOImageDescriptor { u16 width; u16 height; + u16 bits_per_pixel; size_t offset; size_t size; RefPtr bitmap; @@ -77,7 +78,7 @@ static Optional decode_ico_direntry(InputMemoryStream& strea if (stream.handle_any_error()) return {}; - ICOImageDescriptor desc = { entry.width, entry.height, entry.offset, entry.size, nullptr }; + ICOImageDescriptor desc = { entry.width, entry.height, entry.bits_per_pixel, entry.offset, entry.size, nullptr }; if (desc.width == 0) desc.width = 256; if (desc.height == 0) @@ -91,10 +92,14 @@ static size_t find_largest_image(ICOLoadingContext const& context) size_t max_area = 0; size_t index = 0; size_t largest_index = 0; + u16 max_bits_per_pixel = 0; for (auto const& desc : context.images) { - if (static_cast(desc.width) * static_cast(desc.height) > max_area) { - max_area = desc.width * desc.height; - largest_index = index; + if (static_cast(desc.width) * static_cast(desc.height) >= max_area) { + if (desc.bits_per_pixel > max_bits_per_pixel) { + max_area = desc.width * desc.height; + largest_index = index; + max_bits_per_pixel = desc.bits_per_pixel; + } } ++index; }