#include "pixelbuffer.h" #include #include int PixelBufferCopy(unsigned char *in,unsigned char *out,int format,unsigned int count) { /* Failiure if either buffer not alloced. */ if (!in) return 0; if (!out) return 0; memcpy(out,in,count*PixelFormatBytesPerPixel(format)); /* Simple copy. */ return 1; /* Success. */ } /* * The rest is quite obvious and the idea of documenting it * makes my brain turn inside-out. */ int PixelBufferConvert(unsigned char *in,int in_format,unsigned char *out, int out_format,unsigned int count) { switch (in_format) { case PF_R8G8B8A8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferCopy(in,out,PF_R8G8B8A8,count); case PF_B8G8R8A8: return PixelBufferConvertR8G8B8A8toB8G8R8A8(in,out,count); case PF_R8G8B8: return PixelBufferConvertR8G8B8A8toR8G8B8(in,out,count); case PF_B8G8R8: return PixelBufferConvertR8G8B8A8toB8G8R8(in,out,count); case PF_I8: return PixelBufferConvertR8G8B8A8toI8(in,out,count); case PF_A8: return PixelBufferConvertR8G8B8A8toA8(in,out,count); } break; case PF_B8G8R8A8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferConvertB8G8R8A8toR8G8B8A8(in,out,count); case PF_B8G8R8A8: return PixelBufferCopy(in,out,PF_B8G8R8A8,count); case PF_R8G8B8: return PixelBufferConvertB8G8R8A8toR8G8B8(in,out,count); case PF_B8G8R8: return PixelBufferConvertB8G8R8A8toB8G8R8(in,out,count); case PF_I8: return PixelBufferConvertB8G8R8A8toI8(in,out,count); case PF_A8: return PixelBufferConvertB8G8R8A8toA8(in,out,count); } break; case PF_R8G8B8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferConvertR8G8B8toR8G8B8A8(in,out,count); case PF_B8G8R8A8: return PixelBufferConvertR8G8B8toB8G8R8A8(in,out,count); case PF_R8G8B8: return PixelBufferCopy(in,out,PF_R8G8B8,count); case PF_B8G8R8: return PixelBufferConvertR8G8B8toB8G8R8(in,out,count); case PF_I8: return PixelBufferConvertR8G8B8toI8(in,out,count); case PF_A8: return PixelBufferConvertR8G8B8toA8(in,out,count); } break; case PF_B8G8R8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferConvertB8G8R8toR8G8B8A8(in,out,count); case PF_B8G8R8A8: return PixelBufferConvertB8G8R8toB8G8R8A8(in,out,count); case PF_R8G8B8: return PixelBufferConvertB8G8R8toR8G8B8(in,out,count); case PF_B8G8R8: return PixelBufferCopy(in,out,PF_B8G8R8,count); case PF_I8: return PixelBufferConvertB8G8R8toI8(in,out,count); case PF_A8: return PixelBufferConvertB8G8R8toA8(in,out,count); } break; case PF_I8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferConvertI8toR8G8B8A8(in,out,count); case PF_B8G8R8A8: return PixelBufferConvertI8toB8G8R8A8(in,out,count); case PF_R8G8B8: return PixelBufferConvertI8toR8G8B8(in,out,count); case PF_B8G8R8: return PixelBufferConvertI8toB8G8R8(in,out,count); case PF_I8: return PixelBufferCopy(in,out,PF_I8,count); case PF_A8: return PixelBufferConvertI8toA8(in,out,count); } break; case PF_A8: switch (out_format) { case PF_R8G8B8A8: return PixelBufferConvertA8toR8G8B8A8(in,out,count); case PF_B8G8R8A8: return PixelBufferConvertA8toB8G8R8A8(in,out,count); case PF_R8G8B8: return PixelBufferConvertA8toR8G8B8(in,out,count); case PF_B8G8R8: return PixelBufferConvertA8toB8G8R8(in,out,count); case PF_I8: return PixelBufferConvertA8toI8(in,out,count); case PF_A8: return PixelBufferCopy(in,out,PF_A8,count); } break; } return 0; } int PixelBufferConvertR8G8B8A8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count) { register unsigned int p; for (p=0; p