From 307712b3985978854b29e6ed7ec72804be68a22f Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 26 Jan 2023 07:23:59 -0500 Subject: [PATCH] LibGfx: Add a method to ImageDecoderPlugin for reading ICC data This probably won't be the final API for getting color spaces from images, since some formats just store an "is sRGB?" flag instead of a full profile. Instead, once everything works, we probably want to give every Bitmap a pointer to some color space abstraction. But we can always change this later, once things are further along and better understood. --- Userland/Libraries/LibGfx/BMPLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/BMPLoader.h | 1 + Userland/Libraries/LibGfx/DDSLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/DDSLoader.h | 1 + Userland/Libraries/LibGfx/GIFLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/GIFLoader.h | 1 + Userland/Libraries/LibGfx/ICOLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/ICOLoader.h | 1 + Userland/Libraries/LibGfx/ImageDecoder.h | 2 ++ Userland/Libraries/LibGfx/JPGLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/JPGLoader.h | 2 ++ Userland/Libraries/LibGfx/PNGLoader.cpp | 5 +++++ Userland/Libraries/LibGfx/PNGLoader.h | 1 + Userland/Libraries/LibGfx/PortableImageMapLoader.h | 8 ++++++++ Userland/Libraries/LibGfx/QOILoader.cpp | 5 +++++ Userland/Libraries/LibGfx/QOILoader.h | 1 + Userland/Libraries/LibGfx/TGALoader.cpp | 6 ++++++ Userland/Libraries/LibGfx/TGALoader.h | 1 + 18 files changed, 60 insertions(+) diff --git a/Userland/Libraries/LibGfx/BMPLoader.cpp b/Userland/Libraries/LibGfx/BMPLoader.cpp index 4109adc9a31..5cf8e8ca373 100644 --- a/Userland/Libraries/LibGfx/BMPLoader.cpp +++ b/Userland/Libraries/LibGfx/BMPLoader.cpp @@ -1492,4 +1492,9 @@ ErrorOr BMPImageDecoderPlugin::frame(size_t index) return ImageFrameDescriptor { m_context->bitmap, 0 }; } +ErrorOr> BMPImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/BMPLoader.h b/Userland/Libraries/LibGfx/BMPLoader.h index 6f21d7bd664..0880cf9112e 100644 --- a/Userland/Libraries/LibGfx/BMPLoader.h +++ b/Userland/Libraries/LibGfx/BMPLoader.h @@ -36,6 +36,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: BMPImageDecoderPlugin(u8 const*, size_t, IncludedInICO included_in_ico = IncludedInICO::No); diff --git a/Userland/Libraries/LibGfx/DDSLoader.cpp b/Userland/Libraries/LibGfx/DDSLoader.cpp index ca84bcb777a..80233d86aa0 100644 --- a/Userland/Libraries/LibGfx/DDSLoader.cpp +++ b/Userland/Libraries/LibGfx/DDSLoader.cpp @@ -1024,4 +1024,9 @@ ErrorOr DDSImageDecoderPlugin::frame(size_t index) return ImageFrameDescriptor { m_context->bitmap, 0 }; } +ErrorOr> DDSImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/DDSLoader.h b/Userland/Libraries/LibGfx/DDSLoader.h index 1c56ae2af1a..5a8fc30e0cf 100644 --- a/Userland/Libraries/LibGfx/DDSLoader.h +++ b/Userland/Libraries/LibGfx/DDSLoader.h @@ -248,6 +248,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: DDSImageDecoderPlugin(u8 const*, size_t); diff --git a/Userland/Libraries/LibGfx/GIFLoader.cpp b/Userland/Libraries/LibGfx/GIFLoader.cpp index 88c7c48e984..ca9369c5dae 100644 --- a/Userland/Libraries/LibGfx/GIFLoader.cpp +++ b/Userland/Libraries/LibGfx/GIFLoader.cpp @@ -667,4 +667,9 @@ ErrorOr GIFImageDecoderPlugin::frame(size_t index) return frame; } +ErrorOr> GIFImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/GIFLoader.h b/Userland/Libraries/LibGfx/GIFLoader.h index fc78f9ca103..0492945f206 100644 --- a/Userland/Libraries/LibGfx/GIFLoader.h +++ b/Userland/Libraries/LibGfx/GIFLoader.h @@ -28,6 +28,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: GIFImageDecoderPlugin(u8 const*, size_t); diff --git a/Userland/Libraries/LibGfx/ICOLoader.cpp b/Userland/Libraries/LibGfx/ICOLoader.cpp index 242015ffb92..ba27bc67cf6 100644 --- a/Userland/Libraries/LibGfx/ICOLoader.cpp +++ b/Userland/Libraries/LibGfx/ICOLoader.cpp @@ -278,4 +278,9 @@ ErrorOr ICOImageDecoderPlugin::frame(size_t index) return ImageFrameDescriptor { m_context->images[m_context->largest_index].bitmap, 0 }; } +ErrorOr> ICOImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/ICOLoader.h b/Userland/Libraries/LibGfx/ICOLoader.h index 8136319e575..539d6a3bb06 100644 --- a/Userland/Libraries/LibGfx/ICOLoader.h +++ b/Userland/Libraries/LibGfx/ICOLoader.h @@ -27,6 +27,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: ICOImageDecoderPlugin(u8 const*, size_t); diff --git a/Userland/Libraries/LibGfx/ImageDecoder.h b/Userland/Libraries/LibGfx/ImageDecoder.h index a8ceae3a785..f44248ee92d 100644 --- a/Userland/Libraries/LibGfx/ImageDecoder.h +++ b/Userland/Libraries/LibGfx/ImageDecoder.h @@ -40,6 +40,7 @@ public: virtual size_t loop_count() = 0; virtual size_t frame_count() = 0; virtual ErrorOr frame(size_t index) = 0; + virtual ErrorOr> icc_data() = 0; protected: ImageDecoderPlugin() = default; @@ -59,6 +60,7 @@ public: size_t loop_count() const { return m_plugin->loop_count(); } size_t frame_count() const { return m_plugin->frame_count(); } ErrorOr frame(size_t index) const { return m_plugin->frame(index); } + ErrorOr> icc_data() const { return m_plugin->icc_data(); } private: explicit ImageDecoder(NonnullOwnPtr); diff --git a/Userland/Libraries/LibGfx/JPGLoader.cpp b/Userland/Libraries/LibGfx/JPGLoader.cpp index dd0168d9249..cbc4e03b8ed 100644 --- a/Userland/Libraries/LibGfx/JPGLoader.cpp +++ b/Userland/Libraries/LibGfx/JPGLoader.cpp @@ -1178,4 +1178,9 @@ ErrorOr JPGImageDecoderPlugin::frame(size_t index) return ImageFrameDescriptor { m_context->bitmap, 0 }; } +ErrorOr> JPGImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/JPGLoader.h b/Userland/Libraries/LibGfx/JPGLoader.h index f1ab0de78e4..0d738aea732 100644 --- a/Userland/Libraries/LibGfx/JPGLoader.h +++ b/Userland/Libraries/LibGfx/JPGLoader.h @@ -26,10 +26,12 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: JPGImageDecoderPlugin(u8 const*, size_t); OwnPtr m_context; }; + } diff --git a/Userland/Libraries/LibGfx/PNGLoader.cpp b/Userland/Libraries/LibGfx/PNGLoader.cpp index 88265df77e8..b970658bf90 100644 --- a/Userland/Libraries/LibGfx/PNGLoader.cpp +++ b/Userland/Libraries/LibGfx/PNGLoader.cpp @@ -963,4 +963,9 @@ ErrorOr PNGImageDecoderPlugin::frame(size_t index) return ImageFrameDescriptor { m_context->bitmap, 0 }; } +ErrorOr> PNGImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/PNGLoader.h b/Userland/Libraries/LibGfx/PNGLoader.h index 7fa0ae01303..5d04e6a9518 100644 --- a/Userland/Libraries/LibGfx/PNGLoader.h +++ b/Userland/Libraries/LibGfx/PNGLoader.h @@ -27,6 +27,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: PNGImageDecoderPlugin(u8 const*, size_t); diff --git a/Userland/Libraries/LibGfx/PortableImageMapLoader.h b/Userland/Libraries/LibGfx/PortableImageMapLoader.h index 9afc1cce670..105accc6b28 100644 --- a/Userland/Libraries/LibGfx/PortableImageMapLoader.h +++ b/Userland/Libraries/LibGfx/PortableImageMapLoader.h @@ -65,6 +65,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: OwnPtr m_context; @@ -183,4 +184,11 @@ ErrorOr PortableImageDecoderPlugin::frame(size_t VERIFY(m_context->bitmap); return ImageFrameDescriptor { m_context->bitmap, 0 }; } + +template +ErrorOr> PortableImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/QOILoader.cpp b/Userland/Libraries/LibGfx/QOILoader.cpp index f8cde588595..7ed1e1d71a4 100644 --- a/Userland/Libraries/LibGfx/QOILoader.cpp +++ b/Userland/Libraries/LibGfx/QOILoader.cpp @@ -262,4 +262,9 @@ ErrorOr QOIImageDecoderPlugin::decode_image_and_update_context(Core::Strea return {}; } +ErrorOr> QOIImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/QOILoader.h b/Userland/Libraries/LibGfx/QOILoader.h index f973e0fdefc..05925beb1da 100644 --- a/Userland/Libraries/LibGfx/QOILoader.h +++ b/Userland/Libraries/LibGfx/QOILoader.h @@ -53,6 +53,7 @@ public: virtual size_t loop_count() override { return 0; } virtual size_t frame_count() override { return 1; } virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: ErrorOr decode_header_and_update_context(Core::Stream::Stream&); diff --git a/Userland/Libraries/LibGfx/TGALoader.cpp b/Userland/Libraries/LibGfx/TGALoader.cpp index 87ad124a687..f6928d6985d 100644 --- a/Userland/Libraries/LibGfx/TGALoader.cpp +++ b/Userland/Libraries/LibGfx/TGALoader.cpp @@ -359,4 +359,10 @@ ErrorOr TGAImageDecoderPlugin::frame(size_t index) m_context->bitmap = bitmap; return ImageFrameDescriptor { m_context->bitmap, 0 }; } + +ErrorOr> TGAImageDecoderPlugin::icc_data() +{ + return OptionalNone {}; +} + } diff --git a/Userland/Libraries/LibGfx/TGALoader.h b/Userland/Libraries/LibGfx/TGALoader.h index d2de9fecae8..b6a4b7bfdf8 100644 --- a/Userland/Libraries/LibGfx/TGALoader.h +++ b/Userland/Libraries/LibGfx/TGALoader.h @@ -28,6 +28,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual ErrorOr frame(size_t index) override; + virtual ErrorOr> icc_data() override; private: bool decode_tga_header();