1 //////////////////////////////////////////////////////////////////////////// 2 // File: GLTexImage.h 3 // Author: Changchang Wu 4 // Description : interface for the GLTexImage class. 5 // GLTexImage: naive texture class. 6 // sevral different quad drawing functions are provied 7 // GLTexPacked: packed version (four value packed as four channels of a pixel) 8 // GLTexInput: GLTexImage + some input information 9 // 10 // Copyright (c) 2007 University of North Carolina at Chapel Hill 11 // All Rights Reserved 12 // 13 // Permission to use, copy, modify and distribute this software and its 14 // documentation for educational, research and non-profit purposes, without 15 // fee, and without a written agreement is hereby granted, provided that the 16 // above copyright notice and the following paragraph appear in all copies. 17 // 18 // The University of North Carolina at Chapel Hill make no representations 19 // about the suitability of this software for any purpose. It is provided 20 // 'as is' without express or implied warranty. 21 // 22 // Please send BUG REPORTS to ccwu@cs.unc.edu 23 // 24 //////////////////////////////////////////////////////////////////////////// 25 26 27 #ifndef GL_TEX_IMAGE_H 28 #define GL_TEX_IMAGE_H 29 30 class GlobalUtil; 31 class GLTexImage :public GlobalUtil 32 { 33 protected: 34 GLuint _texID; 35 int _imgWidth; 36 int _imgHeight; 37 int _texWidth; 38 int _texHeight; 39 int _drawWidth; 40 int _drawHeight; 41 public: 42 static void DetachFBO(int i); 43 static void UnbindTex(); 44 static void UnbindMultiTex(int n); 45 static void DrawQuad(float x1, float x2, float y1, float y2); 46 47 public: 48 virtual void DrawQuadUS(int scale); 49 virtual void DrawQuadDS(int scale); 50 virtual void DrawImage(); 51 virtual void TexConvertRGB(); 52 virtual void ZeroHistoMargin(); 53 virtual void SetImageSize(int width, int height); 54 virtual void InitTexture(int width, int height, int clamp_to_edge =1 ); 55 void InitTexture(int width, int height, int clamp_to_edge, GLuint format); 56 virtual void FillMargin(int marginx, int marginy); 57 public: 58 void DrawScaledQuad(float scale); 59 int CopyToPBO(GLuint pbo, int width, int height, GLenum format = GL_RGBA); 60 void CopyFromPBO(GLuint pbo, int width, int height, GLenum format = GL_RGBA); 61 void FitRealTexViewPort(); 62 void DrawQuadMT8(); 63 void DrawQuadMT4(); 64 void DrawQuadReduction(); 65 void DrawQuadReduction(int w, int h); 66 void DrawMargin(int right, int bottom); 67 void DrawQuad(); 68 void FitTexViewPort(); 69 void ZeroHistoMargin(int hw, int hh); 70 int CheckTexture(); 71 void SaveToASCII(const char* path); 72 public: 73 void AttachToFBO(int i ); 74 void BindTex(); GLuint()75 operator GLuint (){return _texID;} GetTexID()76 GLuint GetTexID(){return _texID;} GetImgPixelCount()77 int GetImgPixelCount(){return _imgWidth*_imgHeight;} GetTexPixelCount()78 int GetTexPixelCount(){return _texWidth*_texHeight;} GetImgWidth()79 int GetImgWidth(){return _imgWidth;} GetImgHeight()80 int GetImgHeight(){return _imgHeight;} GetTexWidth()81 int GetTexWidth(){return _texWidth;} GetTexHeight()82 int GetTexHeight(){return _texHeight;} GetDrawWidth()83 int GetDrawWidth(){return _drawWidth;} GetDrawHeight()84 int GetDrawHeight(){return _drawHeight;} 85 //int IsTexTight(){return _texWidth == _drawWidth && _texHeight == _drawHeight;} IsTexPacked()86 int IsTexPacked(){return _drawWidth != _imgWidth;} 87 GLTexImage(); 88 virtual ~GLTexImage(); 89 friend class SiftGPU; 90 }; 91 92 //class for handle data input, to support all openGL-supported data format, 93 //data are first uploaded to an openGL texture then converted, and optionally 94 //when the datatype is simple, we downsample/convert on cpu 95 class GLTexInput:public GLTexImage 96 { 97 public: 98 int _down_sampled; 99 int _rgb_converted; 100 int _data_modified; 101 102 ////////////////////////// 103 float * _converted_data; 104 const void* _pixel_data; 105 public: IsSimpleGlFormat(unsigned int gl_format,unsigned int gl_type)106 static int IsSimpleGlFormat(unsigned int gl_format, unsigned int gl_type) 107 { 108 //the formats there is a cpu code to conver rgb and downsample 109 return (gl_format ==GL_LUMINANCE ||gl_format == GL_LUMINANCE_ALPHA|| 110 gl_format == GL_RGB|| gl_format == GL_RGBA|| 111 gl_format == GL_BGR || gl_format == GL_BGRA) && 112 (gl_type == GL_UNSIGNED_BYTE || gl_type == GL_FLOAT || gl_type == GL_UNSIGNED_SHORT); 113 } 114 //in vc6, template member function doesn't work 115 #if !defined(_MSC_VER) || _MSC_VER > 1200 116 template <class Uint> 117 static int DownSamplePixelDataI(unsigned int gl_format, int width, int height, 118 int ds, const Uint * pin, Uint * pout); 119 template <class Uint> 120 static int DownSamplePixelDataI2F(unsigned int gl_format, int width, int height, 121 int ds, const Uint * pin, float * pout, int skip = 0); 122 #endif 123 static int DownSamplePixelDataF(unsigned int gl_format, int width, int height, 124 int ds, const float * pin, float * pout, int skip = 0); TruncateWidthCU(int w)125 static int TruncateWidthCU(int w) {return w & 0xfffffffc; } 126 public: GLTexInput()127 GLTexInput() : _down_sampled(0), _rgb_converted(0), _data_modified(0), 128 _converted_data(0), _pixel_data(0){} 129 int SetImageData(int width, int height, const void * data, 130 unsigned int gl_format, unsigned int gl_type); 131 int LoadImageFile(char * imagepath, int & w, int &h); 132 void VerifyTexture(); 133 virtual ~GLTexInput(); 134 }; 135 136 //GLTexPacked doesn't have any data 137 //so that we can use the GLTexImage* pointer to index a GLTexPacked Vector 138 139 class GLTexPacked:public GLTexImage 140 { 141 public: 142 virtual void DrawImage(); 143 virtual void DrawQuadUS(int scale); 144 virtual void DrawQuadDS(int scale); 145 virtual void FillMargin(int marginx, int marginy); 146 virtual void InitTexture(int width, int height, int clamp_to_edge =1); 147 virtual void TexConvertRGB(); 148 virtual void SetImageSize(int width, int height); 149 virtual void ZeroHistoMargin(); 150 //virtual void GetHistWH(int& w, int& h){return w = (3 + sz)>>1;} 151 public: 152 void DrawMargin(int right, int bottom, int mx, int my); GLTexPacked()153 GLTexPacked():GLTexImage(){} 154 }; 155 156 157 #endif // !defined(GL_TEX_IMAGE_H) 158 159