// // libpixel // // (C) 2021-2022 modeco80 // // SPDX-License-Identifier: LGPL-3.0-or-later // #ifndef LIBPIXEL_RGBAIMAGE_H #define LIBPIXEL_RGBAIMAGE_H #include #include #include #include namespace pixel { /** * Simple image size structure. * Pass by value. */ struct ImageSize { std::uint16_t width {}; std::uint16_t height {}; }; /** * A standard RGBA8888 image. */ struct RgbaImage { RgbaImage(); // Technically it's a postcondition that the object not be used after destruction, // so unique_ptr default delete behaviour works just fine. //~RgbaImage(); /** * Constructor taking in an image size. * Shorthand for creating an image and then doing Resize(size). * \see RgbaImage::Resize */ explicit RgbaImage(ImageSize size); // Shouldn't copy. RgbaImage(const RgbaImage&) = delete; RgbaImage(RgbaImage&& movee) noexcept; /** * Resize this image. * \param[in] size Size to resize to. */ void Resize(ImageSize size); /** * Clear this image, freeing its buffer. */ void Clear(); /** * Get access to this image's data buffer (const version). * \return A const pointer to the image buffer. */ [[nodiscard]] const RgbaColor* GetBuffer() const; /** * Get access to this image's data buffer for writing * \return A pointer to the image buffer. */ [[nodiscard]] RgbaColor* GetBuffer(); /** * Get the stride of this image. * \return The stride. */ [[nodiscard]] std::size_t GetStride() const; /** * Get the size of this image. * \return The size. */ [[nodiscard]] ImageSize GetSize() const; // Methods for easy sampling/conversion. // Note: // Palette for all palletized formats is expected to have // been converted via RgbaColor::PaletteFrom*Bpp() or // already in RgbaColor format. static RgbaImage From4Bpp(const std::uint8_t* data, const RgbaColor* palette, ImageSize size); static RgbaImage From8Bpp(const std::uint8_t* data, const RgbaColor* palette, ImageSize size); // static RgbaImage From16Bpp(span data, ImageSize size); // static RgbaImage From32Bpp(span data, ImageSize size); private: ImageSize size {}; std::unique_ptr pixels; }; } // namespace pixel #endif // TIPDUMP_RGBAIMAGE_H