SilentPatch/SilentPatchSA/PNGFile.cpp
2017-04-09 23:17:49 +02:00

55 lines
1.6 KiB
C++

#include "StdAfxSA.h"
#include "PNGFile.h"
RwTexture* CPNGFile::ReadFromFile(const char* pFileName)
{
RwTexture* pTexture = nullptr;
if ( RwImage* pImage = RtPNGImageRead(pFileName) )
{
RwInt32 dwWidth, dwHeight, dwDepth, dwFlags;
RwImageFindRasterFormat(pImage, rwRASTERTYPETEXTURE, &dwWidth, &dwHeight, &dwDepth, &dwFlags);
if ( RwRaster* pRaster = RwRasterCreate(dwWidth, dwHeight, dwDepth, dwFlags) )
{
RwRasterSetFromImage(pRaster, pImage);
pTexture = RwTextureCreate(pRaster);
//if ( pTexture )
// RwTextureSetName(pTexture, pFileName);
}
RwImageDestroy(pImage);
}
return pTexture;
}
RwTexture* CPNGFile::ReadFromMemory(const void* pMemory, unsigned int nLen)
{
static uint8_t* const pMem = AddressByVersion<uint8_t*>(0x7CF9CA, 0x7D02CA, 0x80998A);
RwTexture* pTexture = nullptr;
uint8_t oldMemory = *pMem;
Memory::VP::Patch<uint8_t>(pMem, rwSTREAMMEMORY);
RwMemory PNGMemory;
PNGMemory.start = const_cast<RwUInt8*>(static_cast<const RwUInt8*>(pMemory));
PNGMemory.length = nLen;
if ( RwImage* pImage = RtPNGImageRead(reinterpret_cast<RwChar*>(&PNGMemory)) )
{
RwInt32 dwWidth, dwHeight, dwDepth, dwFlags;
RwImageFindRasterFormat(pImage, rwRASTERTYPETEXTURE, &dwWidth, &dwHeight, &dwDepth, &dwFlags);
if ( RwRaster* pRaster = RwRasterCreate(dwWidth, dwHeight, dwDepth, dwFlags) )
{
RwRasterSetFromImage(pRaster, pImage);
pTexture = RwTextureCreate(pRaster);
//if ( pTexture )
// RwTextureSetName(pTexture, pFileName);
}
RwImageDestroy(pImage);
}
Memory::VP::Patch<uint8_t>(pMem, oldMemory);
return pTexture;
}