32 #if OGRE_COMPILER != OGRE_COMPILER_MSVC || OGRE_COMP_VER >= 1300
34 #define FMTCONVERTERID(from,to) (((from)<<8)|(to))
52 template <
class U>
struct PixelBoxConverter
54 static const int ID = U::ID;
57 typename U::SrcType *srcptr =
static_cast<typename U::SrcType*
>(src.
data)
59 typename U::DstType *dstptr =
static_cast<typename U::DstType*
>(dst.
data)
68 for(
size_t x=0; x<k; x++)
70 dstptr[x] = U::pixelConvert(srcptr[x]);
75 srcptr += srcSliceSkip;
76 dstptr += dstSliceSkip;
81 template <
typename T,
typename U,
int id>
struct PixelConverter {
82 static const int ID = id;
92 Col3b(
unsigned int a,
unsigned int b,
unsigned int c):
98 Col3f(
float inR,
float inG,
float inB):
99 r(inR), g(inG), b(inB) { }
104 Col4f(
float inR,
float inG,
float inB,
float inA):
105 r(inR), g(inG), b(inB), a(inA) { }
109 struct A8R8G8B8toA8B8G8R8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8R8G8B8, PF_A8B8G8R8)>
111 inline static DstType pixelConvert(SrcType inp)
113 return ((inp&0x000000FF)<<16)|(inp&0xFF00FF00)|((inp&0x00FF0000)>>16);
117 struct A8R8G8B8toB8G8R8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8R8G8B8, PF_B8G8R8A8)>
119 inline static DstType pixelConvert(SrcType inp)
121 return ((inp&0x000000FF)<<24)|((inp&0x0000FF00)<<8)|((inp&0x00FF0000)>>8)|((inp&0xFF000000)>>24);
125 struct A8R8G8B8toR8G8B8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8R8G8B8, PF_R8G8B8A8)>
127 inline static DstType pixelConvert(SrcType inp)
129 return ((inp&0x00FFFFFF)<<8)|((inp&0xFF000000)>>24);
133 struct A8B8G8R8toA8R8G8B8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8B8G8R8, PF_A8R8G8B8)>
135 inline static DstType pixelConvert(SrcType inp)
137 return ((inp&0x000000FF)<<16)|(inp&0xFF00FF00)|((inp&0x00FF0000)>>16);
141 struct A8B8G8R8toB8G8R8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8B8G8R8, PF_B8G8R8A8)>
143 inline static DstType pixelConvert(SrcType inp)
145 return ((inp&0x00FFFFFF)<<8)|((inp&0xFF000000)>>24);
149 struct A8B8G8R8toR8G8B8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_A8B8G8R8, PF_R8G8B8A8)>
151 inline static DstType pixelConvert(SrcType inp)
153 return ((inp&0x000000FF)<<24)|((inp&0x0000FF00)<<8)|((inp&0x00FF0000)>>8)|((inp&0xFF000000)>>24);
157 struct B8G8R8A8toA8R8G8B8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_B8G8R8A8, PF_A8R8G8B8)>
159 inline static DstType pixelConvert(SrcType inp)
161 return ((inp&0x000000FF)<<24)|((inp&0x0000FF00)<<8)|((inp&0x00FF0000)>>8)|((inp&0xFF000000)>>24);
165 struct B8G8R8A8toA8B8G8R8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_B8G8R8A8, PF_A8B8G8R8)>
167 inline static DstType pixelConvert(SrcType inp)
169 return ((inp&0x000000FF)<<24)|((inp&0xFFFFFF00)>>8);
173 struct B8G8R8A8toR8G8B8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_B8G8R8A8, PF_R8G8B8A8)>
175 inline static DstType pixelConvert(SrcType inp)
177 return ((inp&0x0000FF00)<<16)|(inp&0x00FF00FF)|((inp&0xFF000000)>>16);
181 struct R8G8B8A8toA8R8G8B8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_R8G8B8A8, PF_A8R8G8B8)>
183 inline static DstType pixelConvert(SrcType inp)
185 return ((inp&0x000000FF)<<24)|((inp&0xFFFFFF00)>>8);
189 struct R8G8B8A8toA8B8G8R8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_R8G8B8A8, PF_A8B8G8R8)>
191 inline static DstType pixelConvert(SrcType inp)
193 return ((inp&0x000000FF)<<24)|((inp&0x0000FF00)<<8)|((inp&0x00FF0000)>>8)|((inp&0xFF000000)>>24);
197 struct R8G8B8A8toB8G8R8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_R8G8B8A8, PF_B8G8R8A8)>
199 inline static DstType pixelConvert(SrcType inp)
201 return ((inp&0x0000FF00)<<16)|(inp&0x00FF00FF)|((inp&0xFF000000)>>16);
205 struct A8B8G8R8toL8:
public PixelConverter <Ogre::uint32, Ogre::uint8, FMTCONVERTERID(PF_A8B8G8R8, PF_L8)>
207 inline static DstType pixelConvert(SrcType inp)
213 struct L8toA8B8G8R8:
public PixelConverter <Ogre::uint8, Ogre::uint32, FMTCONVERTERID(PF_L8, PF_A8B8G8R8)>
215 inline static DstType pixelConvert(SrcType inp)
217 return 0xFF000000|(((
unsigned int)inp)<<0)|(((
unsigned int)inp)<<8)|(((
unsigned int)inp)<<16);
221 struct A8R8G8B8toL8:
public PixelConverter <Ogre::uint32, Ogre::uint8, FMTCONVERTERID(PF_A8R8G8B8, PF_L8)>
223 inline static DstType pixelConvert(SrcType inp)
229 struct L8toA8R8G8B8:
public PixelConverter <Ogre::uint8, Ogre::uint32, FMTCONVERTERID(PF_L8, PF_A8R8G8B8)>
231 inline static DstType pixelConvert(SrcType inp)
233 return 0xFF000000|(((
unsigned int)inp)<<0)|(((
unsigned int)inp)<<8)|(((
unsigned int)inp)<<16);
237 struct B8G8R8A8toL8:
public PixelConverter <Ogre::uint32, Ogre::uint8, FMTCONVERTERID(PF_B8G8R8A8, PF_L8)>
239 inline static DstType pixelConvert(SrcType inp)
245 struct L8toB8G8R8A8:
public PixelConverter <Ogre::uint8, Ogre::uint32, FMTCONVERTERID(PF_L8, PF_B8G8R8A8)>
247 inline static DstType pixelConvert(SrcType inp)
249 return 0x000000FF|(((
unsigned int)inp)<<8)|(((
unsigned int)inp)<<16)|(((
unsigned int)inp)<<24);
253 struct L8toL16:
public PixelConverter <Ogre::uint8, Ogre::uint16, FMTCONVERTERID(PF_L8, PF_L16)>
255 inline static DstType pixelConvert(SrcType inp)
257 return (
Ogre::uint16)((((
unsigned int)inp)<<8)|(((
unsigned int)inp)));
261 struct L16toL8:
public PixelConverter <Ogre::uint16, Ogre::uint8, FMTCONVERTERID(PF_L16, PF_L8)>
263 inline static DstType pixelConvert(SrcType inp)
269 struct R8G8B8toB8G8R8:
public PixelConverter <Col3b, Col3b, FMTCONVERTERID(PF_R8G8B8, PF_B8G8R8)>
271 inline static DstType pixelConvert(
const SrcType &inp)
273 return Col3b(inp.z, inp.y, inp.x);
277 struct B8G8R8toR8G8B8:
public PixelConverter <Col3b, Col3b, FMTCONVERTERID(PF_B8G8R8, PF_R8G8B8)>
279 inline static DstType pixelConvert(
const SrcType &inp)
281 return Col3b(inp.z, inp.y, inp.x);
286 template <
int id,
unsigned int xshift,
unsigned int yshift,
unsigned int zshift,
unsigned int ashift>
struct Col3btoUint32swizzler:
287 public PixelConverter <Col3b, Ogre::uint32, id>
289 inline static Ogre::uint32 pixelConvert(
const Col3b &inp)
291 #if OGRE_ENDIAN == OGRE_ENDIAN_BIG
292 return (0xFF<<ashift) | (((
unsigned int)inp.x)<<xshift) | (((
unsigned int)inp.y)<<yshift) | (((
unsigned int)inp.z)<<zshift);
294 return (0xFF<<ashift) | (((
unsigned int)inp.x)<<zshift) | (((
unsigned int)inp.y)<<yshift) | (((
unsigned int)inp.z)<<xshift);
299 struct R8G8B8toA8R8G8B8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_R8G8B8, PF_A8R8G8B8), 16, 8, 0, 24> { };
300 struct B8G8R8toA8R8G8B8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_B8G8R8, PF_A8R8G8B8), 0, 8, 16, 24> { };
301 struct R8G8B8toA8B8G8R8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_R8G8B8, PF_A8B8G8R8), 0, 8, 16, 24> { };
302 struct B8G8R8toA8B8G8R8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_B8G8R8, PF_A8B8G8R8), 16, 8, 0, 24> { };
303 struct R8G8B8toB8G8R8A8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_R8G8B8, PF_B8G8R8A8), 8, 16, 24, 0> { };
304 struct B8G8R8toB8G8R8A8:
public Col3btoUint32swizzler<FMTCONVERTERID(PF_B8G8R8, PF_B8G8R8A8), 24, 16, 8, 0> { };
306 struct A8R8G8B8toR8G8B8:
public PixelConverter <Ogre::uint32, Col3b, FMTCONVERTERID(PF_A8R8G8B8, PF_BYTE_RGB)>
313 struct A8R8G8B8toB8G8R8:
public PixelConverter <Ogre::uint32, Col3b, FMTCONVERTERID(PF_A8R8G8B8, PF_BYTE_BGR)>
323 struct X8R8G8B8toA8R8G8B8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8R8G8B8, PF_A8R8G8B8)>
325 inline static DstType pixelConvert(SrcType inp)
327 return inp | 0xFF000000;
330 struct X8R8G8B8toA8B8G8R8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8R8G8B8, PF_A8B8G8R8)>
332 inline static DstType pixelConvert(SrcType inp)
334 return ((inp&0x0000FF)<<16)|((inp&0xFF0000)>>16)|(inp&0x00FF00)|0xFF000000;
337 struct X8R8G8B8toB8G8R8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8R8G8B8, PF_B8G8R8A8)>
339 inline static DstType pixelConvert(SrcType inp)
341 return ((inp&0x0000FF)<<24)|((inp&0xFF0000)>>8)|((inp&0x00FF00)<<8)|0x000000FF;
344 struct X8R8G8B8toR8G8B8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8R8G8B8, PF_R8G8B8A8)>
346 inline static DstType pixelConvert(SrcType inp)
348 return ((inp&0xFFFFFF)<<8)|0x000000FF;
353 struct X8B8G8R8toA8R8G8B8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8B8G8R8, PF_A8R8G8B8)>
355 inline static DstType pixelConvert(SrcType inp)
357 return ((inp&0x0000FF)<<16)|((inp&0xFF0000)>>16)|(inp&0x00FF00)|0xFF000000;
360 struct X8B8G8R8toA8B8G8R8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8B8G8R8, PF_A8B8G8R8)>
362 inline static DstType pixelConvert(SrcType inp)
364 return inp | 0xFF000000;
367 struct X8B8G8R8toB8G8R8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8B8G8R8, PF_B8G8R8A8)>
369 inline static DstType pixelConvert(SrcType inp)
371 return ((inp&0xFFFFFF)<<8)|0x000000FF;
374 struct X8B8G8R8toR8G8B8A8:
public PixelConverter <Ogre::uint32, Ogre::uint32, FMTCONVERTERID(PF_X8B8G8R8, PF_R8G8B8A8)>
376 inline static DstType pixelConvert(SrcType inp)
378 return ((inp&0x0000FF)<<24)|((inp&0xFF0000)>>8)|((inp&0x00FF00)<<8)|0x000000FF;
383 #define CASECONVERTER(type) case type::ID : PixelBoxConverter<type>::conversion(src, dst); return 1;
390 CASECONVERTER(A8R8G8B8toA8B8G8R8);
391 CASECONVERTER(A8R8G8B8toB8G8R8A8);
392 CASECONVERTER(A8R8G8B8toR8G8B8A8);
393 CASECONVERTER(A8B8G8R8toA8R8G8B8);
394 CASECONVERTER(A8B8G8R8toB8G8R8A8);
395 CASECONVERTER(A8B8G8R8toR8G8B8A8);
396 CASECONVERTER(B8G8R8A8toA8R8G8B8);
397 CASECONVERTER(B8G8R8A8toA8B8G8R8);
398 CASECONVERTER(B8G8R8A8toR8G8B8A8);
399 CASECONVERTER(R8G8B8A8toA8R8G8B8);
400 CASECONVERTER(R8G8B8A8toA8B8G8R8);
401 CASECONVERTER(R8G8B8A8toB8G8R8A8);
402 CASECONVERTER(A8B8G8R8toL8);
403 CASECONVERTER(L8toA8B8G8R8);
404 CASECONVERTER(A8R8G8B8toL8);
405 CASECONVERTER(L8toA8R8G8B8);
406 CASECONVERTER(B8G8R8A8toL8);
407 CASECONVERTER(L8toB8G8R8A8);
408 CASECONVERTER(L8toL16);
409 CASECONVERTER(L16toL8);
410 CASECONVERTER(B8G8R8toR8G8B8);
411 CASECONVERTER(R8G8B8toB8G8R8);
412 CASECONVERTER(R8G8B8toA8R8G8B8);
413 CASECONVERTER(B8G8R8toA8R8G8B8);
414 CASECONVERTER(R8G8B8toA8B8G8R8);
415 CASECONVERTER(B8G8R8toA8B8G8R8);
416 CASECONVERTER(R8G8B8toB8G8R8A8);
417 CASECONVERTER(B8G8R8toB8G8R8A8);
418 CASECONVERTER(A8R8G8B8toR8G8B8);
419 CASECONVERTER(A8R8G8B8toB8G8R8);
420 CASECONVERTER(X8R8G8B8toA8R8G8B8);
421 CASECONVERTER(X8R8G8B8toA8B8G8R8);
422 CASECONVERTER(X8R8G8B8toB8G8R8A8);
423 CASECONVERTER(X8R8G8B8toR8G8B8A8);
424 CASECONVERTER(X8B8G8R8toA8R8G8B8);
425 CASECONVERTER(X8B8G8R8toA8B8G8R8);
426 CASECONVERTER(X8B8G8R8toB8G8R8A8);
427 CASECONVERTER(X8B8G8R8toR8G8B8A8);
437 #endif // VC6 protection
size_t rowPitch
Number of elements between the leftmost pixel of one row and the left pixel of the next...
size_t getSliceSkip() const
Get the number of elements between one past the right bottom pixel of one slice and the left top pixe...
void * data
The data pointer.
PixelFormat format
The pixel format.
size_t slicePitch
Number of elements between the top left pixel of one (depth) slice and the top left pixel of the next...
A primitive describing a volume (3D), image (2D) or line (1D) of pixels in memory.