From 4c15c87d0c027e19ba2e6045860833ff706b7371 Mon Sep 17 00:00:00 2001 From: MacDue Date: Tue, 12 Mar 2024 19:31:17 +0000 Subject: [PATCH] LibGfx/TinyVG: Fix decoding green channel of graphics RGB565 colors The division was missed here, so this would produce overly bright greens (or overflow). --- Tests/LibGfx/TestImageDecoder.cpp | 11 +++++++++++ Tests/LibGfx/test-inputs/tvg/green-rgb565.tvg | Bin 0 -> 36 bytes .../Libraries/LibGfx/ImageFormats/TinyVGLoader.cpp | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Tests/LibGfx/test-inputs/tvg/green-rgb565.tvg diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 01e6c3bcd5..72abf48097 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -1204,6 +1204,17 @@ TEST_CASE(test_tvg_malformed) } } +TEST_CASE(test_tvg_rgb565) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("tvg/green-rgb565.tvg"sv))); + EXPECT(Gfx::TinyVGImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::TinyVGImageDecoderPlugin::create(file->bytes())); + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 100, 100 })); + + // Should be a solid dark green: + EXPECT_EQ(frame.image->get_pixel(50, 50), Gfx::Color(0, 130, 0)); +} + TEST_CASE(test_jxl_modular_simple_tree_upsample2_10bits) { auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("jxl/modular_simple_tree_upsample2_10bits_rct.jxl"sv))); diff --git a/Tests/LibGfx/test-inputs/tvg/green-rgb565.tvg b/Tests/LibGfx/test-inputs/tvg/green-rgb565.tvg new file mode 100644 index 0000000000000000000000000000000000000000..ec83558fc4490d2f3a6aec0a26c0f534d7ea3b4c GIT binary patch literal 36 ecmXR4V-!eXNMT@PU}0upU}gY;6bJ#O*cbpu6$3*6 literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGfx/ImageFormats/TinyVGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/TinyVGLoader.cpp index b987a8ff51..ff2fe4dba5 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TinyVGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/TinyVGLoader.cpp @@ -147,7 +147,7 @@ static ErrorOr> decode_color_table(Stream& stream, ColorEncoding e auto red = (color >> (6 + 5)) & 0x1f; auto green = (color >> 5) & 0x3f; auto blue = (color >> 0) & 0x1f; - return Color((red * 255 + 15) / 31, (green * 255 + 31), (blue * 255 + 15) / 31); + return Color((red * 255 + 15) / 31, (green * 255 + 31) / 63, (blue * 255 + 15) / 31); } case ColorEncoding::RGBAF32: { auto red = TRY(stream.read_value>());