From c70e27494ce5dcb6cdc7d723fd9606da8124f71e Mon Sep 17 00:00:00 2001 From: Henrique Santiago Date: Fri, 18 Mar 2011 17:39:21 -0300 Subject: [PATCH] textureloader - png - loading from memory without fmemopen --- src/framework/engine.cpp | 2 +- src/framework/textureloader.cpp | 27 ++++++++++++++++----------- src/framework/textureloader.h | 12 +++++++++++- src/framework/win32platform.cpp | 1 + src/main.cpp | 4 ++-- 5 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/framework/win32platform.cpp diff --git a/src/framework/engine.cpp b/src/framework/engine.cpp index 90468bfd..78eebc97 100644 --- a/src/framework/engine.cpp +++ b/src/framework/engine.cpp @@ -60,7 +60,7 @@ void Engine::init() // finally show the window onResize(width, height); Platform::showWindow(); - Platform::hideMouseCursor(); + //Platform::hideMouseCursor(); } void Engine::terminate() diff --git a/src/framework/textureloader.cpp b/src/framework/textureloader.cpp index ef99a1a0..69a3b500 100644 --- a/src/framework/textureloader.cpp +++ b/src/framework/textureloader.cpp @@ -27,18 +27,23 @@ #include -Texture *TextureLoader::loadPNG(const unsigned char *fileData, unsigned int fileSize) +void png_read_from_mem(png_structp png_ptr, png_bytep data, png_size_t size) { - FILE *pngFile = fmemopen((void*)fileData, fileSize, "rb"); + File *file = (File*)png_get_io_ptr(png_ptr); - if(!pngFile) - return NULL; + /* Copy data from image buffer */ + memcpy(data, file->data + file->offset, size); - png_byte sig[8]; - if(!fread(&sig, 8, 1, pngFile)) - return NULL; + /* Advance in the file */ + file->offset += size; +} - if(png_sig_cmp(sig, 0, 8)) +Texture *TextureLoader::loadPNG(unsigned char *fileData, unsigned int fileSize) +{ + File file; + file.data = fileData; + + if(png_sig_cmp(file.data, 0, 8)) return NULL; png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -56,8 +61,9 @@ Texture *TextureLoader::loadPNG(const unsigned char *fileData, unsigned int file return NULL; } - png_init_io(png_ptr, pngFile); - png_set_sig_bytes(png_ptr, 8); + // Set "png_read" callback function and give source of data + png_set_read_fn(png_ptr, (png_voidp *)&file, png_read_from_mem); + png_read_info(png_ptr, info_ptr); int bitDepth = png_get_bit_depth(png_ptr, info_ptr); @@ -113,7 +119,6 @@ Texture *TextureLoader::loadPNG(const unsigned char *fileData, unsigned int file png_read_end(png_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - fclose(pngFile); delete[] row_pointers; Texture *texture = new Texture(width, height, components, pixels); diff --git a/src/framework/textureloader.h b/src/framework/textureloader.h index fdcc78e0..76cac3a0 100644 --- a/src/framework/textureloader.h +++ b/src/framework/textureloader.h @@ -29,10 +29,20 @@ class Texture; +struct File +{ + File() { + offset = 0; + } + + unsigned char *data; + unsigned long offset; +}; + namespace TextureLoader { /// Load a png textures using libpng - Texture *loadPNG(const unsigned char *fileData, unsigned int fileSize); + Texture *loadPNG(unsigned char *fileData, unsigned int fileSize); } #endif // TEXTURELOADER_H diff --git a/src/framework/win32platform.cpp b/src/framework/win32platform.cpp new file mode 100644 index 00000000..d3f5a12f --- /dev/null +++ b/src/framework/win32platform.cpp @@ -0,0 +1 @@ + diff --git a/src/main.cpp b/src/main.cpp index 9f8fcd5a..79d73d00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ void signal_handler(int sig) switch(sig) { case SIGTERM: case SIGINT: - case SIGQUIT: + //case SIGQUIT: { static bool stopping = false; if(!stopping) { @@ -58,7 +58,7 @@ int main(int argc, const char *argv[]) // install our signal handler signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); - signal(SIGQUIT, signal_handler); + //signal(SIGQUIT, signal_handler); // setup resources g_resources.init(argv[0]);