#include "image.h" #include #include namespace image { template void Image::init(size_t width, size_t height, int channels) { // Reset image if we already had one if (has_data) delete[] d_data; // Init buffer data_size = width * height * channels; d_data = new T[data_size]; // Set to 0 memset(d_data, 0, sizeof(T) * data_size); // Init local variables d_depth = sizeof(T) * 8; d_width = width; d_height = height; d_channels = channels; // We have data now if we didn't already has_data = true; } template void Image::clear() { // Reset image if (has_data) delete[] d_data; has_data = false; } template Image::Image() { // Do nothing } template Image::Image(size_t width, size_t height, int channels) { init(width, height, channels); } template Image::Image(const Image &img) { // Copy contents of the image over init(img.d_width, img.d_height, img.d_channels); memcpy(d_data, img.d_data, img.data_size * sizeof(T)); } template Image::Image(T *buffer, size_t width, size_t height, int channels) { // Copy contents of the image over init(width, height, channels); memcpy(d_data, buffer, data_size * sizeof(T)); } template Image &Image::operator=(const Image &img) { // Copy contents of the image over init(img.d_width, img.d_height, img.d_channels); memcpy(d_data, img.d_data, img.data_size * sizeof(T)); return *this; } template Image &Image::operator<<=(const int &shift) { for (size_t i = 0; i < data_size; i++) d_data[i] <<= shift; return *this; } template Image::~Image() { if (has_data) delete[] d_data; } template T Image::clamp(int input) { if (input > std::numeric_limits::max()) return std::numeric_limits::max(); else if (input < 0) return 0; else return input; } template void Image::to_rgb() { if (d_channels == 1) { Image tmp = *this; // Backup image init(d_width, d_height, 3); // Init new image as RGB // Fill in all 3 channels draw_image(0, tmp); draw_image(1, tmp); draw_image(2, tmp); } } template Image Image::to8bits() { if (d_depth == 8) { return *((image::Image *)this); } else if (d_depth == 16) { image::Image image8(d_width, d_height, d_channels); for (size_t i = 0; i < data_size; i++) image8[i] = d_data[i] >> 8; return image8; } return Image(); // This should never happen } template Image Image::to16bits() { if (d_depth == 16) { return *((image::Image *)this); } else if (d_depth == 8) { image::Image image16(d_width, d_height, d_channels); for (size_t i = 0; i < data_size; i++) image16[i] = d_data[i] << 8; return image16; } return Image(); // This should never happen } // Generate Images for uint16_t and uint8_t template class Image; template class Image; }