#ifndef Geom1_ZImage_H
#define Geom1_ZImage_H
#include <Glasses/ZGlass.h>
#include <Stones/ZColor.h>
#ifndef __CINT__
#include <IL/il.h>
#include <IL/ilu.h>
#else
typedef unsigned int ILuint;
#endif
class ZImage : public ZGlass
{
MAC_RNR_FRIENDS(ZImage);
private:
void _init();
void _setup() { m_data = (UChar_t*)data(); m_bpp = bpp(); }
void _reset() { m_data = 0; m_bpp = 0; }
UChar_t *m_data;
Int_t m_bpp;
ILuint mIL_Name;
protected:
TString mFile;
Int_t mW;
Int_t mH;
Int_t mImgFmt;
Int_t mImgTyp;
Int_t mIntFmt;
Int_t mSWrap;
Int_t mTWrap;
Int_t mMagFilter;
Int_t mMinFilter;
Int_t mEnvMode;
ZColor mEnvColor;
Bool_t bLoadAdEnlight;
Bool_t bLoadAdBind;
Bool_t bUseShadowing;
Bool_t bSmartShadow;
Bool_t bLoaded;
Bool_t bShadowed;
ZColor mClearColor;
void shadow_check(const Exc_t& eh);
public:
ZImage(const Text_t* n="ZImage", const Text_t* t=0) : ZGlass(n,t) { _init(); }
virtual ~ZImage();
virtual void AdEnlightenment();
void SetUseShadowing(Bool_t useshadowing);
void Load();
void Unload();
void Save(const Text_t* file=0);
Bool_t IsBindable();
void BlurAverage(UInt_t count=1);
void BlurGaussian(UInt_t count=1);
void Contrastify(Float_t contrast=1.1);
void Equalize();
void Rotate(Float_t angle=90);
void Mirror();
void SetupAsCanvas(Int_t w=256, Int_t h=256,
Int_t bpp=1, Bool_t clear_p=true);
void Diagonal(Float_t r=1, Float_t g=1, Float_t b=1);
void bind();
void unbind();
void shadow();
void delete_image();
bool load_image();
void create_image(Int_t w, Int_t h, Int_t bpp);
int w();
int h();
void* data();
int bpp();
int gl_format();
int gl_type();
static GMutex sILMutex;
static Bool_t sVerboseLoad;
void set_byte(Int_t x, Int_t y, UChar_t w) { m_data[y*mH + x] = w; }
void get_byte(Int_t x, Int_t y, UChar_t& w) { w = m_data[y*mH + x]; }
void set_short(Int_t x, Int_t y, UShort_t w) { ((UShort_t*)m_data)[y*mH + x] = w; }
void get_short(Int_t x, Int_t y, UShort_t& w) { w = ((UShort_t*)m_data)[y*mH + x]; }
void set_rgb(Int_t x, Int_t y, UChar_t r, UChar_t g, UChar_t b) { UChar_t*p = &m_data[m_bpp*(y*mH + x)]; *p++=r; *p++=g; *p++=b; }
void get_rgb(Int_t x, Int_t y, UChar_t& r, UChar_t& g, UChar_t& b) { UChar_t*p = &m_data[m_bpp*(y*mH + x)]; r=*p++; g=*p++; b=*p++; }
void set_rgba(Int_t x, Int_t y, UChar_t r, UChar_t g, UChar_t b, UChar_t a) { UChar_t*p = &m_data[m_bpp*(y*mH + x)]; *p++=r; *p++=g; *p++=b; *p++=a; }
void get_rgba(Int_t x, Int_t y, UChar_t& r, UChar_t& g, UChar_t& b, UChar_t& a) { UChar_t*p = &m_data[m_bpp*(y*mH + x)]; r=*p++; g=*p++; b=*p++; a=*p++; }
void set_pixel(Int_t x, Int_t y, Float_t w);
void get_pixel(Int_t x, Int_t y, Float_t& w);
void set_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b);
void get_pixel(Int_t x, Int_t y, Float_t& r, Float_t& g, Float_t& b);
void set_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Float_t a);
void get_pixel(Int_t x, Int_t y, Float_t& r, Float_t& g, Float_t& b, Float_t& a);
void add_pixel(Int_t x, Int_t y, Float_t w, Bool_t clip=true);
void add_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Bool_t clip=true);
void add_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Float_t a, Bool_t clip=true);
void inc_pixel(Int_t x, Int_t y, Bool_t clip=true);
void inc_pixel_idx(Int_t idx, Int_t x, Int_t y, Bool_t clip=true);
#include "ZImage.h7"
ClassDef(ZImage, 1);
};
#endif