
#ifndef _JL_GLPic_H_
#define _JL_GLPic_H_

#include <stdlib.h>
#include <iostream.h>
#include "jlstring.h"

#ifdef JLLIB_IRIX
typedef unsigned long PixelType;
#else
typedef signed long PixelType;
#endif

//typedef PixelType* PixelPtr;

class GLPic {

	protected:
		short			_xsize, _ysize;
		PixelType		*_pixbuffer;

	public: 
		GLPic();
		GLPic(int x, int y);
		GLPic(const JLString &filename);
		GLPic(const GLPic &P) { _pixbuffer = NULL; CopyFrom(P); }
		virtual ~GLPic();

		GLPic& CopyFrom(const GLPic&);
		GLPic& operator=(const GLPic &P) { return CopyFrom(P); }

		short x() const { return _xsize; }
		short y() const { return _ysize; }

		// Set one pixel:
		void Pixel(int x, int y, PixelType p) { 
#ifdef JLLIB_LINUX  
//linux is flipped in the y. FLIPPED!
_pixbuffer[(_ysize - 1 - y)*_xsize+x]=p; 
#else
_pixbuffer[y*_xsize+x]=p; 
#endif
}

		// Get one pixel:
		PixelType Pixel(int x, int y) const { return _pixbuffer[y*_xsize+x]; }

		PixelType* GetBuffer() { return _pixbuffer; } // be careful with it!

		PixelType Sample(double s, double t);
		PixelType Sample_Lerp(double s, double t);

		GLPic& New(int x, int y);
		GLPic& Kill();

		int IsGreyscale();

		GLPic& FromFloatGrid(float *f, int size, float min, float max,
							 int bits); // 8 or 24 bits

		GLPic& AddRect(int x1, int y1, int x2, int y2, const PixelType *p);

		GLPic& Clear(PixelType color=0);
		GLPic& Draw(int x=0, int y=0);

		GLPic& Load(const JLString&);
		GLPic& Save(const JLString&);

		GLPic& LoadPPM(const JLString&);
		GLPic& SavePPM(const JLString&);

#ifdef JLLIB_IRIX
		GLPic& LoadRGB(const JLString&);
		GLPic& SaveRGB(const JLString&);

		GLPic& LoadGIF(const JLString&);
		GLPic& SaveGIF(const JLString&);
#endif

		GLPic& LoadGzipped(const JLString&);

		friend ostream& operator<<(ostream&, const GLPic&);

		GLPic& ScaleDown(int factor);
		GLPic& Resize(int x, int y);
		GLPic& Crop(int x0, int y0, int xsize, int ysize);

		GLPic& Offset(int x, int y);

		GLPic& Composite(GLPic &Mask, GLPic &zero, GLPic &one);
		GLPic& Sub(GLPic &P1, GLPic &P2);

		friend float DiffCompare(GLPic &P1, GLPic &P2);

		GLPic& Blur();
		GLPic& Gradient(GLPic&);
		GLPic& Differ2(GLPic&);
};

#endif
