diff --git a/Libraries/LibGfx/GIFLoader.cpp b/Libraries/LibGfx/GIFLoader.cpp index df792891dc..559946cc77 100644 --- a/Libraries/LibGfx/GIFLoader.cpp +++ b/Libraries/LibGfx/GIFLoader.cpp @@ -528,4 +528,28 @@ bool GIFImageDecoderPlugin::sniff() BufferStream stream(buffer); return decode_gif_header(stream).has_value(); } + +bool GIFImageDecoderPlugin::is_animated() +{ + return false; +} + +size_t GIFImageDecoderPlugin::loop_count() +{ + return 0; +} + +size_t GIFImageDecoderPlugin::frame_count() +{ + return 1; +} + +ImageFrameDescriptor GIFImageDecoderPlugin::frame(size_t i) +{ + if (i > 0) { + return { bitmap(), 0 }; + } + return {}; +} + } diff --git a/Libraries/LibGfx/GIFLoader.h b/Libraries/LibGfx/GIFLoader.h index b6599e4b7b..b76b131d19 100644 --- a/Libraries/LibGfx/GIFLoader.h +++ b/Libraries/LibGfx/GIFLoader.h @@ -46,6 +46,10 @@ public: virtual void set_volatile() override; [[nodiscard]] virtual bool set_nonvolatile() override; virtual bool sniff() override; + virtual bool is_animated() override; + virtual size_t loop_count() override; + virtual size_t frame_count() override; + virtual ImageFrameDescriptor frame(size_t i) override; private: OwnPtr m_context; diff --git a/Libraries/LibGfx/ImageDecoder.h b/Libraries/LibGfx/ImageDecoder.h index f300cb4871..bcc08c675c 100644 --- a/Libraries/LibGfx/ImageDecoder.h +++ b/Libraries/LibGfx/ImageDecoder.h @@ -26,15 +26,20 @@ #pragma once -#include #include #include +#include #include namespace Gfx { class Bitmap; +struct ImageFrameDescriptor { + RefPtr image; + int duration { 0 }; +}; + class ImageDecoderPlugin { public: virtual ~ImageDecoderPlugin() {} @@ -47,6 +52,11 @@ public: virtual bool sniff() = 0; + virtual bool is_animated() = 0; + virtual size_t loop_count() = 0; + virtual size_t frame_count() = 0; + virtual ImageFrameDescriptor frame(size_t i) = 0; + protected: ImageDecoderPlugin() {} }; @@ -62,7 +72,11 @@ public: RefPtr bitmap() const; void set_volatile() { m_plugin->set_volatile(); } [[nodiscard]] bool set_nonvolatile() { return m_plugin->set_nonvolatile(); } - bool sniff() { return m_plugin->sniff(); }; + bool sniff() const { return m_plugin->sniff(); } + bool is_animated() const { return m_plugin->is_animated(); } + size_t loop_count() const { return m_plugin->loop_count(); } + size_t frame_count() const { return m_plugin->frame_count(); } + ImageFrameDescriptor frame(size_t i) const { return m_plugin->frame(i); } private: ImageDecoder(const u8*, size_t); diff --git a/Libraries/LibGfx/PNGLoader.cpp b/Libraries/LibGfx/PNGLoader.cpp index 78a3b5a73a..ca7d5136b4 100644 --- a/Libraries/LibGfx/PNGLoader.cpp +++ b/Libraries/LibGfx/PNGLoader.cpp @@ -834,4 +834,27 @@ bool PNGImageDecoderPlugin::sniff() return decode_png_header(*m_context); } +bool PNGImageDecoderPlugin::is_animated() +{ + return false; +} + +size_t PNGImageDecoderPlugin::loop_count() +{ + return 0; +} + +size_t PNGImageDecoderPlugin::frame_count() +{ + return 1; +} + +ImageFrameDescriptor PNGImageDecoderPlugin::frame(size_t i) +{ + if (i > 0) { + return { bitmap(), 0 }; + } + return {}; +} + } diff --git a/Libraries/LibGfx/PNGLoader.h b/Libraries/LibGfx/PNGLoader.h index 7403cdeba5..d6820b931d 100644 --- a/Libraries/LibGfx/PNGLoader.h +++ b/Libraries/LibGfx/PNGLoader.h @@ -46,6 +46,10 @@ public: virtual void set_volatile() override; [[nodiscard]] virtual bool set_nonvolatile() override; virtual bool sniff() override; + virtual bool is_animated() override; + virtual size_t loop_count() override; + virtual size_t frame_count() override; + virtual ImageFrameDescriptor frame(size_t i) override; private: OwnPtr m_context;