summaryrefslogtreecommitdiff
path: root/plugingui/image.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugingui/image.cc')
-rw-r--r--plugingui/image.cc123
1 files changed, 11 insertions, 112 deletions
diff --git a/plugingui/image.cc b/plugingui/image.cc
index 886268d..8006317 100644
--- a/plugingui/image.cc
+++ b/plugingui/image.cc
@@ -37,151 +37,51 @@
#include "resource.h"
// http://blog.hammerian.net/2009/reading-png-images-from-memory/
-typedef struct {
- size_t p;
- size_t size;
- const char *data;
-} data_io_t;
-
-static void dio_reader(png_structp png_ptr, png_bytep buf, png_size_t size)
-{
- data_io_t *dio = (data_io_t *)png_get_io_ptr(png_ptr);
-
- if(size > dio->size - dio->p) {
- png_error(png_ptr, "Could not read bytes.");
- }
-
- memcpy(buf, (dio->data + dio->p), size);
- dio->p += size;
-}
+#include "lodepng/lodepng.h"
GUI::Image::Image(const char* data, size_t size)
{
- row_pointers = NULL;
load(data, size);
}
GUI::Image::Image(std::string filename)
{
- row_pointers = NULL;
GUI::Resource rc(filename);
load(rc.data(), rc.size());
}
GUI::Image::~Image()
{
- if(!row_pointers) return;
-
- for(unsigned int y = 0; y < h; y++) {
- free(row_pointers[y]);
- }
- free(row_pointers);
+ free(image_data);
}
void GUI::Image::setError(int err)
{
GUI::Resource rc(":png_error");
- const char *p = rc.data();
+ const unsigned char *p = (const unsigned char *)rc.data();
memcpy(&w, p, 4); p += 4;
memcpy(&h, p, 4); p += 4;
DEBUG(image, "w:%d, h:%d\n", (int)w, (int)h);
- row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * h);
- for(unsigned int y = 0; y < h; y++) {
- size_t size = w * sizeof(unsigned int);
- DEBUG(image, "rc.size:%d >= p:%d (rowsize: %d)\n",
- (int)rc.size(), (int)(p - rc.data()), (int)size);
- row_pointers[y] = (png_byte*)malloc(size);
- memcpy(row_pointers[y], p, size);
- p += size;
- }
+ image_data = (unsigned char*)malloc(rc.size() - 8);
+ memcpy(image_data, p, rc.size() - 8);
}
void GUI::Image::load(const char* data, size_t size)
{
- // Don't ever read image twice.
- if(row_pointers) return;
-
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL;
- //png_byte color_type;
- //png_byte bit_depth;
-
- if(!size) setError(0);
+ //unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h,
+ // const unsigned char* in, size_t insize);
+ unsigned res = lodepng_decode32((unsigned char**)&image_data, &w, &h,
+ (const unsigned char*)data, size);
- const char *header = data;
-
- // test for it being a png:
- if(png_sig_cmp((png_byte*)header, 0, 8)) {
- ERR(image, "[read_png_file] File is not recognized as a PNG file");
- setError(0);
- return;
- }
-
- // initialize stuff
- png_ptr =
- png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if(!png_ptr) {
- ERR(image, "[read_png_file] png_create_read_struct failed");
- setError(1);
- return;
- }
-
- info_ptr = png_create_info_struct(png_ptr);
- if(!info_ptr) {
- ERR(image, "[read_png_file] png_create_info_struct failed");
- setError(2);
- png_destroy_read_struct(&png_ptr, NULL, NULL);
- return;
- }
-
- if(setjmp(png_jmpbuf(png_ptr))) {
+ if(res != 0) {
ERR(image, "[read_png_file] Error during init_io");
setError(3);
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- return;
- }
-
- //png_init_io(png_ptr, fp);
- data_io_t dio;
- dio.data = data;
- dio.size = size;
- dio.p = 8; // skip header
- png_set_read_fn(png_ptr, &dio, dio_reader);
-
- png_set_sig_bytes(png_ptr, 8);
-
- png_read_info(png_ptr, info_ptr);
-
- w = png_get_image_width(png_ptr, info_ptr);
- h = png_get_image_height(png_ptr, info_ptr);
- //color_type = png_get_color_type(png_ptr, info_ptr);
- //bit_depth = png_get_bit_depth(png_ptr, info_ptr);
-
- number_of_passes = png_set_interlace_handling(png_ptr);
- png_read_update_info(png_ptr, info_ptr);
-
- // read file
- if(setjmp(png_jmpbuf(png_ptr))) {
- ERR(image, "[read_png_file] Error during read_image");
- setError(4);
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return;
}
-
- row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * h);
- for(size_t y = 0; y < h; y++) {
- row_pointers[y] =
- (png_byte*) malloc(png_get_rowbytes(png_ptr, info_ptr));
- }
-
- png_read_image(png_ptr, row_pointers);
-
- png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
}
size_t GUI::Image::width()
@@ -197,8 +97,7 @@ size_t GUI::Image::height()
GUI::Colour GUI::Image::getPixel(size_t x, size_t y)
{
if(x > width() || y > height()) return GUI::Colour(0,0,0,0);
- png_byte* row = row_pointers[y];
- png_byte* ptr = &(row[x*4]);
+ unsigned char *ptr = &image_data[(x + y * width()) * 4];
float r = ptr[0];
float g = ptr[1];
float b = ptr[2];