1
0
Fork 0
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:
Nico Weber 2023-01-26 07:23:59 -05:00 committed by Linus Groh
parent 609a89cfb0
commit 307712b398
Notes: sideshowbarker 2024-07-17 18:08:55 +09:00
18 changed files with 60 additions and 0 deletions

View file

@ -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 {};
}
} }

View file

@ -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);

View file

@ -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 {};
}
} }

View file

@ -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);

View file

@ -667,4 +667,9 @@ ErrorOr<ImageFrameDescriptor> GIFImageDecoderPlugin::frame(size_t index)
return frame; return frame;
} }
ErrorOr<Optional<ReadonlyBytes>> GIFImageDecoderPlugin::icc_data()
{
return OptionalNone {};
}
} }

View file

@ -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);

View file

@ -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 {};
}
} }

View file

@ -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);

View file

@ -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>);

View file

@ -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 {};
}
} }

View file

@ -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;
}; };
} }

View file

@ -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 {};
}
} }

View file

@ -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);

View file

@ -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 {};
}
} }

View file

@ -262,4 +262,9 @@ ErrorOr<void> QOIImageDecoderPlugin::decode_image_and_update_context(Core::Strea
return {}; return {};
} }
ErrorOr<Optional<ReadonlyBytes>> QOIImageDecoderPlugin::icc_data()
{
return OptionalNone {};
}
} }

View file

@ -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&);

View file

@ -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 {};
}
} }

View file

@ -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();