diff --git a/Tests/LibGfx/TestICCProfile.cpp b/Tests/LibGfx/TestICCProfile.cpp index 1f420d7b48..bf4c1005d1 100644 --- a/Tests/LibGfx/TestICCProfile.cpp +++ b/Tests/LibGfx/TestICCProfile.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -76,6 +77,17 @@ TEST_CASE(webp_extended_lossy) EXPECT(icc_profile->is_v2()); } +TEST_CASE(tiff) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc/icc.tiff"sv))); + auto tiff = MUST(Gfx::TIFFImageDecoderPlugin::create(file->bytes())); + auto icc_bytes = MUST(tiff->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()); +} + TEST_CASE(serialize_icc) { auto file = MUST(Core::MappedFile::map(TEST_INPUT("icc/p3-v4.icc"sv))); diff --git a/Tests/LibGfx/test-inputs/icc/icc.tiff b/Tests/LibGfx/test-inputs/icc/icc.tiff new file mode 100644 index 0000000000..a4b6b10a15 Binary files /dev/null and b/Tests/LibGfx/test-inputs/icc/icc.tiff differ diff --git a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp index e829735174..a39e5a5e32 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.cpp @@ -55,6 +55,11 @@ public: return { *m_metadata.image_width(), *m_metadata.image_height() }; } + Metadata const& metadata() const + { + return m_metadata; + } + State state() const { return m_state; @@ -482,6 +487,12 @@ ErrorOr TIFFImageDecoderPlugin::frame(size_t index, Option return ImageFrameDescriptor { m_context->bitmap(), 0 }; } + +ErrorOr> TIFFImageDecoderPlugin::icc_data() +{ + return m_context->metadata().icc_profile().map([](auto const& buffer) -> ReadonlyBytes { return buffer.bytes(); }); +} + } template diff --git a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h index 72cc0ce2ae..f5e896fc61 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/TIFFLoader.h @@ -28,6 +28,8 @@ public: virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; + virtual ErrorOr> icc_data() override; + private: TIFFImageDecoderPlugin(NonnullOwnPtr); diff --git a/Userland/Libraries/LibGfx/TIFFGenerator.py b/Userland/Libraries/LibGfx/TIFFGenerator.py index b98c9bd6a1..5d8e4e129b 100755 --- a/Userland/Libraries/LibGfx/TIFFGenerator.py +++ b/Userland/Libraries/LibGfx/TIFFGenerator.py @@ -59,6 +59,7 @@ known_tags: List[Tag] = [ Tag('278', [TIFFType.UnsignedShort, TIFFType.UnsignedLong], [1], None, "RowsPerStrip"), Tag('279', [TIFFType.UnsignedShort, TIFFType.UnsignedLong], [], None, "StripByteCounts"), Tag('317', [TIFFType.UnsignedShort], [1], Predictor.NoPrediction, "Predictor", Predictor), + Tag('34675', [TIFFType.Undefined], [], None, "ICCProfile"), ] HANDLE_TAG_SIGNATURE_TEMPLATE = ("ErrorOr {namespace}handle_tag(Metadata& metadata, u16 tag,"