#pragma once #include "../../VTInternal.hpp" #include #include namespace LibCmo::CK2::DataHandlers { class CKBitmapHandler; /** * @brief An assist class which can applied to std::unique_ptr as a custom deleter * to make sure the CKBitmapHandler* can be free correctly. */ struct CKBitmapHandlerDeleter { CKBitmapHandlerDeleter() = default; CKBitmapHandlerDeleter(const CKBitmapHandlerDeleter&) noexcept {} void operator()(CKBitmapHandler* handler); }; /** * @brief The type of Auto-free wrapper of CKBitmapHandler. */ using CKBitmapHandlerWrapper_t = std::unique_ptr; /** * The interface about processing bitmap data between raw data and specific data. * This interface will be capable to converting specific bitmap data into raw ARGB8888 raw data, * or convert them back. */ class CKBitmapHandler { public: CKBitmapHandler() {} virtual ~CKBitmapHandler() {} YYCC_DEL_CLS_COPY_MOVE(CKBitmapHandler); /** * @brief General CKBitmapHandler getter. * @param ext[in] The file extention help finding corresponding bitmap handler. * @param guid[in] The GUID of bitmap handler used in fall back finding. * @remark * + Returns a reader capable of reading file with the given extension ext * + It may be several plugins that support the same extension, in which case a preferedGUID identifying the reader that should be returned can be given (optionnal). * @return The pointer to CKBitmapHandler. nullptr if fail to find. */ static CKBitmapHandler* GetBitmapHandler(const CKFileExtension& ext, const CKGUID& guid); /** * @brief A auto free wrapper for GetBitmapHandler */ static CKBitmapHandlerWrapper_t GetBitmapHandlerWrapper(const CKFileExtension& ext, const CKGUID& guid); /** * @brief General CKBitmapHandler disposer * @param handler[in] The handler need to be free. */ static void ReleaseBitmapHandler(CKBitmapHandler* handler); /** @brief Loads a bitmap file. @return Returns true if successful. @param u8filename[in] The file ready to read. @param read_image[out] The pointer point to a blank image desc to receive read image. @see ReadMemory */ virtual bool ReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) = 0; /** @brief Loads a bitmap file stored in memory. @return Returns true if successful. @param memory[in] The pointer to memory. @param size[in] The size of memory. @param read_image[out] The pointer point to a blank image desc to receive read image. @see ReadFile */ virtual bool ReadMemory(const void* memory, CKDWORD size, VxMath::VxImageDescEx* read_image) = 0; /** @brief Saves a image to a file @return Returns true if successful. @param u8filename[in] The file ready to write. @param write_image[in] The image will be written in file. @param codec_param[in] The written image format parameter. @see SaveMemory */ virtual bool SaveFile(CKSTRING u8filename, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) = 0; /** @brief Saves an image into a memory block. @return Returns the number of written bytes if successful, 0 otherwise. @param memory[in] The memory where the image will be written. nullptr if you need a dry run to get how many bytes you need to allocate. @param write_image[in] The image will be written in file. @param codec_param[in] The written image format parameter. @remark + You should call this method first to get how much bytes will be written. + Then you allocate a proper buffer. + Finally, call this method with your allocated buffer to get the result. @see SaveFile */ virtual CKDWORD SaveMemory(void* memory, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) = 0; /** * @brief Check whether this bitmap handler can save alpha data. * @return True if this bitmap handler can save alpha data. */ virtual bool CanSaveAlpha() = 0; }; class CKBitmapBMPHandler : public CKBitmapHandler { public: CKBitmapBMPHandler(); virtual ~CKBitmapBMPHandler(); YYCC_DEL_CLS_COPY_MOVE(CKBitmapBMPHandler); static const CKBitmapProperties& GetBitmapDefaultProperties(); virtual bool ReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) override; virtual bool ReadMemory(const void* memory, CKDWORD size, VxMath::VxImageDescEx* read_image) override; virtual bool SaveFile(CKSTRING u8filename, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual CKDWORD SaveMemory(void* memory, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual bool CanSaveAlpha() override; }; class CKBitmapTGAHandler : public CKBitmapHandler { public: CKBitmapTGAHandler(); virtual ~CKBitmapTGAHandler(); YYCC_DEL_CLS_COPY_MOVE(CKBitmapTGAHandler); static const CKBitmapProperties& GetBitmapDefaultProperties(); virtual bool ReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) override; virtual bool ReadMemory(const void* memory, CKDWORD size, VxMath::VxImageDescEx* read_image) override; virtual bool SaveFile(CKSTRING u8filename, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual CKDWORD SaveMemory(void* memory, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual bool CanSaveAlpha() override; }; class CKBitmapJPGHandler : public CKBitmapHandler { public: CKBitmapJPGHandler(); virtual ~CKBitmapJPGHandler(); YYCC_DEL_CLS_COPY_MOVE(CKBitmapJPGHandler); static const CKBitmapProperties& GetBitmapDefaultProperties(); virtual bool ReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) override; virtual bool ReadMemory(const void* memory, CKDWORD size, VxMath::VxImageDescEx* read_image) override; virtual bool SaveFile(CKSTRING u8filename, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual CKDWORD SaveMemory(void* memory, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual bool CanSaveAlpha() override; }; class CKBitmapPNGHandler : public CKBitmapHandler { public: CKBitmapPNGHandler(); virtual ~CKBitmapPNGHandler(); YYCC_DEL_CLS_COPY_MOVE(CKBitmapPNGHandler); static const CKBitmapProperties& GetBitmapDefaultProperties(); virtual bool ReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) override; virtual bool ReadMemory(const void* memory, CKDWORD size, VxMath::VxImageDescEx* read_image) override; virtual bool SaveFile(CKSTRING u8filename, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual CKDWORD SaveMemory(void* memory, const VxMath::VxImageDescEx* write_image, const CKBitmapProperties& codec_param) override; virtual bool CanSaveAlpha() override; }; }