00001 #ifndef X3DTK_IMAGE_H
00002 #define X3DTK_IMAGE_H
00003
00004 #include "Platform.h"
00005
00006 #include <limits>
00007
00008 #undef max
00009
00010 namespace X3DTK {
00011
00012 class Image;
00013
00014 template<class T>
00015 struct Memory
00016 {
00017 inline static T *access(Image *I, unsigned short x, unsigned short y);
00018 };
00019
00020 template<class IT, class OT>
00021 struct ImageConverter
00022 {
00023 static void make(unsigned char *out, unsigned char *in, unsigned int length);
00024 };
00025
00034 class Image
00035 {
00036 public:
00038 Image();
00040 Image(const char *fileName);
00042 ~Image();
00043
00045 inline bool isLoaded() const {return (_data != 0);};
00047 void saveAs(const char *fileName, float quality = 1.0f);
00049 void resize(unsigned short width, unsigned short height, GLenum GLType = GL_NONE);
00051 unsigned char *resizeData(unsigned short width, unsigned short height, GLenum GLType = GL_NONE);
00054 void resizeGL(float (& textureTransform)[16]);
00056 bool allocate(unsigned short width, unsigned short height, GLenum GLFormat, GLenum GLType);
00058 void release();
00059
00061 inline unsigned short getWidth() const {return _width;};
00063 inline unsigned short getHeight() const {return _height;};
00065 inline GLenum getGLFormat() const {return _glFormat;};
00067 inline GLenum getGLType() const {return _type;};
00069 inline int getPixelSize() const;
00071 inline unsigned char* getData() const {return _data;};
00073 static int computePixelSize(GLenum GLFormat, GLenum GLType);
00074 private:
00075 unsigned char *_data;
00076 GLenum _glFormat;
00077 GLenum _type;
00078 unsigned short _width;
00079 unsigned short _height;
00080
00081 void convert(GLenum oldType, GLenum newType, unsigned char *newData, unsigned char *data, unsigned int length);
00082 };
00083
00084 }
00085
00086 #include "Image.inl"
00087
00088 #endif