#ifndef PIXELBUFFER_H #define PIXELBUFFER_H /* * All the available pixel formats. This list will probably grow over time. As * you can probably tell, they are nomenclatural. PF_ starts each one, then * one letter for each channel followed by a number for each channel saying how * many bits long it is. Should this be revised to channel-number-channel-number * style naming? */ #if (__GNUC__>=3) /* For GCC version 3 and up, you have to do this to avoid possible size optimization that can happen unless you force inlining. */ # define ALWAYS_INLINE __inline __attribute__((always_inline)) #else # define ALWAYS_INLINE __inline #endif #define PF_R8G8B8A8 0 #define PF_B8G8R8A8 1 #define PF_R8G8B8 2 #define PF_B8G8R8 3 #define PF_I8 4 #define PF_A8 5 #define PF_ANY 6 /* * This took me 3 days. You gotta respect that. Anyway, it basically has a * bunch of functions for managing pixel buffers. I must credit the people at * Blitz. I learned a lot about this type of thing from their BlitzMax TPixmap * type. Read the following documentation to see the purpose of each function. */ #ifdef __cplusplus extern "C" { #endif /* Copy raw pixel data from one buffer to the other. They must both exist. */ int PixelBufferCopy(unsigned char *in,unsigned char *out, int format,unsigned int count); /* Convert raw pixel data from one buffer to the other. They must both exist. */ int PixelBufferConvert(unsigned char *in,int in_format, unsigned char *out,int out_format,unsigned int count); #ifdef __cplusplus } #endif /* Get information of the aspects of a format. */ ALWAYS_INLINE unsigned int PixelFormatBytesPerPixel(int format) { switch (format) { case PF_R8G8B8A8: return 4; case PF_B8G8R8A8: return 4; case PF_R8G8B8: return 3; case PF_B8G8R8: return 3; case PF_I8: return 1; case PF_A8: return 1; } return 0; } ALWAYS_INLINE unsigned int PixelFormatColorBitsPerPixel(int format) { switch (format) { case PF_R8G8B8A8: return 24; case PF_B8G8R8A8: return 24; case PF_R8G8B8: return 24; case PF_B8G8R8: return 24; case PF_I8: return 0; case PF_A8: return 0; } return 0; } ALWAYS_INLINE unsigned int PixelFormatRed(int format) { switch (format) { case PF_R8G8B8A8: return 8; case PF_B8G8R8A8: return 8; case PF_R8G8B8: return 8; case PF_B8G8R8: return 8; case PF_I8: return 0; case PF_A8: return 0; } return 0; } ALWAYS_INLINE unsigned int PixelFormatGreen(int format) { switch (format) { case PF_R8G8B8A8: return 8; case PF_B8G8R8A8: return 8; case PF_R8G8B8: return 8; case PF_B8G8R8: return 8; case PF_I8: return 0; case PF_A8: return 0; } return 0; } ALWAYS_INLINE unsigned int PixelFormatBlue(int format) { switch (format) { case PF_R8G8B8A8: return 8; case PF_B8G8R8A8: return 8; case PF_R8G8B8: return 8; case PF_B8G8R8: return 8; case PF_I8: return 0; case PF_A8: return 0; } return 0; } ALWAYS_INLINE unsigned int PixelFormatAlpha(int format) { switch (format) { case PF_R8G8B8A8: return 8; case PF_B8G8R8A8: return 8; case PF_R8G8B8: return 0; case PF_B8G8R8: return 0; case PF_I8: return 0; case PF_A8: return 8; } return 0; } ALWAYS_INLINE unsigned int PixelFormatIntensity(int format) { switch (format) { case PF_R8G8B8A8: return 0; case PF_B8G8R8A8: return 0; case PF_R8G8B8: return 0; case PF_B8G8R8: return 0; case PF_I8: return 8; case PF_A8: return 0; } return 0; } /* * I really did write all of these from scratch. Kneel. They are used by * the main conversion function, which is merely provided for convenience. */ int PixelBufferConvertR8G8B8A8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8A8toR8G8B8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8A8toB8G8R8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8A8toI8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8A8toA8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8A8toR8G8B8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8A8toR8G8B8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8A8toB8G8R8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8A8toI8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8A8toA8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8toR8G8B8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8toB8G8R8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8toI8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertR8G8B8toA8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8toR8G8B8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8toR8G8B8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8toI8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertB8G8R8toA8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertI8toR8G8B8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertI8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertI8toR8G8B8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertI8toB8G8R8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertI8toA8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertA8toR8G8B8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertA8toB8G8R8A8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertA8toR8G8B8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertA8toB8G8R8(unsigned char *in,unsigned char *out,unsigned int count); int PixelBufferConvertA8toI8(unsigned char *in,unsigned char *out,unsigned int count); #endif