#include "Image.h" #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif Image::Image(unsigned int ax, unsigned int ay) : x(ax), y(ay), img((Color *) malloc(x * y * sizeof(Color))) { Fill(); } Image::~Image() { free((void *)img); } bool Image::CanWrite() const { return false; } String Image::GetName() const { return String(_("Image ")) + x + "x" + y; } void Image::Fill(Color c) { for (unsigned int i = 0; i < x * y; i++) { img[i] = c; } } Color Image::GetPixel(unsigned int px, unsigned int py) const { if ((px >= x) || (py >= y)) { return Color(0, 0, 0, 0); } return img[x * py + px]; } void Image::SetPixel(unsigned int px, unsigned int py, Color c) { if ((px >= x) || (py >= y)) { return; } img[x * py + px] = c; } #ifndef WORDS_BIGENDIAN #define WORDS_BIGENDIAN 0 #endif bool Image::Prepare(unsigned int f) { if (GetSize()) return false; switch (f) { case FORMAT_TGA_BASIC: TGAHeader Header; TGAFooter Footer; Header.IDLength = 0; Header.ColorMapType = 0; Header.ImageType = 2; Header.CM_FirstEntry = 0; Header.CM_Length = 0; Header.CM_EntrySize = 0; Header.IS_XOrigin = 0; Header.IS_YOrigin = 0; Header.IS_Width = WORDS_BIGENDIAN ? ((x & 0xff) << 8) | ((x & 0xff00) >> 8) : x; Header.IS_Height = WORDS_BIGENDIAN ? ((y & 0xff) << 8) | ((y & 0xff00) >> 8) : y; Header.IS_Depth = 32; Header.IS_Descriptor = 0x20; Footer.ExtOffset = 0; Footer.DevOffset = 0; strcpy(Footer.Sig, "TRUEVISION-XFILE."); write(&Header, sizeof(Header)); write(img, x * y * sizeof(Color)); write(&Footer, sizeof(Footer)); return true; break; default: return false; } }