PNG loading fixed.
This commit is contained in:
parent
28bd73a1f7
commit
05a8d0188c
1 changed files with 12 additions and 8 deletions
|
@ -7,6 +7,8 @@
|
|||
#include <cassert>
|
||||
#include <ciso646>
|
||||
#include <png.h>
|
||||
#include <endian.h>
|
||||
#include <vector>
|
||||
|
||||
#define lengthof(a) (static_cast<int32_t>(sizeof(a)) / static_cast<int32_t>(sizeof(a[0])))
|
||||
|
||||
|
@ -18,12 +20,12 @@ namespace cloonel {
|
|||
};
|
||||
|
||||
enum ColorChannelMask {
|
||||
#if SDL_BYTE_ORDER == SDL_BIGENDIAN
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
ColorChannelMask_Red = 0xff000000,
|
||||
ColorChannelMask_Green = 0xff0000,
|
||||
ColorChannelMask_Blue = 0xff00,
|
||||
ColorChannelMask_Alpha = 0xff
|
||||
#elif SDL_BYTE_ORDER == SDL_LITTLEENDIAN
|
||||
#elif __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
ColorChannelMask_Red = 0xff,
|
||||
ColorChannelMask_Green = 0xff00,
|
||||
ColorChannelMask_Blue = 0xff0000,
|
||||
|
@ -47,12 +49,13 @@ namespace cloonel {
|
|||
|
||||
///----------------------------------------------------------------------
|
||||
///----------------------------------------------------------------------
|
||||
SDL_Surface* SurfaceFromPngRGBA (ushort2 parSize, int parBpp, const png_structp& parPngPtr, const png_infop& parInfoPtr) {
|
||||
SDL_Surface* SurfaceFromPngRGBA (ushort2 parSize, int parBpp, const png_structp& parPngPtr, const png_infop& parInfoPtr, std::vector<uint8_t>& parBuff) {
|
||||
const png_size_t stride = png_get_rowbytes(parPngPtr, parInfoPtr);
|
||||
assert(stride > 0);
|
||||
|
||||
std::unique_ptr<uint8_t[]> image(new uint8_t[stride * parSize.y()]);
|
||||
uint8_t* const imagePtr = image.get();
|
||||
parBuff.resize(stride * parSize.y());
|
||||
uint8_t* const imagePtr = parBuff.data();
|
||||
|
||||
for (uint16_t y = 0; y < parSize.y(); ++y) {
|
||||
png_read_row(parPngPtr, imagePtr + stride * y, nullptr);
|
||||
}
|
||||
|
@ -106,7 +109,7 @@ namespace cloonel {
|
|||
///----------------------------------------------------------------------
|
||||
///http://blog.hammerian.net/2009/reading-png-images-from-memory/
|
||||
///----------------------------------------------------------------------
|
||||
SDL_Surface* LoadNewPngSurface (const std::string& parPath) {
|
||||
SDL_Surface* LoadNewPngSurface (const std::string& parPath, std::vector<uint8_t>& parBuff) {
|
||||
PhysicsFSFile rawfile(parPath.c_str(), PhysicsFSFile::OpenMode_Read, "graphics");
|
||||
unsigned char header[8];
|
||||
assert(rawfile.IsOpen());
|
||||
|
@ -151,7 +154,7 @@ namespace cloonel {
|
|||
break;
|
||||
|
||||
case PNG_COLOR_TYPE_RGB_ALPHA:
|
||||
retSurf = SurfaceFromPngRGBA(ushort2(static_cast<uint8_t>(width), static_cast<uint8_t>(height)), bitDepth * 4, pngptr, infoptr);
|
||||
retSurf = SurfaceFromPngRGBA(ushort2(static_cast<uint8_t>(width), static_cast<uint8_t>(height)), bitDepth * 4, pngptr, infoptr, parBuff);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -196,9 +199,10 @@ namespace cloonel {
|
|||
Destroy();
|
||||
|
||||
SDL_Surface* surf = nullptr;
|
||||
std::vector<uint8_t> memBuff;
|
||||
switch (fmt) {
|
||||
case GraphicFormat_Png:
|
||||
surf = LoadNewPngSurface(m_path.c_str());
|
||||
surf = LoadNewPngSurface(m_path.c_str(), memBuff);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in a new issue