Developer Documentation
color_cast.hh
1 /* ========================================================================= *
2  * *
3  * OpenMesh *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openmesh.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenMesh. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 
43 
44 
45 //=============================================================================
46 //
47 // Helper Functions for binary reading / writing
48 //
49 //=============================================================================
50 
51 
52 #ifndef OPENMESH_COLOR_CAST_HH
53 #define OPENMESH_COLOR_CAST_HH
54 
55 
56 //== INCLUDES =================================================================
57 
58 
60 #include <OpenMesh/Core/Utils/vector_cast.hh>
61 
62 //== NAMESPACES ===============================================================
63 
64 
65 namespace OpenMesh {
66 
67 
68 //=============================================================================
69 
70 
74 
75 //-----------------------------------------------------------------------------
76 #ifndef DOXY_IGNORE_THIS
77 
79 template <typename dst_t, typename src_t>
80 struct color_caster
81 {
82  typedef dst_t return_type;
83 
84  inline static return_type cast(const src_t& _src)
85  {
86  dst_t dst;
87  vector_cast(_src, dst, GenProg::Int2Type<vector_traits<dst_t>::size_>());
88  return dst;
89  }
90 };
91 
92 
93 template <>
94 struct color_caster<Vec3uc,Vec3f>
95 {
96  typedef Vec3uc return_type;
97 
98  inline static return_type cast(const Vec3f& _src)
99  {
100  return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f),
101  (unsigned char)(_src[1]* 255.0f + 0.5f),
102  (unsigned char)(_src[2]* 255.0f + 0.5f) );
103  }
104 };
105 
106 template <>
107 struct color_caster<Vec3uc,Vec4f>
108 {
109  typedef Vec3uc return_type;
110 
111  inline static return_type cast(const Vec4f& _src)
112  {
113  return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f),
114  (unsigned char)(_src[1]* 255.0f + 0.5f),
115  (unsigned char)(_src[2]* 255.0f + 0.5f) );
116  }
117 };
118 
119 template <>
120 struct color_caster<Vec3i,Vec3f>
121 {
122  typedef Vec3i return_type;
123 
124  inline static return_type cast(const Vec3f& _src)
125  {
126  return Vec3i( (int)(_src[0]* 255.0f + 0.5f),
127  (int)(_src[1]* 255.0f + 0.5f),
128  (int)(_src[2]* 255.0f + 0.5f) );
129  }
130 };
131 
132 template <>
133 struct color_caster<Vec3i,Vec4f>
134 {
135  typedef Vec3i return_type;
136 
137  inline static return_type cast(const Vec4f& _src)
138  {
139  return Vec3i( (int)(_src[0]* 255.0f + 0.5f),
140  (int)(_src[1]* 255.0f + 0.5f),
141  (int)(_src[2]* 255.0f + 0.5f) );
142  }
143 };
144 
145 template <>
146 struct color_caster<Vec4i,Vec4f>
147 {
148  typedef Vec4i return_type;
149 
150  inline static return_type cast(const Vec4f& _src)
151  {
152  return Vec4i( (int)(_src[0]* 255.0f + 0.5f),
153  (int)(_src[1]* 255.0f + 0.5f),
154  (int)(_src[2]* 255.0f + 0.5f),
155  (int)(_src[3]* 255.0f + 0.5f) );
156  }
157 };
158 
159 template <>
160 struct color_caster<Vec3ui,Vec3f>
161 {
162  typedef Vec3ui return_type;
163 
164  inline static return_type cast(const Vec3f& _src)
165  {
166  return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f),
167  (unsigned int)(_src[1]* 255.0f + 0.5f),
168  (unsigned int)(_src[2]* 255.0f + 0.5f) );
169  }
170 };
171 
172 template <>
173 struct color_caster<Vec3ui,Vec4f>
174 {
175  typedef Vec3ui return_type;
176 
177  inline static return_type cast(const Vec4f& _src)
178  {
179  return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f),
180  (unsigned int)(_src[1]* 255.0f + 0.5f),
181  (unsigned int)(_src[2]* 255.0f + 0.5f) );
182  }
183 };
184 
185 template <>
186 struct color_caster<Vec4ui,Vec4f>
187 {
188  typedef Vec4ui return_type;
189 
190  inline static return_type cast(const Vec4f& _src)
191  {
192  return Vec4ui( (unsigned int)(_src[0]* 255.0f + 0.5f),
193  (unsigned int)(_src[1]* 255.0f + 0.5f),
194  (unsigned int)(_src[2]* 255.0f + 0.5f),
195  (unsigned int)(_src[3]* 255.0f + 0.5f) );
196  }
197 };
198 
199 template <>
200 struct color_caster<Vec4uc,Vec3f>
201 {
202  typedef Vec4uc return_type;
203 
204  inline static return_type cast(const Vec3f& _src)
205  {
206  return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f),
207  (unsigned char)(_src[1]* 255.0f + 0.5f),
208  (unsigned char)(_src[2]* 255.0f + 0.5f),
209  (unsigned char)(255) );
210  }
211 };
212 
213 template <>
214 struct color_caster<Vec4f,Vec3f>
215 {
216  typedef Vec4f return_type;
217 
218  inline static return_type cast(const Vec3f& _src)
219  {
220  return Vec4f( _src[0],
221  _src[1],
222  _src[2],
223  1.0f );
224  }
225 };
226 
227 template <>
228 struct color_caster<Vec4ui,Vec3uc>
229 {
230  typedef Vec4ui return_type;
231 
232  inline static return_type cast(const Vec3uc& _src)
233  {
234  return Vec4ui(_src[0],
235  _src[1],
236  _src[2],
237  255 );
238  }
239 };
240 
241 template <>
242 struct color_caster<Vec4f,Vec3i>
243 {
244  typedef Vec4f return_type;
245 
246  inline static return_type cast(const Vec3i& _src)
247  {
248  const float f = 1.0f / 255.0f;
249  return Vec4f(_src[0]*f, _src[1]*f, _src[2]*f, 1.0f );
250  }
251 };
252 
253 template <>
254 struct color_caster<Vec4uc,Vec4f>
255 {
256  typedef Vec4uc return_type;
257 
258  inline static return_type cast(const Vec4f& _src)
259  {
260  return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f),
261  (unsigned char)(_src[1]* 255.0f + 0.5f),
262  (unsigned char)(_src[2]* 255.0f + 0.5f),
263  (unsigned char)(_src[3]* 255.0f + 0.5f) );
264  }
265 };
266 
267 template <>
268 struct color_caster<Vec4f,Vec4i>
269 {
270  typedef Vec4f return_type;
271 
272  inline static return_type cast(const Vec4i& _src)
273  {
274  const float f = 1.0f / 255.0f;
275  return Vec4f( _src[0] * f, _src[1] * f, _src[2] * f , _src[3] * f );
276  }
277 };
278 
279 template <>
280 struct color_caster<Vec4uc,Vec3uc>
281 {
282  typedef Vec4uc return_type;
283 
284  inline static return_type cast(const Vec3uc& _src)
285  {
286  return Vec4uc( _src[0], _src[1], _src[2], 255 );
287  }
288 };
289 
290 template <>
291 struct color_caster<Vec3f, Vec3uc>
292 {
293  typedef Vec3f return_type;
294 
295  inline static return_type cast(const Vec3uc& _src)
296  {
297  const float f = 1.0f / 255.0f;
298  return Vec3f(_src[0] * f, _src[1] * f, _src[2] * f );
299  }
300 };
301 
302 template <>
303 struct color_caster<Vec3f, Vec4uc>
304 {
305  typedef Vec3f return_type;
306 
307  inline static return_type cast(const Vec4uc& _src)
308  {
309  const float f = 1.0f / 255.0f;
310  return Vec3f(_src[0] * f, _src[1] * f, _src[2] * f );
311  }
312 };
313 
314 template <>
315 struct color_caster<Vec4f, Vec3uc>
316 {
317  typedef Vec4f return_type;
318 
319  inline static return_type cast(const Vec3uc& _src)
320  {
321  const float f = 1.0f / 255.0f;
322  return Vec4f(_src[0] * f, _src[1] * f, _src[2] * f, 1.0f );
323  }
324 };
325 
326 template <>
327 struct color_caster<Vec4f, Vec4uc>
328 {
329  typedef Vec4f return_type;
330 
331  inline static return_type cast(const Vec4uc& _src)
332  {
333  const float f = 1.0f / 255.0f;
334  return Vec4f(_src[0] * f, _src[1] * f, _src[2] * f, _src[3] * f );
335  }
336 };
337 
338 // ----------------------------------------------------------------------------
339 
340 
341 #ifndef DOXY_IGNORE_THIS
342 
343 #if !defined(OM_CC_MSVC)
344 template <typename dst_t>
345 struct color_caster<dst_t,dst_t>
346 {
347  typedef const dst_t& return_type;
348 
349  inline static return_type cast(const dst_t& _src)
350  {
351  return _src;
352  }
353 };
354 #endif
355 
356 #endif
357 
358 //-----------------------------------------------------------------------------
359 
360 
361 template <typename dst_t, typename src_t>
362 inline
363 typename color_caster<dst_t, src_t>::return_type
364 color_cast(const src_t& _src )
365 {
366  return color_caster<dst_t, src_t>::cast(_src);
367 }
368 
369 #endif
370 //-----------------------------------------------------------------------------
371 
373 
374 
375 //=============================================================================
376 } // namespace OpenMesh
377 //=============================================================================
378 #endif // OPENMESH_COLOR_CAST_HH defined
379 //=============================================================================
380 
VectorT< unsigned int, 3 > Vec3ui
Definition: Vector11T.hh:829
VectorT< signed int, 4 > Vec4i
Definition: Vector11T.hh:846
void vector_cast(const src_t &_src, dst_t &_dst, GenProg::Int2Type< n >)
Cast vector type to another vector type by copying the vector elements.
Definition: vector_cast.hh:81
VectorT< float, 3 > Vec3f
Definition: Vector11T.hh:831
VectorT< signed int, 3 > Vec3i
Definition: Vector11T.hh:827
VectorT< unsigned char, 4 > Vec4uc
Definition: Vector11T.hh:840
static const size_t size_
size/dimension of the vector
VectorT< unsigned char, 3 > Vec3uc
Definition: Vector11T.hh:821
VectorT< unsigned int, 4 > Vec4ui
Definition: Vector11T.hh:848
VectorT< float, 4 > Vec4f
Definition: Vector11T.hh:850