PICCANTE  0.4
The hottest HDR imaging library!
formats.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_UTIL_GL_FORMATS_HPP
19 #define PIC_UTIL_GL_FORMATS_HPP
20 
21 #include "../../base.hpp"
22 
23 #include "../../gl.hpp"
24 
25 namespace pic {
26 
33 inline void getModesGL(int channels, int &mode, int &modeInternalFormat)
34 {
35  mode = 0;
36  modeInternalFormat = 0;
37 
38  switch(channels) {
39  case 1: {
40  mode = GL_RED;
41  modeInternalFormat = GL_R32F;
42  }
43  break;
44 
45  case 3: {
46  mode = GL_RGB;
47  modeInternalFormat = GL_RGB32F;
48  }
49  break;
50 
51  case 4: {
52  mode = GL_RGBA;
53  modeInternalFormat = GL_RGBA32F;
54  }
55  break;
56  }
57 }
58 
65 inline void getModesHalfGL(int channels, int &mode, int &modeInternalFormat)
66 {
67  mode = 0;
68  modeInternalFormat = 0;
69 
70  switch(channels) {
71  case 1: {
72  mode = GL_RED;
73  modeInternalFormat = GL_R16F;
74  }
75  break;
76 
77  case 3: {
78  mode = GL_RGB;
79  modeInternalFormat = GL_RGB16F;
80  }
81  break;
82 
83  case 4: {
84  mode = GL_RGBA;
85  modeInternalFormat = GL_RGBA16F;
86  }
87  break;
88  }
89 }
90 
97 inline void getModesIntegerGL(int channels, int &mode, int &modeInternalFormat)
98 {
99  mode = 0;
100  modeInternalFormat = 0;
101 
102  switch(channels) {
103  case 1: {
104  mode = GL_RED_INTEGER;
105  modeInternalFormat = GL_R32I;
106  }
107  break;
108 
109  case 3: {
110  mode = GL_RGB_INTEGER;
111  modeInternalFormat = GL_RGB32I;
112  }
113  break;
114 
115  case 4: {
116  mode = GL_RGBA_INTEGER;
117  modeInternalFormat = GL_RGBA32I;
118  }
119  break;
120  }
121 }
122 
128 inline int getChannelsFromInternalFormatGL(int internalFormat)
129 {
130  int channels = -1;
131 
132  switch(internalFormat) {
133  //Half precision
134  case GL_R16F:
135  channels = 1;
136  break;
137 
138  case GL_RGB16F:
139  channels = 3;
140  break;
141 
142  case GL_RGBA16F:
143  channels = 4;
144  break;
145 
146  //Single precision
147  case GL_R32F:
148  channels = 1;
149  break;
150 
151  case GL_RGB32F:
152  channels = 3;
153  break;
154 
155  case GL_RGBA32F:
156  channels = 4;
157  break;
158  }
159 
160  return channels;
161 }
162 
173 PIC_INLINE void getTextureInformationGL(GLuint texture, GLuint target, int &width, int &height,
174  int &frames, int &channels)
175 {
176  if(texture == 0) {
177  #ifdef PIC_DEBUG
178  printf("getTextureInformationGL: texture is not valid.\n");
179  #endif
180  return;
181  }
182 
183  GLint internalFormat;
184 
185  switch(target) {
186  case GL_TEXTURE_2D: {
187  glBindTexture(GL_TEXTURE_2D, texture);
188  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
189  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
190  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT,
191  &internalFormat);
192 
193  channels = getChannelsFromInternalFormatGL(internalFormat);
194 
195  frames = 1;
196 
197  glBindTexture(GL_TEXTURE_2D, 0);
198  }
199  break;
200 
201  case GL_TEXTURE_CUBE_MAP: {
202  glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
203  glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP, 0, GL_TEXTURE_WIDTH, &width);
204  glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP, 0, GL_TEXTURE_HEIGHT, &height);
205  glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP, 0, GL_TEXTURE_INTERNAL_FORMAT,
206  &internalFormat);
207 
208  channels = getChannelsFromInternalFormatGL(internalFormat);
209 
210  frames = 6;
211 
212  glBindTexture(GL_TEXTURE_2D, 0);
213  }
214  break;
215 
216  case GL_TEXTURE_2D_ARRAY: {
217  glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
218  glGetTexLevelParameteriv(GL_TEXTURE_2D_ARRAY, 0, GL_TEXTURE_WIDTH, &width);
219  glGetTexLevelParameteriv(GL_TEXTURE_2D_ARRAY, 0, GL_TEXTURE_HEIGHT, &height);
220  glGetTexLevelParameteriv(GL_TEXTURE_2D_ARRAY, 0, GL_TEXTURE_DEPTH, &frames);
221  glGetTexLevelParameteriv(GL_TEXTURE_2D_ARRAY, 0, GL_TEXTURE_INTERNAL_FORMAT,
222  &internalFormat);
223 
224  channels = getChannelsFromInternalFormatGL(internalFormat);
225 
226  glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
227  }
228  break;
229 
230  case GL_TEXTURE_3D: {
231  glBindTexture(GL_TEXTURE_3D, texture);
232  glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &width);
233  glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &height);
234  glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &frames);
235  glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_INTERNAL_FORMAT,
236  &internalFormat);
237 
238  channels = getChannelsFromInternalFormatGL(internalFormat);
239 
240  glBindTexture(GL_TEXTURE_3D, 0);
241  }
242  break;
243  }
244 }
245 
246 } // end namespace pic
247 
248 #endif /* PIC_UTIL_GL_FORMATS_HPP */
249 
void getModesIntegerGL(int channels, int &mode, int &modeInternalFormat)
getModesIntegerGL
Definition: formats.hpp:97
void getModesHalfGL(int channels, int &mode, int &modeInternalFormat)
getModesHalfGL
Definition: formats.hpp:65
int getChannelsFromInternalFormatGL(int internalFormat)
getChannelsFromInternalFormatGL returns the number of channels given an internal format.
Definition: formats.hpp:128
PIC_INLINE void getTextureInformationGL(GLuint texture, GLuint target, int &width, int &height, int &frames, int &channels)
getTextureInformationGL returns width, height and frames values from a texture with target...
Definition: formats.hpp:173
void getModesGL(int channels, int &mode, int &modeInternalFormat)
getModesGL
Definition: formats.hpp:33
#define PIC_INLINE
Definition: base.hpp:33
Definition: bilateral_separation.hpp:25