From fb79fc0ba66531a547a87ec60c3fed9ccd816023 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 29 Jan 2023 13:05:21 -0500 Subject: [PATCH] Tests: Add a basic ICC profile test icc-v4.jpg is Meta/Websites/serenityos.org/happy/3rd/bgianf.jpg. There are a whole bunch of jpgs with v4 color profiles and I just picked one fairly arbitrarily. It looks like a fairly standard v4 matrix profile that in this form is also present in many jpgs taken by mobile phone cameras. It uses parametric curves. icc-v2.png is based on ./Documentation/WebServer_localhost.jpg since that is the only image in the repo with a v2 color profile. It also has all kinds of interesting and somewhat exotic tags, such as an 'dscm' (an Apple extension to have a description of type 'mluc', since normal 'desc' is required ot have type 'desc' in v2 files -- in v4, 'desc' has type 'mluc') tag of type 'mluc' that actually contains data in several languages and that exercises the non-BMP UTF-16BE decoder. It's however still also a fairly standard v2 matrix profile, which uses 'curv' instead of 'para' for its curves ('para' is v4-only). I converted that jpeg file to png, and cropped most of the image data to save on file size by running: sips -s format png --cropToHeightWidth 21 42 in.jpg --out out.png --- Tests/LibGfx/CMakeLists.txt | 1 + Tests/LibGfx/TestICCProfile.cpp | 41 ++++++++++++++++++++++++++++ Tests/LibGfx/test-inputs/icc-v2.png | Bin 0 -> 4228 bytes Tests/LibGfx/test-inputs/icc-v4.jpg | Bin 0 -> 31402 bytes 4 files changed, 42 insertions(+) create mode 100644 Tests/LibGfx/TestICCProfile.cpp create mode 100644 Tests/LibGfx/test-inputs/icc-v2.png create mode 100644 Tests/LibGfx/test-inputs/icc-v4.jpg diff --git a/Tests/LibGfx/CMakeLists.txt b/Tests/LibGfx/CMakeLists.txt index 9345fa930c..b5b928039f 100644 --- a/Tests/LibGfx/CMakeLists.txt +++ b/Tests/LibGfx/CMakeLists.txt @@ -1,6 +1,7 @@ set(TEST_SOURCES BenchmarkGfxPainter.cpp TestFontHandling.cpp + TestICCProfile.cpp TestImageDecoder.cpp ) diff --git a/Tests/LibGfx/TestICCProfile.cpp b/Tests/LibGfx/TestICCProfile.cpp new file mode 100644 index 0000000000..1ad04195cf --- /dev/null +++ b/Tests/LibGfx/TestICCProfile.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +#ifdef AK_OS_SERENITY +# define TEST_INPUT(x) ("/usr/Tests/LibGfx/test-inputs/" x) +#else +# define TEST_INPUT(x) ("test-inputs/" x) +#endif + +TEST_CASE(png) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc-v2.png"sv))); + auto png = MUST(Gfx::PNGImageDecoderPlugin::create(file->bytes())); + EXPECT(png->initialize()); + auto icc_bytes = MUST(png->icc_data()); + EXPECT(icc_bytes.has_value()); + + auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value())); + EXPECT(icc_profile->is_v2()); +} + +TEST_CASE(jpg) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc-v4.jpg"sv))); + auto jpg = MUST(Gfx::JPGImageDecoderPlugin::create(file->bytes())); + EXPECT(jpg->initialize()); + auto icc_bytes = MUST(jpg->icc_data()); + EXPECT(icc_bytes.has_value()); + + auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value())); + EXPECT(icc_profile->is_v4()); +} diff --git a/Tests/LibGfx/test-inputs/icc-v2.png b/Tests/LibGfx/test-inputs/icc-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..2062d8994ccac7ba6195a89e9c24f734f7689046 GIT binary patch literal 4228 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