mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-11 02:13:56 +09:00
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.
This commit is contained in:
parent
609a89cfb0
commit
307712b398
Notes:
sideshowbarker
2024-07-17 18:08:55 +09:00
Author: https://github.com/nico
Commit: 307712b398
Pull-request: https://github.com/SerenityOS/serenity/pull/17195
Reviewed-by: https://github.com/linusg ✅
18 changed files with 60 additions and 0 deletions
|
@ -1492,4 +1492,9 @@ ErrorOr<ImageFrameDescriptor> BMPImageDecoderPlugin::frame(size_t index)
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> BMPImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BMPImageDecoderPlugin(u8 const*, size_t, IncludedInICO included_in_ico = IncludedInICO::No);
|
BMPImageDecoderPlugin(u8 const*, size_t, IncludedInICO included_in_ico = IncludedInICO::No);
|
||||||
|
|
|
@ -1024,4 +1024,9 @@ ErrorOr<ImageFrameDescriptor> DDSImageDecoderPlugin::frame(size_t index)
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> DDSImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,6 +248,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DDSImageDecoderPlugin(u8 const*, size_t);
|
DDSImageDecoderPlugin(u8 const*, size_t);
|
||||||
|
|
|
@ -667,4 +667,9 @@ ErrorOr<ImageFrameDescriptor> GIFImageDecoderPlugin::frame(size_t index)
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> GIFImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GIFImageDecoderPlugin(u8 const*, size_t);
|
GIFImageDecoderPlugin(u8 const*, size_t);
|
||||||
|
|
|
@ -278,4 +278,9 @@ ErrorOr<ImageFrameDescriptor> ICOImageDecoderPlugin::frame(size_t index)
|
||||||
return ImageFrameDescriptor { m_context->images[m_context->largest_index].bitmap, 0 };
|
return ImageFrameDescriptor { m_context->images[m_context->largest_index].bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> ICOImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ICOImageDecoderPlugin(u8 const*, size_t);
|
ICOImageDecoderPlugin(u8 const*, size_t);
|
||||||
|
|
|
@ -40,6 +40,7 @@ public:
|
||||||
virtual size_t loop_count() = 0;
|
virtual size_t loop_count() = 0;
|
||||||
virtual size_t frame_count() = 0;
|
virtual size_t frame_count() = 0;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) = 0;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) = 0;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ImageDecoderPlugin() = default;
|
ImageDecoderPlugin() = default;
|
||||||
|
@ -59,6 +60,7 @@ public:
|
||||||
size_t loop_count() const { return m_plugin->loop_count(); }
|
size_t loop_count() const { return m_plugin->loop_count(); }
|
||||||
size_t frame_count() const { return m_plugin->frame_count(); }
|
size_t frame_count() const { return m_plugin->frame_count(); }
|
||||||
ErrorOr<ImageFrameDescriptor> frame(size_t index) const { return m_plugin->frame(index); }
|
ErrorOr<ImageFrameDescriptor> frame(size_t index) const { return m_plugin->frame(index); }
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> icc_data() const { return m_plugin->icc_data(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ImageDecoder(NonnullOwnPtr<ImageDecoderPlugin>);
|
explicit ImageDecoder(NonnullOwnPtr<ImageDecoderPlugin>);
|
||||||
|
|
|
@ -1178,4 +1178,9 @@ ErrorOr<ImageFrameDescriptor> JPGImageDecoderPlugin::frame(size_t index)
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> JPGImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,10 +26,12 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JPGImageDecoderPlugin(u8 const*, size_t);
|
JPGImageDecoderPlugin(u8 const*, size_t);
|
||||||
|
|
||||||
OwnPtr<JPGLoadingContext> m_context;
|
OwnPtr<JPGLoadingContext> m_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -963,4 +963,9 @@ ErrorOr<ImageFrameDescriptor> PNGImageDecoderPlugin::frame(size_t index)
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> PNGImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PNGImageDecoderPlugin(u8 const*, size_t);
|
PNGImageDecoderPlugin(u8 const*, size_t);
|
||||||
|
|
|
@ -65,6 +65,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OwnPtr<TContext> m_context;
|
OwnPtr<TContext> m_context;
|
||||||
|
@ -183,4 +184,11 @@ ErrorOr<ImageFrameDescriptor> PortableImageDecoderPlugin<TContext>::frame(size_t
|
||||||
VERIFY(m_context->bitmap);
|
VERIFY(m_context->bitmap);
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename TContext>
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> PortableImageDecoderPlugin<TContext>::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,4 +262,9 @@ ErrorOr<void> QOIImageDecoderPlugin::decode_image_and_update_context(Core::Strea
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> QOIImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ public:
|
||||||
virtual size_t loop_count() override { return 0; }
|
virtual size_t loop_count() override { return 0; }
|
||||||
virtual size_t frame_count() override { return 1; }
|
virtual size_t frame_count() override { return 1; }
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ErrorOr<void> decode_header_and_update_context(Core::Stream::Stream&);
|
ErrorOr<void> decode_header_and_update_context(Core::Stream::Stream&);
|
||||||
|
|
|
@ -359,4 +359,10 @@ ErrorOr<ImageFrameDescriptor> TGAImageDecoderPlugin::frame(size_t index)
|
||||||
m_context->bitmap = bitmap;
|
m_context->bitmap = bitmap;
|
||||||
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
return ImageFrameDescriptor { m_context->bitmap, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<Optional<ReadonlyBytes>> TGAImageDecoderPlugin::icc_data()
|
||||||
|
{
|
||||||
|
return OptionalNone {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public:
|
||||||
virtual size_t loop_count() override;
|
virtual size_t loop_count() override;
|
||||||
virtual size_t frame_count() override;
|
virtual size_t frame_count() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index) override;
|
||||||
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool decode_tga_header();
|
bool decode_tga_header();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue