/* * Copyright (c) 2024, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include static ErrorOr> expect_single_frame(Gfx::ImageDecoderPlugin& plugin_decoder) { EXPECT_EQ(plugin_decoder.frame_count(), 1u); EXPECT(!plugin_decoder.is_animated()); EXPECT(!plugin_decoder.loop_count()); auto frame_descriptor = TRY(plugin_decoder.frame(0)); EXPECT_EQ(frame_descriptor.duration, 0); return *frame_descriptor.image; } static ErrorOr> expect_single_frame_of_size(Gfx::ImageDecoderPlugin& plugin_decoder, Gfx::IntSize size) { EXPECT_EQ(plugin_decoder.size(), size); auto frame = TRY(expect_single_frame(plugin_decoder)); EXPECT_EQ(frame->size(), size); return frame; } template static ErrorOr test_roundtrip(Gfx::Bitmap const& bitmap) { AllocatingMemoryStream stream; TRY(Writer::encode(stream, bitmap)); auto encoded_data = TRY(stream.read_until_eof()); auto plugin = TRY(Loader::create(encoded_data)); auto decoded = TRY(expect_single_frame_of_size(*plugin, bitmap.size())); for (int y = 0; y < bitmap.height(); ++y) for (int x = 0; x < bitmap.width(); ++x) EXPECT_EQ(decoded->get_pixel(x, y), bitmap.get_pixel(x, y)); return {}; } static ErrorOr> create_test_rgb_bitmap() { auto bitmap = TRY(Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, { 47, 33 })); for (int y = 0; y < bitmap->height(); ++y) for (int x = 0; x < bitmap->width(); ++x) bitmap->set_pixel(x, y, Gfx::Color((x * 255) / bitmap->width(), (y * 255) / bitmap->height(), x + y)); return bitmap; } static ErrorOr> create_test_rgba_bitmap() { auto bitmap = TRY(create_test_rgb_bitmap()); for (int y = 0; y < bitmap->height(); ++y) { for (int x = 0; x < bitmap->width(); ++x) { Color pixel = bitmap->get_pixel(x, y); pixel.set_alpha(255 - x); bitmap->set_pixel(x, y, pixel); } } return bitmap; } TEST_CASE(test_webp) { TRY_OR_FAIL((test_roundtrip(TRY_OR_FAIL(create_test_rgb_bitmap())))); TRY_OR_FAIL((test_roundtrip(TRY_OR_FAIL(create_test_rgba_bitmap())))); }