OGLplus (0.52.0) a C++ wrapper for OpenGL

image_spec.hpp
Go to the documentation of this file.
1 
12 #pragma once
13 #ifndef OGLPLUS_IMAGES_IMAGE_SPEC_1202210916_HPP
14 #define OGLPLUS_IMAGES_IMAGE_SPEC_1202210916_HPP
15 
16 #include <oglplus/pixel_data.hpp>
17 #include <oglplus/data_type.hpp>
18 #include <oglplus/one_of.hpp>
19 
20 namespace oglplus {
21 namespace images {
22 
25 {
26  typedef OneOf<
27  GLenum,
28  std::tuple<
29  DataType,
31  >
32  > PixDataType;
33 
34  GLsizei width;
35  GLsizei height;
36  GLsizei depth;
37  PixelDataFormat format;
38  PixelDataInternalFormat internal_format;
39  PixDataType data_type;
40  const void* data_ptr;
41 
43  GLsizei w,
44  GLsizei h,
45  GLsizei d,
46  PixelDataFormat fmt,
48  PixDataType type,
49  const void* data
50  ): width(w)
51  , height(h)
52  , depth(d)
53  , format(fmt)
54  , internal_format(ifmt)
55  , data_type(type)
56  , data_ptr(data)
57  { }
58 };
59 
60 struct ImageSpec
62 {
63  typedef ImageSpecData _base;
65  {
66  return PixelDataInternalFormat(GLenum(fmt));
67  }
68  static PixelDataFormat _conv(PixelDataInternalFormat ifmt)
69  {
70  return PixelDataFormat(GLenum(ifmt));
71  }
72 
73  ImageSpec(void)
74  : _base(
75  1, 1, 1,
78  PixelDataType(),
79  nullptr
80  )
81  { }
82 
83  ImageSpec(
84  GLsizei w,
85  GLsizei h,
87  ): _base(w, h, 1, _conv(ifmt), ifmt, PixelDataType(), nullptr)
88  { }
89 
90  ImageSpec(
91  GLsizei w,
92  GLsizei h,
93  PixelDataFormat fmt,
94  PixDataType type
95  ): _base(w, h, 1, fmt, _conv(fmt), type, nullptr)
96  { }
97 
98  ImageSpec(
99  GLsizei w,
100  PixelDataFormat fmt,
102  PixDataType type
103  ): _base(w, 1, 1, fmt, ifmt, type, nullptr)
104  { }
105 
106  ImageSpec(
107  GLsizei w,
108  GLsizei h,
109  PixelDataFormat fmt,
111  PixDataType type
112  ): _base(w, h, 1, fmt, ifmt, type, nullptr)
113  { }
114 
115  ImageSpec(
116  GLsizei w,
117  GLsizei h,
118  GLsizei d,
119  PixelDataFormat fmt,
121  PixDataType type
122  ): _base(w, h, d, fmt, ifmt, type, nullptr)
123  { }
124 
125  template <typename T>
126  ImageSpec(
127  GLsizei w,
128  GLsizei h,
129  PixelDataFormat fmt,
130  const T* data,
131  typename std::enable_if<
132  IsGLDataType<T>::value,
133  const T*
134  >::type = nullptr
135  ): _base(w, h, 1, fmt, _conv(fmt), GetDataType<T>(), data)
136  { }
137 
138  template <typename T>
139  ImageSpec(
140  GLsizei w,
141  PixelDataFormat fmt,
143  const T* data,
144  typename std::enable_if<
145  IsGLDataType<T>::value,
146  const T*
147  >::type = nullptr
148 
149  ): _base(w, 1, 1, fmt, ifmt, GetDataType<T>(), data)
150  { }
151 
152  template <typename T>
153  ImageSpec(
154  GLsizei w,
155  GLsizei h,
156  PixelDataFormat fmt,
158  const T* data,
159  typename std::enable_if<
160  IsGLDataType<T>::value,
161  const T*
162  >::type = nullptr
163 
164  ): _base(w, h, 1, fmt, ifmt, GetDataType<T>(), data)
165  { }
166 
167  template <typename T>
168  ImageSpec(
169  GLsizei w,
170  GLsizei h,
171  GLsizei d,
172  PixelDataFormat fmt,
174  const T* data,
175  typename std::enable_if<
176  IsGLDataType<T>::value,
177  const T*
178  >::type = nullptr
179 
180  ): _base(w, h, d, fmt, ifmt, GetDataType<T>(), data)
181  { }
182 
183  ImageSpec& Format(PixelDataFormat fmt)
184  {
185  format = fmt;
186  return *this;
187  }
188 
189  ImageSpec& Format(PixelDataInternalFormat ifmt)
190  {
191  internal_format = ifmt;
192  return *this;
193  }
194 
195  ImageSpec& Type(PixDataType type)
196  {
197  data_type = type;
198  return *this;
199  }
200 
201  ImageSpec& NextDim(GLsizei dim)
202  {
203  assert(dim > 0);
204  if(width <= 1)
205  {
206  width = dim;
207  }
208  else if(height <= 1)
209  {
210  height = dim;
211  }
212  else if(depth <= 1)
213  {
214  depth = dim;
215  }
216  else assert(!"Too many dimensions specified!");
217  return *this;
218  }
219 };
220 
221 inline ImageSpec& operator << (ImageSpec& that, GLsizei dim)
222 {
223  return that.NextDim(dim);
224 }
225 
226 inline ImageSpec&& operator << (ImageSpec&& that, GLsizei dim)
227 {
228  return std::move(that.NextDim(dim));
229 }
230 
231 inline ImageSpec& operator << (ImageSpec& that, PixelDataFormat f)
232 {
233  return that.Format(f);
234 }
235 
236 inline ImageSpec&& operator << (ImageSpec&& that, PixelDataFormat f)
237 {
238  return std::move(that.Format(f));
239 }
240 
241 inline ImageSpec& operator << (ImageSpec& that, PixelDataInternalFormat f)
242 {
243  return that.Format(f);
244 }
245 
246 inline ImageSpec&& operator << (ImageSpec&& that, PixelDataInternalFormat f)
247 {
248  return std::move(that.Format(f));
249 }
250 
251 } // namespace images
252 } // namespace oglplus
253 
254 #endif // include guard
DataType
OpenGL data type enumeration.
Definition: data_type.hpp:34
PixelDataInternalFormat
OpenGL pixel data internal format enumeration.
Definition: pixel_data.hpp:79
PixelDataType
OpenGL pixel data type enumeration.
Definition: pixel_data.hpp:29
PixelDataFormat
OpenGL pixel data format enumeration.
Definition: pixel_data.hpp:50
Data type-related declarations.
Pixel data-related declarations.
Stores a value having one of the listed types in a common representation.
Definition: one_of.hpp:60
DataType GetDataType(void)
Returns the DataType for the specified type T.
Definition: data_type.hpp:94
Class containing data for texture image specification.
Definition: image_spec.hpp:24
PixelDataFormat Format
Alias for PixelDataFormat.
Definition: pixel_data.hpp:66
Variant helper class used mostly with enums.

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Mon Sep 22 2014 by Doxygen (version 1.8.6).