/* * Copyright (c) 2021, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Gfx { // Decoder for the "Quite OK Image" format (v1.0). // https://qoiformat.org/qoi-specification.pdf struct [[gnu::packed]] QOIHeader { char magic[4]; u32 width; u32 height; u8 channels; u8 colorspace; }; struct QOILoadingContext { enum class State { NotDecoded = 0, HeaderDecoded, ImageDecoded, Error, }; State state { State::NotDecoded }; u8 const* data { nullptr }; size_t data_size { 0 }; QOIHeader header {}; RefPtr bitmap; Optional error; }; class QOIImageDecoderPlugin final : public ImageDecoderPlugin { public: virtual ~QOIImageDecoderPlugin() override = default; QOIImageDecoderPlugin(u8 const*, size_t); virtual IntSize size() override; virtual void set_volatile() override; [[nodiscard]] virtual bool set_nonvolatile(bool& was_purged) override; virtual bool sniff() override; virtual bool is_animated() override { return false; } virtual size_t loop_count() override { return 0; } virtual size_t frame_count() override { return 1; } virtual ErrorOr frame(size_t index) override; private: ErrorOr decode_header_and_update_context(InputMemoryStream&); ErrorOr decode_image_and_update_context(InputMemoryStream&); OwnPtr m_context; }; }