nuclear@0: #include nuclear@0: #include "imago2.h" nuclear@0: #include "image.h" nuclear@0: nuclear@0: template nuclear@0: Image::Image() nuclear@0: { nuclear@0: pixels = 0; nuclear@0: own_pixels = true; nuclear@0: width = height = 0; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: Image::~Image() nuclear@0: { nuclear@0: destroy(); nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: Image::Image(const Image &img) nuclear@0: { nuclear@0: pixels = 0; nuclear@0: own_pixels = false; nuclear@0: nuclear@0: create(img.width, img.height, img.pixels); nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: Image &Image::operator =(const Image &img) nuclear@0: { nuclear@0: if(this != &img) { nuclear@0: destroy(); nuclear@0: create(img.width, img.height, img.pixels); nuclear@0: } nuclear@0: return *this; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: Image::Image(const Image &&img) nuclear@0: { nuclear@0: width = img.width; nuclear@0: height = img.height; nuclear@0: pixels = img.pixels; nuclear@0: own_pixels = img.own_pixels; nuclear@0: nuclear@0: img.pixels = 0; nuclear@0: img.width = img.height = 0; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: Image &&Image::operator =(const Image &&img) nuclear@0: { nuclear@0: if(this != &img) { nuclear@0: width = img.width; nuclear@0: height = img.height; nuclear@0: pixels = img.pixels; nuclear@0: own_pixels = img.own_pixels; nuclear@0: nuclear@0: img.pixels = 0; nuclear@0: img.width = img.height = 0; nuclear@0: } nuclear@0: return *this; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: void Image::create(int xsz, int ysz, const T *pixels) nuclear@0: { nuclear@0: destroy(); nuclear@0: nuclear@0: this->pixels = new T[xsz * ysz * 4]; nuclear@0: if(pixels) { nuclear@0: memcpy(this->pixels, pixels, xsz * ysz * 4 * sizeof(T)); nuclear@0: } else { nuclear@0: memset(this->pixels, 0, xsz * ysz * 4 * sizeof(T)); nuclear@0: } nuclear@0: width = xsz; nuclear@0: height = ysz; nuclear@0: own_pixels = true; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: void Image::destroy() nuclear@0: { nuclear@0: if(own_pixels) { nuclear@0: delete [] pixels; nuclear@0: } nuclear@0: pixels = 0; nuclear@0: width = height = 0; nuclear@0: own_pixels = true; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: int Image::get_width() const nuclear@0: { nuclear@0: return width; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: int Image::get_height() const nuclear@0: { nuclear@0: return height; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: void Image::set_pixels(int xsz, int ysz, T *pixels) nuclear@0: { nuclear@0: destroy(); nuclear@0: nuclear@0: this->pixels = pixels; nuclear@0: width = xsz; nuclear@0: height = ysz; nuclear@0: own_pixels = false; nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: T *Image::get_pixels() const nuclear@0: { nuclear@0: return pixels; nuclear@0: } nuclear@0: nuclear@2: template nuclear@26: void Image::clear() nuclear@26: { nuclear@26: memset(pixels, 0, width * height * 4 * sizeof(T)); nuclear@26: } nuclear@26: nuclear@26: template nuclear@2: inline bool load_image(Image *img, const char *fname) nuclear@2: { nuclear@2: return false; nuclear@2: } nuclear@2: nuclear@2: template <> nuclear@2: inline bool load_image(Image *img, const char *fname) nuclear@0: { nuclear@0: int xsz, ysz; nuclear@0: unsigned char *pix = (unsigned char*)img_load_pixels(fname, &xsz, &ysz, IMG_FMT_RGBA32); nuclear@0: if(!pix) { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@2: img->create(xsz, ysz, pix); nuclear@2: img_free_pixels(pix); nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@2: template <> nuclear@2: inline bool load_image(Image *img, const char *fname) nuclear@0: { nuclear@0: int xsz, ysz; nuclear@0: float *pix = (float*)img_load_pixels(fname, &xsz, &ysz, IMG_FMT_RGBAF); nuclear@0: if(!pix) { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@2: img->create(xsz, ysz, pix); nuclear@2: img_free_pixels(pix); nuclear@0: return true; nuclear@2: } nuclear@2: nuclear@2: template nuclear@2: bool Image::load(const char *fname) nuclear@2: { nuclear@2: return load_image(this, fname); nuclear@2: }