00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #ifndef DISPLAY2D_DRAWPIXELS_H
00028 #define DISPLAY2D_DRAWPIXELS_H
00029
00030
00031 #include <cstdlib>
00032
00033
00034 namespace Display
00035 {
00058 class ImageDrawPixels {
00059 public:
00060 ImageDrawPixels();
00061 ~ImageDrawPixels();
00062
00064 template <typename DataType>
00065 void update(const DataType* image, unsigned int width, unsigned int height);
00066
00070 void display() const;
00071
00072 void* m_frame;
00073 unsigned int m_size[2];
00074 GLenum m_format;
00075 GLenum m_type;
00076
00077 private:
00079 template <typename T>
00080 struct DrawPixelsArgs { static GLenum format, type; };
00081 };
00082
00083
00084 template <typename DataType>
00085 void ImageDrawPixels::update(const DataType* image, unsigned int width, unsigned int height)
00086 {
00087 if(m_size[0] != width ||
00088 m_size[1] != height ||
00089 m_format != DrawPixelsArgs<DataType>::format ||
00090 m_type != DrawPixelsArgs<DataType>::type)
00091 {
00092 if(m_frame) free(m_frame);
00093
00094
00095 m_size[0] = width;
00096 m_size[1] = height;
00097
00098
00099 m_frame = malloc(m_size[0]*m_size[1]*sizeof(DataType));
00100
00101
00102 m_format = DrawPixelsArgs<DataType>::format;
00103 m_type = DrawPixelsArgs<DataType>::type;
00104 }
00105
00106
00107 DataType* ptr = reinterpret_cast<DataType*>(m_frame);
00108 for(unsigned int i=0; i<width*height; ++i)
00109 ptr[i] = image[i];
00110 }
00111
00112
00113
00114 template <typename T> GLenum ImageDrawPixels::DrawPixelsArgs<T> ::format = GL_LUMINANCE;
00115
00116
00117 #ifdef COLOR_H
00118
00119 #ifndef GL_BGR
00120 #define GL_BGR GL_BGR_EXT
00121 #endif
00122
00123
00124 template <typename T> struct ImageDrawPixels::DrawPixelsArgs<color<T> > { static GLenum format, type; };
00125 template <typename T> GLenum ImageDrawPixels::DrawPixelsArgs<color<T> >::type = DrawPixelsArgs<T>::type;
00126 template <typename T> GLenum ImageDrawPixels::DrawPixelsArgs<color<T> >::format = GL_BGR;
00127
00128 #endif
00129
00130
00131 }
00132
00133
00134 #endif