Serenity Operating System
1/*
2 * Copyright (c) 2023, Nico Weber <thakis@chromium.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibCore/MappedFile.h>
8#include <LibGfx/ICC/BinaryWriter.h>
9#include <LibGfx/ICC/Profile.h>
10#include <LibGfx/JPEGLoader.h>
11#include <LibGfx/PNGLoader.h>
12#include <LibGfx/WebPLoader.h>
13#include <LibTest/TestCase.h>
14
15#ifdef AK_OS_SERENITY
16# define TEST_INPUT(x) ("/usr/Tests/LibGfx/test-inputs/" x)
17#else
18# define TEST_INPUT(x) ("test-inputs/" x)
19#endif
20
21TEST_CASE(png)
22{
23 auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc-v2.png"sv)));
24 auto png = MUST(Gfx::PNGImageDecoderPlugin::create(file->bytes()));
25 EXPECT(png->initialize());
26 auto icc_bytes = MUST(png->icc_data());
27 EXPECT(icc_bytes.has_value());
28
29 auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value()));
30 EXPECT(icc_profile->is_v2());
31}
32
33TEST_CASE(jpg)
34{
35 auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc-v4.jpg"sv)));
36 auto jpg = MUST(Gfx::JPEGImageDecoderPlugin::create(file->bytes()));
37 EXPECT(jpg->initialize());
38 auto icc_bytes = MUST(jpg->icc_data());
39 EXPECT(icc_bytes.has_value());
40
41 auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value()));
42 EXPECT(icc_profile->is_v4());
43}
44
45TEST_CASE(webp_extended_lossless)
46{
47 auto file = MUST(Core::MappedFile::map(TEST_INPUT("extended-lossless.webp"sv)));
48 auto webp = MUST(Gfx::WebPImageDecoderPlugin::create(file->bytes()));
49 EXPECT(webp->initialize());
50 auto icc_bytes = MUST(webp->icc_data());
51 EXPECT(icc_bytes.has_value());
52
53 auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value()));
54 EXPECT(icc_profile->is_v2());
55}
56
57TEST_CASE(webp_extended_lossy)
58{
59 auto file = MUST(Core::MappedFile::map(TEST_INPUT("extended-lossy.webp"sv)));
60 auto webp = MUST(Gfx::WebPImageDecoderPlugin::create(file->bytes()));
61 EXPECT(webp->initialize());
62 auto icc_bytes = MUST(webp->icc_data());
63 EXPECT(icc_bytes.has_value());
64
65 auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(icc_bytes.value()));
66 EXPECT(icc_profile->is_v2());
67}
68
69TEST_CASE(serialize_icc)
70{
71 auto file = MUST(Core::MappedFile::map(TEST_INPUT("p3-v4.icc"sv)));
72 auto icc_profile = MUST(Gfx::ICC::Profile::try_load_from_externally_owned_memory(file->bytes()));
73 EXPECT(icc_profile->is_v4());
74
75 auto serialized_bytes = MUST(Gfx::ICC::encode(*icc_profile));
76 EXPECT_EQ(serialized_bytes, file->bytes());
77}