#pragma once #include #include #include #include class GraphicsBitmap; class ImageDecoderPlugin { public: virtual ~ImageDecoderPlugin() {} virtual Size size() = 0; virtual RefPtr bitmap() = 0; virtual void set_volatile() = 0; [[nodiscard]] virtual bool set_nonvolatile() = 0; protected: ImageDecoderPlugin() {} }; class ImageDecoder : public RefCounted { public: static NonnullRefPtr create(const u8* data, size_t size) { return adopt(*new ImageDecoder(data, size)); } ~ImageDecoder(); Size size() const { return m_plugin->size(); } int width() const { return size().width(); } int height() const { return size().height(); } RefPtr bitmap() const { return m_plugin->bitmap(); } void set_volatile() { m_plugin->set_volatile(); } [[nodiscard]] bool set_nonvolatile() { return m_plugin->set_nonvolatile(); } private: ImageDecoder(const u8*, size_t); mutable OwnPtr m_plugin; };