mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +00:00
LibGfx+ImageViewer: Replace ImageDecoder::is_vector() with an enum
That makes it easier to extend to other special frame formats.
This commit is contained in:
parent
a47edb4ed1
commit
c997ee7b9d
3 changed files with 11 additions and 4 deletions
|
@ -224,7 +224,7 @@ ErrorOr<void> ViewWidget::try_open_file(String const& path, Core::File& file)
|
||||||
Vector<Animation::Frame> frames;
|
Vector<Animation::Frame> frames;
|
||||||
// Note: Doing this check only requires reading the header of images
|
// Note: Doing this check only requires reading the header of images
|
||||||
// (so if the image is not vector graphics it can be still be decoded OOP).
|
// (so if the image is not vector graphics it can be still be decoded OOP).
|
||||||
if (auto decoder = Gfx::ImageDecoder::try_create_for_raw_bytes(file_data); decoder && decoder->is_vector()) {
|
if (auto decoder = Gfx::ImageDecoder::try_create_for_raw_bytes(file_data); decoder && decoder->natural_frame_format() == Gfx::NaturalFrameFormat::Vector) {
|
||||||
// Use in-process decoding for vector graphics.
|
// Use in-process decoding for vector graphics.
|
||||||
is_animated = decoder->is_animated();
|
is_animated = decoder->is_animated();
|
||||||
loop_count = decoder->loop_count();
|
loop_count = decoder->loop_count();
|
||||||
|
|
|
@ -28,6 +28,11 @@ struct VectorImageFrameDescriptor {
|
||||||
int duration { 0 };
|
int duration { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class NaturalFrameFormat {
|
||||||
|
RGB,
|
||||||
|
Vector,
|
||||||
|
};
|
||||||
|
|
||||||
class ImageDecoderPlugin {
|
class ImageDecoderPlugin {
|
||||||
public:
|
public:
|
||||||
virtual ~ImageDecoderPlugin() = default;
|
virtual ~ImageDecoderPlugin() = default;
|
||||||
|
@ -53,7 +58,7 @@ public:
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) = 0;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) = 0;
|
||||||
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() { return OptionalNone {}; }
|
virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() { return OptionalNone {}; }
|
||||||
|
|
||||||
virtual bool is_vector() { return false; }
|
virtual NaturalFrameFormat natural_frame_format() const { return NaturalFrameFormat::RGB; }
|
||||||
virtual ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t) { VERIFY_NOT_REACHED(); }
|
virtual ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t) { VERIFY_NOT_REACHED(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -75,7 +80,9 @@ public:
|
||||||
ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) const { return m_plugin->frame(index, ideal_size); }
|
ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) const { return m_plugin->frame(index, ideal_size); }
|
||||||
ErrorOr<Optional<ReadonlyBytes>> icc_data() const { return m_plugin->icc_data(); }
|
ErrorOr<Optional<ReadonlyBytes>> icc_data() const { return m_plugin->icc_data(); }
|
||||||
|
|
||||||
bool is_vector() { return m_plugin->is_vector(); }
|
NaturalFrameFormat natural_frame_format() { return m_plugin->natural_frame_format(); }
|
||||||
|
|
||||||
|
// Call only if natural_frame_format() == NaturalFrameFormat::Vector.
|
||||||
ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t index) { return m_plugin->vector_frame(index); }
|
ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t index) { return m_plugin->vector_frame(index); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -83,7 +83,7 @@ public:
|
||||||
virtual IntSize size() override;
|
virtual IntSize size() override;
|
||||||
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) override;
|
virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) override;
|
||||||
|
|
||||||
virtual bool is_vector() override { return true; }
|
virtual NaturalFrameFormat natural_frame_format() const override { return NaturalFrameFormat::Vector; }
|
||||||
virtual ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t index) override;
|
virtual ErrorOr<VectorImageFrameDescriptor> vector_frame(size_t index) override;
|
||||||
|
|
||||||
virtual ~TinyVGImageDecoderPlugin() override = default;
|
virtual ~TinyVGImageDecoderPlugin() override = default;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue