#ifndef __IMAGE_H__ #define __IMAGE_H__ #include #pragma pack(push,1) struct TGA_Header { char idlength; char colormaptype; char datatypecode; short colormaporigin; short colormaplength; char colormapdepth; short x_origin; short y_origin; short width; short height; char bitsperpixel; char imagedescriptor; }; #pragma pack(pop) struct TGAColor { unsigned char bgra[4]; unsigned char bytespp; TGAColor() : bytespp(1) { for (int i=0; i<4; i++) bgra[i] = 0; } TGAColor(unsigned char R, unsigned char G, unsigned char B, unsigned char A=255) : bytespp(4) { bgra[0] = B; bgra[1] = G; bgra[2] = R; bgra[3] = A; } TGAColor(unsigned char v) : bytespp(1) { for (int i=0; i<4; i++) bgra[i] = 0; bgra[0] = v; } TGAColor(const unsigned char *p, unsigned char bpp) : bytespp(bpp) { for (int i=0; i<(int)bpp; i++) { bgra[i] = p[i]; } for (int i=bpp; i<4; i++) { bgra[i] = 0; } } unsigned char& operator[](const int i) { return bgra[i]; } TGAColor operator *(float intensity) const { TGAColor res = *this; intensity = (intensity>1.f?1.f:(intensity<0.f?0.f:intensity)); for (int i=0; i<4; i++) res.bgra[i] = bgra[i]*intensity; return res; } }; class TGAImage { protected: unsigned char* data; int width; int height; int bytespp; bool load_rle_data(std::ifstream &in); bool unload_rle_data(std::ofstream &out) const; public: enum Format { GRAYSCALE=1, RGB=3, RGBA=4 }; TGAImage(); TGAImage(int w, int h, int bpp); TGAImage(const TGAImage &img); bool read_tga_file(const char *filename); bool write_tga_file(const char *filename, bool rle=true) const; bool flip_horizontally(); bool flip_vertically(); bool scale(int w, int h); TGAColor get(int x, int y) const; bool set(int x, int y, TGAColor &c); bool set(int x, int y, const TGAColor &c); ~TGAImage(); TGAImage & operator =(const TGAImage &img); int get_width(); int get_height(); int get_bytespp(); unsigned char *buffer(); void clear(); }; #endif //__IMAGE_H__