54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
------------------------------------------------------------------------------*/
|
|
|
|
|
|
#include "pict_io_stb/pict_stb_codec.h"
|
|
#include "picture/pict.h"
|
|
#include "filesystem/io_handle.h"
|
|
#include "container/narray.h"
|
|
#include "memory/memory.h"
|
|
#include "log/log.h"
|
|
|
|
#define STBI_NO_STDIO
|
|
#include "stb_image.h"
|
|
|
|
using namespace GS;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
static int n_stb_read_h(void *user, char *data, int size)
|
|
{ return ((IO::Handle *)user)->Read(data, size); }
|
|
static void n_stb_skip_h(void *user, unsigned n)
|
|
{ ((IO::Handle *)user)->Seek(n); }
|
|
static int n_stb_eof_h(void *user)
|
|
{ return ((IO::Handle *)user)->IsEOF() ? 1 : 0; }
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool PictureSTBCodec::Load(IO::Handle &handle, Picture &picture)
|
|
{
|
|
handle.Rewind();
|
|
|
|
stbi_io_callbacks cb;
|
|
cb.read = &n_stb_read_h;
|
|
cb.skip = &n_stb_skip_h;
|
|
cb.eof = &n_stb_eof_h;
|
|
|
|
/*
|
|
Swizzle and transfer to C++ allocation.
|
|
Watch the memory peak!...
|
|
*/
|
|
int comp, width, height;
|
|
if (char *c_data = (char *)stbi_load_from_callbacks(&cb, &handle, &width, &height, &comp, STBI_rgb_alpha))
|
|
{
|
|
picture.AllocAs(width, height);
|
|
if (char *p_data = (char *)picture.GetData())
|
|
Memory::Copy(p_data, c_data, width * height * 4);
|
|
stbi_image_free(c_data);
|
|
}
|
|
return asbool(picture.GetData());
|
|
}
|
|
//-----------------------------------------------------------------------------
|