refactor VxImageDescEx
This commit is contained in:
@ -9,23 +9,23 @@ namespace LibCmo::CK2 {
|
||||
|
||||
#pragma region Assist RW Functions
|
||||
|
||||
bool CKBitmapData::ReadSpecificFormatBitmap(CKStateChunk* chk, CKBitmapSlot* slot) {
|
||||
bool CKBitmapData::ReadSpecificFormatBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CKBitmapData::ReadRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot) {
|
||||
bool CKBitmapData::ReadRawBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CKBitmapData::ReadOldRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot) {
|
||||
bool CKBitmapData::ReadOldRawBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void CKBitmapData::WriteSpecificFormatBitmap(CKStateChunk* chk, CKBitmapSlot* slot) {
|
||||
void CKBitmapData::WriteSpecificFormatBitmap(CKStateChunk* chk, const VxMath::VxImageDescEx* slot) {
|
||||
|
||||
}
|
||||
|
||||
void CKBitmapData::WriteRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot) {
|
||||
void CKBitmapData::WriteRawBitmap(CKStateChunk* chk, const VxMath::VxImageDescEx* slot) {
|
||||
|
||||
}
|
||||
|
||||
@ -51,7 +51,7 @@ namespace LibCmo::CK2 {
|
||||
if (width > 0 && height > 0) {
|
||||
for (CKDWORD i = 0; i < slotcount; ++i) {
|
||||
CreateImage(width, height, i);
|
||||
if (ReadSpecificFormatBitmap(chunk, GetImageSlot(i))) {
|
||||
if (ReadSpecificFormatBitmap(chunk, GetImageDesc(i))) {
|
||||
notReadSlot[i] = true;
|
||||
} else {
|
||||
ReleaseImage(i);
|
||||
@ -68,7 +68,7 @@ namespace LibCmo::CK2 {
|
||||
notReadSlot.resize(slotcount, false);
|
||||
|
||||
for (CKDWORD i = 0; i < slotcount; ++i) {
|
||||
if (ReadRawBitmap(chunk, GetImageSlot(i))) {
|
||||
if (ReadRawBitmap(chunk, GetImageDesc(i))) {
|
||||
notReadSlot[i] = true;
|
||||
} else {
|
||||
ReleaseImage(i);
|
||||
@ -84,7 +84,7 @@ namespace LibCmo::CK2 {
|
||||
notReadSlot.resize(slotcount, false);
|
||||
|
||||
for (CKDWORD i = 0; i < slotcount; ++i) {
|
||||
if (ReadOldRawBitmap(chunk, GetImageSlot(i))) {
|
||||
if (ReadOldRawBitmap(chunk, GetImageDesc(i))) {
|
||||
notReadSlot[i] = true;
|
||||
} else {
|
||||
ReleaseImage(i);
|
||||
@ -165,7 +165,8 @@ namespace LibCmo::CK2 {
|
||||
if (Slot >= m_Slots.size()) return;
|
||||
|
||||
CKBitmapSlot& slotdata = m_Slots[Slot];
|
||||
slotdata.CreateImage(Width, Height);
|
||||
slotdata.m_ImageData.CreateImage(Width, Height);
|
||||
VxMath::VxDoAlphaBlit(&slotdata.m_ImageData, 0xFFu);
|
||||
}
|
||||
|
||||
bool CKBitmapData::LoadImage(CKSTRING filename, CKDWORD slot) {
|
||||
@ -203,17 +204,12 @@ namespace LibCmo::CK2 {
|
||||
|
||||
VxMath::VxImageDescEx* CKBitmapData::GetImageDesc(CKDWORD slot) {
|
||||
if (slot >= m_Slots.size()) return nullptr;
|
||||
return m_Slots[slot].m_ImageData;
|
||||
}
|
||||
|
||||
CKBitmapSlot* CKBitmapData::GetImageSlot(CKDWORD slot) {
|
||||
if (slot >= m_Slots.size()) return nullptr;
|
||||
return &m_Slots[slot];
|
||||
return &m_Slots[slot].m_ImageData;
|
||||
}
|
||||
|
||||
void CKBitmapData::ReleaseImage(CKDWORD slot) {
|
||||
if (slot >= m_Slots.size()) return;
|
||||
m_Slots[slot].FreeImage();
|
||||
m_Slots[slot].m_ImageData.FreeImage();
|
||||
}
|
||||
|
||||
void CKBitmapData::SetSlotFileName(CKDWORD slot, CKSTRING filename) {
|
||||
|
@ -24,50 +24,11 @@ namespace LibCmo::CK2 {
|
||||
class CKBitmapSlot {
|
||||
public:
|
||||
CKBitmapSlot() :
|
||||
m_ImageData(nullptr), m_FileName() {}
|
||||
~CKBitmapSlot() {
|
||||
FreeImage();
|
||||
}
|
||||
CKBitmapSlot(const CKBitmapSlot& rhs) :
|
||||
m_ImageData(nullptr), m_FileName(rhs.m_FileName) {
|
||||
if (rhs.m_ImageData != nullptr) {
|
||||
m_ImageData = new VxMath::VxImageDescEx(*rhs.m_ImageData);
|
||||
}
|
||||
}
|
||||
CKBitmapSlot(CKBitmapSlot&& rhs) :
|
||||
m_ImageData(rhs.m_ImageData), m_FileName(std::move(rhs.m_FileName)) {
|
||||
rhs.m_ImageData = nullptr;
|
||||
}
|
||||
CKBitmapSlot& operator=(const CKBitmapSlot& rhs) {
|
||||
m_FileName = rhs.m_FileName;
|
||||
m_ImageData(), m_FileName() {}
|
||||
~CKBitmapSlot() {}
|
||||
LIBCMO_DEFAULT_COPY_MOVE(CKBitmapSlot);
|
||||
|
||||
FreeImage();
|
||||
if (rhs.m_ImageData != nullptr) {
|
||||
m_ImageData = new VxMath::VxImageDescEx(*rhs.m_ImageData);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
CKBitmapSlot& operator=(CKBitmapSlot&& rhs) {
|
||||
m_FileName = std::move(rhs.m_FileName);
|
||||
|
||||
FreeImage();
|
||||
m_ImageData = rhs.m_ImageData;
|
||||
rhs.m_ImageData = nullptr;
|
||||
}
|
||||
|
||||
void CreateImage(CKDWORD Width, CKDWORD Height) {
|
||||
FreeImage();
|
||||
m_ImageData = new VxMath::VxImageDescEx(Width, Height);
|
||||
}
|
||||
void FreeImage() {
|
||||
if (m_ImageData != nullptr) {
|
||||
delete m_ImageData;
|
||||
m_ImageData = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
VxMath::VxImageDescEx* m_ImageData;
|
||||
VxMath::VxImageDescEx m_ImageData;
|
||||
XContainer::XString m_FileName;
|
||||
};
|
||||
|
||||
@ -77,11 +38,11 @@ namespace LibCmo::CK2 {
|
||||
~CKBitmapData();
|
||||
LIBCMO_DISABLE_COPY_MOVE(CKBitmapData);
|
||||
|
||||
static bool ReadSpecificFormatBitmap(CKStateChunk* chk, CKBitmapSlot* slot);
|
||||
static bool ReadRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot);
|
||||
static bool ReadOldRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot);
|
||||
static void WriteSpecificFormatBitmap(CKStateChunk* chk, CKBitmapSlot* slot);
|
||||
static void WriteRawBitmap(CKStateChunk* chk, CKBitmapSlot* slot);
|
||||
static bool ReadSpecificFormatBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot);
|
||||
static bool ReadRawBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot);
|
||||
static bool ReadOldRawBitmap(CKStateChunk* chk, VxMath::VxImageDescEx* slot);
|
||||
static void WriteSpecificFormatBitmap(CKStateChunk* chk, const VxMath::VxImageDescEx* slot);
|
||||
static void WriteRawBitmap(CKStateChunk* chk, const VxMath::VxImageDescEx* slot);
|
||||
|
||||
bool ReadFromChunk(CKStateChunk* chunk, CKFileVisitor* file, const CKBitmapDataReadIdentifiers& identifiers);
|
||||
bool DumpToChunk(CKStateChunk* chunk, CKFileVisitor* file, const CKBitmapDataWriteIdentifiers& identifiers);
|
||||
@ -95,7 +56,6 @@ namespace LibCmo::CK2 {
|
||||
bool LoadImage(CKSTRING filename, CKDWORD slot);
|
||||
bool SaveImage(CKSTRING filename, CKDWORD slot);
|
||||
VxMath::VxImageDescEx* GetImageDesc(CKDWORD slot);
|
||||
CKBitmapSlot* GetImageSlot(CKDWORD slot);
|
||||
void ReleaseImage(CKDWORD slot);
|
||||
|
||||
void SetSlotFileName(CKDWORD slot, CKSTRING filename);
|
||||
|
@ -53,29 +53,6 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
);
|
||||
}
|
||||
|
||||
static void PostRead(stbi_uc* data, int x, int y, VxMath::VxImageDescEx* read_image) {
|
||||
// scale image if need
|
||||
if (x != read_image->GetWidth() || y != read_image->GetHeight()) {
|
||||
// alloc
|
||||
CKBYTE* newdata = new CKBYTE[read_image->GetImageSize()];
|
||||
// resize
|
||||
stbir_resize(
|
||||
data, x, y, 0,
|
||||
newdata, static_cast<int>(read_image->GetWidth()), static_cast<int>(read_image->GetHeight()), 0,
|
||||
STBIR_TYPE_UINT8, 4, STBIR_ALPHA_CHANNEL_NONE, 0, // no alpha channel, mean we treat alpha channel as a normal color factor.
|
||||
STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
|
||||
STBIR_FILTER_BOX, STBIR_FILTER_BOX,
|
||||
STBIR_COLORSPACE_SRGB, nullptr
|
||||
);
|
||||
// copy data
|
||||
RGBAToARGB(read_image->GetPixelCount(), newdata, read_image->GetMutableImage());
|
||||
// free
|
||||
delete[] newdata;
|
||||
} else {
|
||||
// copy data RGBA -> ARGB
|
||||
RGBAToARGB(read_image->GetPixelCount(), data, read_image->GetMutableImage());
|
||||
}
|
||||
}
|
||||
static bool StbReadFile(CKSTRING u8filename, VxMath::VxImageDescEx* read_image) {
|
||||
if (u8filename == nullptr || read_image == nullptr) return false;
|
||||
FILE* fs = EncodingHelper::U8FOpen(u8filename, "rb");
|
||||
@ -87,8 +64,11 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
std::fclose(fs);
|
||||
if (data == nullptr) return false;
|
||||
|
||||
// scale image if need
|
||||
PostRead(data, x, y, read_image);
|
||||
// create read image
|
||||
read_image->CreateImage(static_cast<CKDWORD>(x), static_cast<CKDWORD>(y));
|
||||
|
||||
// copy data
|
||||
RGBAToARGB(read_image->GetPixelCount(), data, read_image->GetMutableImage());
|
||||
|
||||
// clear data
|
||||
stbi_image_free(data);
|
||||
@ -106,9 +86,12 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
&x, &y, &channels_in_file, 4 // 4 == RGBA8888
|
||||
);
|
||||
if (data == nullptr) return false;
|
||||
|
||||
// create read image
|
||||
read_image->CreateImage(static_cast<CKDWORD>(x), static_cast<CKDWORD>(y));
|
||||
|
||||
// scale image if need
|
||||
PostRead(data, x, y, read_image);
|
||||
// copy data
|
||||
RGBAToARGB(read_image->GetPixelCount(), data, read_image->GetMutableImage());
|
||||
|
||||
// clear data
|
||||
stbi_image_free(data);
|
||||
|
@ -31,17 +31,11 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
*/
|
||||
static void ReleaseBitmapHandler(CKBitmapHandler* handler);
|
||||
|
||||
/**
|
||||
* @brief Returns the current default bitmap options.
|
||||
* @return Current default bitmap options
|
||||
*/
|
||||
virtual const CKBitmapProperties& GetBitmapDefaultProperties() = 0;
|
||||
|
||||
/**
|
||||
@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 existed image desc which describe this image HW.
|
||||
@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;
|
||||
@ -50,7 +44,7 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
@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 existed image desc which describe this image HW.
|
||||
@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;
|
||||
@ -97,7 +91,8 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
virtual ~CKBitmapBMPHandler();
|
||||
LIBCMO_DISABLE_COPY_MOVE(CKBitmapBMPHandler);
|
||||
|
||||
virtual const CKBitmapProperties& GetBitmapDefaultProperties() override;
|
||||
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;
|
||||
@ -111,7 +106,8 @@ namespace LibCmo::CK2::DataHandlers {
|
||||
virtual ~CKBitmapTGAHandler();
|
||||
LIBCMO_DISABLE_COPY_MOVE(CKBitmapTGAHandler);
|
||||
|
||||
virtual const CKBitmapProperties& GetBitmapDefaultProperties() override;
|
||||
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;
|
||||
|
Reference in New Issue
Block a user