add LoadImage wrapper in CKTexture

This commit is contained in:
2023-10-08 10:42:07 +08:00
parent 812f32bfca
commit 754a281655
6 changed files with 56 additions and 8 deletions

View File

@ -560,7 +560,10 @@ namespace LibCmo::CK2 {
// get extension of file. then get corresponding reader
XContainer::XString ext(filename);
m_Context->GetPathManager()->GetExtension(ext);
auto reader = DataHandlers::CKBitmapHandler::GetBitmapHandlerWrapper(CKFileExtension(ext.c_str()), CKGUID());
auto reader = DataHandlers::CKBitmapHandler::GetBitmapHandlerWrapper(
CKFileExtension(ext.c_str()),
CKGUID()
);
if (reader == nullptr) return false;
// get desc and read data
@ -621,9 +624,9 @@ namespace LibCmo::CK2 {
CKSTRING CKBitmapData::GetSlotFileName(CKDWORD slot) const {
if (slot >= m_Slots.size()) return nullptr;
// return nullptr if no corresponding filename
if (m_Slots[slot].m_FileName.empty()) return nullptr;
else return m_Slots[slot].m_FileName.c_str();
// return nullptr if corresponding filename is empty to indicate there is no binding filename
return XContainer::NSXString::ToCKSTRING(m_Slots[slot].m_FileName);
}
CKDWORD CKBitmapData::GetWidth() const {

View File

@ -270,6 +270,8 @@ namespace LibCmo::CK2 {
va_end(argptr);
// use c_str(), not XContainer::NSXString::ToCKSTRING because we want make sure this paramter is not nullptr.
// we always output a valid C style string, even if no chars need to write.
m_OutputCallback(result.c_str());
}

View File

@ -1,5 +1,7 @@
#include "CKTexture.hpp"
#include "../CKStateChunk.hpp"
#include "../CKContext.hpp"
#include "../MgrImpls/CKPathManager.hpp"
namespace LibCmo::CK2::ObjImpls {
@ -330,6 +332,24 @@ namespace LibCmo::CK2::ObjImpls {
return m_ImageHost;
}
bool CKTexture::LoadImage(CKSTRING filename, CKDWORD slot) {
// check file name
if (filename == nullptr) return false;
// check slot
if (slot >= m_ImageHost.GetSlotCount()) return false;
// resolve file name first
XContainer::XString filepath;
XContainer::NSXString::FromCKSTRING(filepath, filename);
if (!m_Context->GetPathManager()->ResolveFileName(filepath)) return false;
// try loading image
if (!m_ImageHost.LoadImage(XContainer::NSXString::ToCKSTRING(filepath), slot)) return false;
// sync file name
return m_ImageHost.SetSlotFileName(slot, XContainer::NSXString::ToCKSTRING(filepath));
}
bool CKTexture::IsUseMipmap() const {
return m_UseMipMap;
}

View File

@ -21,6 +21,14 @@ namespace LibCmo::CK2::ObjImpls {
CKBitmapData& GetUnderlyingData();
/**
* @brief A wrapper of underlying CKBitmapData::LoadImage. Not only load image, but also set file name.
* @param filename[in] File name of loading image.
* @param slot[in] The slot that image will be loaded into.
* @return True if success.
*/
bool LoadImage(CKSTRING filename, CKDWORD slot);
bool IsUseMipmap() const;
void UseMipmap(bool isUse);
CKDWORD GetMipmapLevel() const;