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 4109adc9a3..5cf8e8ca37 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 6f21d7bd66..0880cf9112 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 ca84bcb777..80233d86aa 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 1c56ae2af1..5a8fc30e0c 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 88c7c48e98..ca9369c5da 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 fc78f9ca10..0492945f20 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 242015ffb9..ba27bc67cf 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 8136319e57..539d6a3bb0 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 a8ceae3a78..f44248ee92 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 dd0168d924..cbc4e03b8e 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 f1ab0de78e..0d738aea73 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 88265df77e..b970658bf9 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 7fa0ae0130..5d04e6a951 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 9afc1cce67..105accc6b2 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 f8cde58859..7ed1e1d71a 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 f973e0fdef..05925beb1d 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 87ad124a68..f6928d6985 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 d2de9fecae..b6a4b7bfdf 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();