X-Git-Url: https://eleni.mutantstargoat.com/git/?p=demo;a=blobdiff_plain;f=src%2Fimage.cc;h=01ee08f6952f3c40f8288627925ad483e42a3a70;hp=2bfdbd868574bce2a9d1a6b13a74d773c5d4fefc;hb=15cb9e608f3028a86ed878d726f1633bce9d6e04;hpb=77e44c5424bd5e6e7c6a706151fa786a56270e12 diff --git a/src/image.cc b/src/image.cc index 2bfdbd8..01ee08f 100644 --- a/src/image.cc +++ b/src/image.cc @@ -1,3 +1,4 @@ +#include #include #include "imago2.h" @@ -5,22 +6,29 @@ Image::Image() { - w = h = 0; + w = h = psz = 0; pixels = 0; + + is_float = false; } Image::~Image() { - delete [] pixels; + free(pixels); } Image::Image(const Image &image) { w = image.w; h = image.h; + is_float = image.is_float; + psz = image.psz; - pixels = new unsigned char[w * h * 4]; - memcpy(pixels, image.pixels, w * h * 4); + if(!(pixels = malloc(w * h * psz))) { + fprintf(stderr, "Failed to allocate pixels.\n"); + abort(); + } + memcpy(pixels, image.pixels, w * h * psz); } Image &Image::operator =(const Image &image) @@ -28,13 +36,18 @@ Image &Image::operator =(const Image &image) if(&image == this) return *this; - delete [] pixels; + free(pixels); w = image.w; h = image.h; + psz = image.psz; + is_float = image.is_float; - pixels = new unsigned char[w * h * 4]; - memcpy(pixels, image.pixels, w * h * 4); + if(!(pixels = malloc(w * h * psz))) { + fprintf(stderr, "Failed to allocate pixels.\n"); + abort(); + } + memcpy(pixels, image.pixels, w * h * psz); return *this; } @@ -43,6 +56,8 @@ Image::Image(Image &&image) { w = image.w; h = image.h; + psz = image.psz; + is_float = image.is_float; pixels = image.pixels; image.pixels = 0; @@ -53,10 +68,12 @@ Image &Image::operator =(Image &&image) if(&image == this) return *this; - delete [] pixels; + free(pixels); w = image.w; h = image.h; + psz = image.psz; + is_float = image.is_float; pixels = image.pixels; image.pixels = 0; @@ -66,17 +83,40 @@ Image &Image::operator =(Image &&image) bool Image::load(const char *fname) { - unsigned char *imago_pixels; - if(!(imago_pixels = (unsigned char *)img_load_pixels(fname, &w, &h))) { - fprintf(stderr, "Failed to load pixels from file: %s.\n", fname); + free(pixels); + + img_pixmap ipm; + img_init(&ipm); + + if(img_load(&ipm, fname) == -1) { + fprintf(stderr, "Failed to load image: %s.\n", fname); + + img_destroy(&ipm); + return false; + } + + printf("Successfully loaded image: %s\n", fname); + + img_fmt format = img_is_float(&ipm) ? IMG_FMT_RGBAF : IMG_FMT_RGBA32; + if(img_convert(&ipm, format) == -1) { + fprintf(stderr, "Failed to convert image %s.\n", fname); + + img_destroy(&ipm); return false; } - delete [] pixels; - pixels = new unsigned char[w * h * 4]; - memcpy(pixels, imago_pixels, w * h * 4); + w = ipm.width; + h = ipm.height; + psz = ipm.pixelsz; + is_float = img_is_float(&ipm) ? true : false; + + if(!(pixels = malloc(w * h * psz))) { + fprintf(stderr, "Failed to allocate pixels for image: %s.\n", fname); + return false; + } - img_free_pixels(imago_pixels); + memcpy(pixels, ipm.pixels, w * h * psz); + img_destroy(&ipm); return true; } \ No newline at end of file