/* * 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 }; OwnPtr stream {}; QOIHeader header {}; RefPtr bitmap; }; class QOIImageDecoderPlugin final : public ImageDecoderPlugin { public: static bool sniff(ReadonlyBytes); static ErrorOr> create(ReadonlyBytes); virtual ~QOIImageDecoderPlugin() override = default; virtual IntSize size() override; virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; private: ErrorOr decode_header_and_update_context(); ErrorOr decode_image_and_update_context(); QOIImageDecoderPlugin(NonnullOwnPtr); OwnPtr m_context; }; } template<> struct AK::Traits : public DefaultTraits { static constexpr bool is_trivially_serializable() { return true; } };