  | 
   Template Pixel Converter 
   Submitted by  |   
  
  
This piece code can convert between pre-described pixel formats 
(=color component size & order)
It uses templates, macros and enums for optimalisations
I use a simple technique using enums to prevent having to use 
switch statements
enum
{
   value = case1? result1:
    case2? result2:
    default
};  |  
  
 
This forces the compiler to calculate the value at compile time.
Obviously, this requires all the variables to be known to the compiler 
at compile time as well.
The code generated by the msvc compiler actually isn't that bad. 
i'm sure there are a lot of optimalisations that could be done here 
(by not using templates), especially when using assembly.
But this code actually makes it possible to have a generalized 
piece of code that handles any situation (except indexed colors 
or colors that have non-integer values)
...and it's a lot more fun to make ;)
I'm not sure how portable this code is, i've only tried it on msvc.
Also i've only tested this code with the debugger, looking at the 
resulting values.
So the code might have some small bugs, But they shouldn't be 
hard to solve.
Besides, that's beside the point.. This method Is not really 
practical in real-life applications due to the long compile-times.
The whole reason for me to write this was to experiment with various 
features of the C++ language. I hope some of the ideas used in this 
piece of code can inspire or teach something to someone.
Sander van Rossen (aka Not)
  
 | 
 
 
 
Currently browsing [pixelconverter.zip] (9,543 bytes) - [colordescription.h] - (9,367 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
 
 
  /*! 
	@brief		Used to describe the order of the color components in a color
*/
enum EColorType
{
	COLOR_NONE				,	///< Color has no components
	
	COLOR_RGBA				,	///< Color is ordered as RGBA
	COLOR_BGRA				,	///< Color is ordered as BGRA
	COLOR_ARGB				,	///< Color is ordered as ARGB
	COLOR_ABGR				,	///< Color is ordered as ABGR
	COLOR_RGB				,	///< Color is ordered as RGB (no ALPHA channel)
	COLOR_BGR				,	///< Color is ordered as BGR (no ALPHA channel)
	COLOR_RED				,	///< Color only has a RED color channel
	
	COLOR_GREEN				,	///< Color only has a GREEN color channel
	COLOR_BLUE				,	///< Color only has a BLUE color channel
	COLOR_ALPHA					///< Color only has an ALPHA channel
};//EColorType	
 
 
  /*! 
	@brief		ColorDescription describes a color and it's components
*/
template
<
	EColorType	tColorOrder	,	///< the order of all the color components
	cUInt		tRedSize	,	///< number of RED color component bits
	cUInt		tGreenSize	,	///< number of GREEN color component bits
	cUInt		tBlueSize	,	///< number of BLUE color component bits
	cUInt		tAlphaSize	,	///< number of ALPHA component bits
	cUInt		tSpacing		///< number of bits that are left unused
>
class ColorDescription
{
public:
	enum EColorConstants
	{
		//
		// Sizes of individual color components
		//
		RED_SIZE			= tRedSize		,	///< Size of the RED color component
		GREEN_SIZE			= tGreenSize	,	///< Size of the GREEN color component
		BLUE_SIZE			= tBlueSize		,	///< Size of the BLUE color component
		ALPHA_SIZE			= tAlphaSize	,	///< Size of the ALPHA component
		SPACING_SIZE		= tSpacing		,	///< Size of the unused space
  
		///
		/// Actuall size of color
		///
		COLOR_BIT_SIZE		= RED_SIZE		+ 
							  GREEN_SIZE	+ 
							  BLUE_SIZE		+ 
							  ALPHA_SIZE	,
  
		
		///
		/// Storage size of color
		///
		COLOR_STORAGE_BITS	= RED_SIZE		+ 
							  GREEN_SIZE	+ 
							  BLUE_SIZE		+ 
							  ALPHA_SIZE	+ 
							  SPACING_SIZE	,
 
 
  		///
		/// REMOVE_COMPONENT is used to shift a color component to outside an int
		/// this way the color component is simply removed instead of used in the
		/// calculation
		///
		REMOVE_COMPONENT	= BYTES_PER_INT ,
  		
  		//
		// Helpers to shorten the notation when calculating the position of each
		// component
		//
		POS_0				= 0,												///< at the start of the color
		POS_R				= RED_SIZE										,	///< after the RED component
		POS_G				=			 GREEN_SIZE							,	///< after the GREEN component
		POS_RG				= RED_SIZE + GREEN_SIZE							,	///< after the RED and GREEN components
		POS_B				=						  BLUE_SIZE				,	///< after the BLUE component
		POS_RB				= RED_SIZE +			  BLUE_SIZE				,	///< after the RED and BLUE components
		POS_GB				=			 GREEN_SIZE + BLUE_SIZE				,	///< after the GREEN and BLUE components
		POS_RGB				= RED_SIZE + GREEN_SIZE + BLUE_SIZE				,	///< after the RED, GREEN and BLUE components
		POS_A				=									  ALPHA_SIZE,	///< after the ALPHA component
		POS_RA				= RED_SIZE +						  ALPHA_SIZE,	///< after the RED and ALPHA components
		POS_GA				=			 GREEN_SIZE +			  ALPHA_SIZE,	///< after the GREEN and ALPHA components
		POS_RGA				= RED_SIZE + GREEN_SIZE +			  ALPHA_SIZE,	///< after the RED, GREEN and ALPHA components
		POS_BA				=						  BLUE_SIZE + ALPHA_SIZE,	///< after the RED, BLUE and ALPHA components
		POS_RBA				= RED_SIZE + 			  BLUE_SIZE + ALPHA_SIZE,	///< after the BLUE and ALPHA components
		POS_GBA				=			 GREEN_SIZE + BLUE_SIZE + ALPHA_SIZE,	///< after the GREEN, BLUE and ALPHA components
		POS_RGBA			= RED_SIZE + GREEN_SIZE + BLUE_SIZE + ALPHA_SIZE,	///< after the RED, GREEN, BLUE and ALPHA components
		
  
		//
		// Calculate the position of each color component in the color
		//
		/// Calculates the offset of the RED color component in the color
		///		This 'switch' statement is calculated at compile time
		RED_OFFSET			= (tColorOrder == COLOR_NONE )? REMOVE_COMPONENT:	///< this type of color has no components
							  (tColorOrder == COLOR_RGBA )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_BGRA )? POS_GB			:	///< component starts after the GREEN and BLUE components
							  (tColorOrder == COLOR_ARGB )? POS_A			:	///< component starts after the ALPHA component
							  (tColorOrder == COLOR_ABGR )? POS_GBA			:	///< component starts after the GREEN, BLUE and ALPHA components
							  (tColorOrder == COLOR_RGB  )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_BGR  )? POS_GB			:	///< component starts after the GREEN and BLUE components
							  (tColorOrder == COLOR_RED	 )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_GREEN)? REMOVE_COMPONENT:	///< this type of color has no RED
							  (tColorOrder == COLOR_BLUE )? REMOVE_COMPONENT:	///< this type of color has no RED
							  (tColorOrder == COLOR_ALPHA)? REMOVE_COMPONENT:	///< this type of color has no RED
							  REMOVE_COMPONENT,
  		/// Calculates the offset of the GREEN color component in the color
		///		This 'switch' statement is calculated at compile time
		GREEN_OFFSET		= (tColorOrder == COLOR_NONE )? REMOVE_COMPONENT:	///< this type of color has no components
							  (tColorOrder == COLOR_RGBA )? POS_R			:	///< component starts after the RED component
							  (tColorOrder == COLOR_BGRA )? POS_B			:	///< component starts after the BLUE component
							  (tColorOrder == COLOR_ARGB )? POS_RA			:	///< component starts after the GREEN and ALPHA components
							  (tColorOrder == COLOR_ABGR )? POS_BA			:	///< component starts after the BLUE and ALPHA components
							  (tColorOrder == COLOR_RGB  )? POS_R			:	///< component starts after the RED component
							  (tColorOrder == COLOR_BGR  )? POS_B			:	///< component starts after the BLUE component
							  (tColorOrder == COLOR_RED	 )? REMOVE_COMPONENT:	///< this type of color has no GREEN
							  (tColorOrder == COLOR_GREEN)? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_BLUE )? REMOVE_COMPONENT:	///< this type of color has no GREEN
							  (tColorOrder == COLOR_ALPHA)? REMOVE_COMPONENT:	///< this type of color has no GREEN
							  REMOVE_COMPONENT,
  		/// Calculates the offset of the BLUE color component in the color
		///		This 'switch' statement is calculated at compile time
		BLUE_OFFSET			= (tColorOrder == COLOR_NONE )? REMOVE_COMPONENT:	///< this type of color has no components
							  (tColorOrder == COLOR_RGBA )? POS_RG			:	///< component starts after the RED and GREEN components
							  (tColorOrder == COLOR_BGRA )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_ARGB )? POS_RGA			:	///< component starts after the RED, GREEN and ALPHA components
							  (tColorOrder == COLOR_ABGR )? POS_A			:	///< component starts after the ALPHA component
							  (tColorOrder == COLOR_RGB  )? POS_RG			:	///< component starts after the RED and GREEN components
							  (tColorOrder == COLOR_BGR  )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_RED	 )? REMOVE_COMPONENT:	///< this type of color has no BLUE
							  (tColorOrder == COLOR_GREEN)? REMOVE_COMPONENT:	///< this type of color has no BLUE
							  (tColorOrder == COLOR_BLUE )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_ALPHA)? REMOVE_COMPONENT:	///< this type of color has no BLUE
							  REMOVE_COMPONENT,
  		/// Calculates the offset of the ALPHA component in the color
		///		This 'switch' statement is calculated at compile time
		ALPHA_OFFSET		= (tColorOrder == COLOR_NONE )? REMOVE_COMPONENT:	///< this type of color has no components
							  (tColorOrder == COLOR_RGBA )? POS_RGB			:	///< component starts after the RED, GREEN and BLUE components
							  (tColorOrder == COLOR_BGRA )? POS_RGB			:	///< component starts after the RED, GREEN and BLUE components
							  (tColorOrder == COLOR_ARGB )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_ABGR )? POS_0			:	///< component starts at the beginning of the color
							  (tColorOrder == COLOR_RGB  )? REMOVE_COMPONENT:	///< this type of color has no ALPHA
							  (tColorOrder == COLOR_BGR  )? REMOVE_COMPONENT:	///< this type of color has no ALPHA
							  (tColorOrder == COLOR_RED	 )? REMOVE_COMPONENT:	///< this type of color has no ALPHA
							  (tColorOrder == COLOR_GREEN)? REMOVE_COMPONENT:	///< this type of color has no ALPHA
							  (tColorOrder == COLOR_BLUE )? REMOVE_COMPONENT:	///< this type of color has no ALPHA
							  (tColorOrder == COLOR_ALPHA)? POS_0			:	///< component starts at the beginning of the color
							  REMOVE_COMPONENT,
  
		///
		/// Set if the current color has an ALPHA channel
		///
		HAS_ALPHA			= ALPHA_SIZE	!= 0,
  		
		///
		/// Set if the current color IS an ALPHA channel
		///
		IS_ALPHA			= RED_SIZE		== 0 && 
							  GREEN_SIZE	== 0 && 
							  BLUE_SIZE		== 0 && 
							  ALPHA_SIZE	!= 0
	};//EColorConstants
  };//ColorDescription
   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [constants.h] - (571 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
  
//
// Some constants used to make calculations more readable..
//	instead of just using some numbers in the calculations which
//	only make sense to the person who wrote the code in the first place
//
enum EConstants
{
	BITS_PER_BYTE	= 8,														///< Number of bits per byte
	BYTES_PER_INT	= sizeof(int),												///< Size of an int in bytes
	BITS_PER_INT	= (BYTES_PER_INT * BITS_PER_BYTE)							///< Bits per int
	
};//EConstants
   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [convertbits.h] - (3,152 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
  
/*!
	@brief		Convert a number from a specified bit storage type to another 
				specified type with given source and destination offsets
*/
#define	ConvertBits(inSrcOffset, inSrcSize, inDstOffset, inDstSize, inType)		\
(																				\
	(																			\
		/* Shift it right by the source size (division)						*/	\
		(																		\
			(																	\
				(																\
					/* Get the source bits, remove all unused bits,			*/	\
					/* and shift the bits to the start of the integer		*/	\
					((inType) >> (inSrcOffset)) & ((1 << (inSrcSize))-1)		\
				/* Shift it left by the destination size (multiplication)	*/	\
				) << (inDstSize)												\
			) >> (inSrcSize)													\
		) +																		\
		/*																	*/	\
		/* This is to give the whole calculation more precision				*/	\
		/* without this a 15 (4-bit) would become 240 (8-bit)				*/	\
		/* instead of 255 (8-bit)											*/	\
		/*																	*/	\
		(																		\
			(																	\
				(																\
					/* Get the source bits, remove all unused bits,			*/	\
					/* and shift the bits to the start of the integer		*/	\
					((inType) >> (inSrcOffset)) & ((1 << (inSrcSize))-1)		\
				/* Shift it left by the destination size (multiplication)	*/	\
				) << (inDstSize)												\
			) >> (inSrcSize + inSrcSize)										\
		) +																		\
		/*																	*/	\
		/* This is to give the whole calculation even more precision		*/	\
		/* without this a 2 (1-bit) would become 252 (8-bit)				*/	\
		/* instead of 255 (8-bit)											*/	\
		/*																	*/	\
		(																		\
			(																	\
				(																\
					/* Get the source bits, remove all unused bits,			*/	\
					/* and shift the bits to the start of the integer		*/	\
					((inType) >> (inSrcOffset)) & ((1 << (inSrcSize))-1)		\
				/* Shift it left by the destination size (multiplication)	*/	\
				) << (inDstSize)												\
			) >> (inSrcSize + inSrcSize + inSrcSize)							\
		) +																		\
		/*																	*/	\
		/* This is to give the whole calculation even more precision		*/	\
		/* without this a 1 (1-bit) would become 224 (8-bit)				*/	\
		/* instead of 255 (8-bit)											*/	\
		/*																	*/	\
		(																		\
			(																	\
				(																\
					/* Get the source bits, remove all unused bits,			*/	\
					/* and shift the bits to the start of the integer		*/	\
					((inType) >> (inSrcOffset)) & ((1 << (inSrcSize))-1)		\
				/* Shift it left by the destination size (multiplication)	*/	\
				) << (inDstSize)												\
			) >> (inSrcSize + inSrcSize + inSrcSize + inSrcSize)				\
		)																		\
	/* Cap the value to the destination bits								*/	\
	)  & ((1 << (inDstSize))-1)													\
/* Shift it left to the destination position								*/	\
) << (inDstOffset)																\
//endof	ConvertBits(inSrcOffset, inSrcSize, inDstOffset, inDstSize, inType
   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [converter.h] - (6,290 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
  
/*! 
	@brief		Main template, this creates the function to convert an array 
				containing colors of type <tSrcColor> to colors of type 
				<tDstColor> and store those in another array..
  	@warning	only use ColorDescription types with this structure!!
*/
template<typename tSrcColor, typename tDstColor>
struct ConvertColors
{
	enum EConversionConstants
	{
		//
		// The storage sizes of src & dst
		//
		SRC_STORAGE			= tSrcColor::COLOR_STORAGE_BITS,
		DST_STORAGE			= tDstColor::COLOR_STORAGE_BITS,
  
		//
		// The offset of each color component for src & dst
		//
		SRC_RED_OFFSET		= tSrcColor::RED_OFFSET		,
		SRC_GREEN_OFFSET	= tSrcColor::GREEN_OFFSET	,
		SRC_BLUE_OFFSET		= tSrcColor::BLUE_OFFSET	,
		SRC_ALPHA_OFFSET	= tSrcColor::ALPHA_OFFSET	,
		DST_RED_OFFSET		= tDstColor::RED_OFFSET		,
		DST_GREEN_OFFSET	= tDstColor::GREEN_OFFSET	,
		DST_BLUE_OFFSET		= tDstColor::BLUE_OFFSET	,
		DST_ALPHA_OFFSET	= tDstColor::ALPHA_OFFSET	,
		
  		//
		// The sizes of each color component for src & dst
		//
		SRC_RED_SIZE		= tSrcColor::RED_SIZE		,
		SRC_GREEN_SIZE		= tSrcColor::GREEN_SIZE		,
		SRC_BLUE_SIZE		= tSrcColor::BLUE_SIZE		,
		SRC_ALPHA_SIZE		= tSrcColor::ALPHA_SIZE		,
		DST_RED_SIZE		= tDstColor::RED_SIZE		,
		DST_GREEN_SIZE		= tDstColor::GREEN_SIZE		,
		DST_BLUE_SIZE		= tDstColor::BLUE_SIZE		,
		DST_ALPHA_SIZE		= tDstColor::ALPHA_SIZE		,
  
		///
		/// The largest storage of the two (src/dst)
		///
		LARGEST_STORAGE		= (SRC_STORAGE > DST_STORAGE) 
								? DST_STORAGE : SRC_STORAGE,
		
		
		///
		/// Size of the most optimal number of color components to process at 
		/// the same time. 
		/// For example, converting 1bit colors to 2bit colors would require 
		/// us to process 4 colors at the same time (4 x 2bit == 8bit == 1byte)
		/// If we didn't do this, our calculations wouldn't necesarrily end on
		/// byte-boundaries, and make the calculations *a lot* more complex
		///
		CHUNK_SIZE			= (SRC_STORAGE > DST_STORAGE)				?	
								(SRC_STORAGE < BITS_PER_BYTE)			?
									(SRC_STORAGE / DST_STORAGE) 
										* (BITS_PER_BYTE / SRC_STORAGE)	:
									(SRC_STORAGE / DST_STORAGE)			:
								(DST_STORAGE < BITS_PER_BYTE)			?
									(DST_STORAGE / SRC_STORAGE)	
										* (BITS_PER_BYTE / DST_STORAGE)	:
									(DST_STORAGE / SRC_STORAGE)			,
		/// Lets make sure we process at least one color component per chunk
		CHUNK_LOOPS			= CHUNK_SIZE ? CHUNK_SIZE : 1,
  
		/// The size of each step to take in our outer-loop, 
		/// in bytes for the source data
		SRC_STEP			= (CHUNK_LOOPS * SRC_STORAGE) / BITS_PER_BYTE,
		
		/// The size of each step to take in our outer-loop, 
		/// in bytes for the destination data
		DST_STEP			= (CHUNK_LOOPS * DST_STORAGE) / BITS_PER_BYTE,
		
		/// The largest step of the two, to determine the required iterations
		/// of the loop
		LARGEST_STEP		= SRC_STEP > DST_STEP ? SRC_STEP : DST_STEP
  
	};//enum EConversionConstants
  
protected:
	/*! 
		@brief	This template unrolls the loop used to convert a color-'chunk'
				This 'chunk' is the most optimal number of colors to process 
				at once this is necesarry to keep calculations simple.
				If you don't do this you'll have a hard time converting 4 bit 
				pixels to 2 bit pixels simply because multiple source pixels 
				will fit into one 'destination' byte
	*/
	struct Chunk
	{
		template<cUInt tLoopNum, typename _unused_dummy_ = int>
		struct Loop
		{
			/*! 
				@brief	Some constants which are required for our calculations
			*/
			enum ELoopConstants
			{
				ELEMENT			= (tLoopNum - 1),
				DST_BIT_OFFSET	= (ELEMENT * DST_STORAGE) & (BITS_PER_INT-1),
				SRC_BYTE_OFFSET	= (ELEMENT * SRC_STORAGE) /  BITS_PER_BYTE,
				SRC_BIT_OFFSET	= (ELEMENT * SRC_STORAGE) & (BITS_PER_BYTE-1),
			};//enum ELoopConstants
			INLINE static cUInt CalcElement(rcpcUChar	inType,
											rcUInt		inSrcPos)
			{
				//
				// Convert a single color from our source to our destination
				//
				return
					  ConvertBits((SRC_RED_OFFSET	+       SRC_BIT_OFFSET ),
								   SRC_RED_SIZE		,
								  (DST_RED_OFFSET	+       DST_BIT_OFFSET ),
								   DST_RED_SIZE		,
								  (rUInt)(inType[inSrcPos + SRC_BYTE_OFFSET]))
					| ConvertBits((SRC_GREEN_OFFSET	+       SRC_BIT_OFFSET ),
								   SRC_GREEN_SIZE	,
								  (DST_GREEN_OFFSET	+       DST_BIT_OFFSET ),
			 					   DST_GREEN_SIZE	,
								  (rUInt)(inType[inSrcPos + SRC_BYTE_OFFSET]))
					| ConvertBits((SRC_BLUE_OFFSET	+       SRC_BIT_OFFSET ),
								   SRC_BLUE_SIZE	,
								  (DST_BLUE_OFFSET	+       DST_BIT_OFFSET ),
								   DST_BLUE_SIZE	,
								  (rUInt)(inType[inSrcPos + SRC_BYTE_OFFSET]))
					| ConvertBits((SRC_ALPHA_OFFSET	+       SRC_BIT_OFFSET ),
								   SRC_ALPHA_SIZE	,
								  (DST_ALPHA_OFFSET	+       DST_BIT_OFFSET ),
								   DST_ALPHA_SIZE	,
								  (rUInt)(inType[inSrcPos + SRC_BYTE_OFFSET])) 
  				//
				// Add the next color to the destination...
				//
					| Loop<tLoopNum - 1,int>::CalcElement(inType, inSrcPos);
			}
		};//struct Loop
  		/*! 
			@brief	Used to stop the template loop
		*/
		template<>
		struct Loop<0, int>
		{
			INLINE static cUInt CalcElement(rcpcUChar,rcUInt) { return 0; }
		};//struct Loop
  	};//struct Chunk
  public:
	/*! 
		@brief	Do the actual color conversion of the colors
	*/
	static void Convert(rcpUChar		outType,
						rcpcUChar		inType,
						rcUInt			inByteSize)
	{
		//
		// Divide the size of the source by the size of the 
		// conversion color chunks
		// (block of colors which are converted in one go)
		//
		cUInt	loop_size		= inByteSize / LARGEST_STEP;
		for (UInt counter = 0; counter < loop_size; counter++)
		{
			//
			// Calculate the source and destination positions of the input
			// and output arrays
			//
			cUInt		src_pos		= counter * SRC_STEP;
			cUInt		dst_pos		= counter * DST_STEP;
  			//
			// Convert our chunk of colors
			//
			(rUInt)(outType[dst_pos]) = 
						Chunk::Loop<CHUNK_LOOPS>::
									CalcElement(inType, src_pos);
		}
	}
  
};//struct ConvertColors
   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [main.cpp] - (2,959 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#include "settings.h"
#include "types.h"
#include "constants.h"
#include "convertbits.h"
#include "colordescription.h"
#include "converter.h"
 
 
  //
// All color bit sizes must be byte aligned, meaning that you can either
// divide the size of the color by 8, or 8 can be divided by the 
// size of the color..
//
// In it's current form the total size of the color is limited to 32bit
//
// ----------------------------------------------------------------------
//						  color-type    R G B A  x
typedef ColorDescription< COLOR_ABGR ,  8,8,8,8, 0 	> TYPE_ABGR_32_8888;
typedef ColorDescription< COLOR_ARGB ,  8,8,8,8, 0	> TYPE_ARGB_32_8888;
typedef ColorDescription< COLOR_BGRA ,  8,8,8,8, 0	> TYPE_BGRA_32_8888;
typedef ColorDescription< COLOR_RGBA ,  8,8,8,8, 0	> TYPE_RGBA_32_8888;
typedef ColorDescription< COLOR_RGB  ,  8,8,8,0, 8	> TYPE_RGB_32_888;
typedef ColorDescription< COLOR_RGB  ,  8,8,8,0, 0	> TYPE_RGB_24_888;
typedef ColorDescription< COLOR_RGBA ,  4,4,4,4, 0	> TYPE_RGBA_16_4444;
typedef ColorDescription< COLOR_RGBA ,  5,5,5,1, 0	> TYPE_RGBA_16_5551;
typedef ColorDescription< COLOR_RGBA ,  5,5,5,0, 1	> TYPE_RGB_16_555;
typedef ColorDescription< COLOR_RGB  ,  5,6,5,0, 0	> TYPE_RGB_16_565;
typedef ColorDescription< COLOR_ALPHA,  0,0,0,8, 0	> TYPE_ALPHA_8;
typedef ColorDescription< COLOR_ALPHA,  0,0,0,4, 0	> TYPE_ALPHA_4;
typedef ColorDescription< COLOR_ALPHA,  0,0,0,2, 0	> TYPE_ALPHA_2;
typedef ColorDescription< COLOR_ALPHA,  0,0,0,1, 0	> TYPE_ALPHA_1;
 
 
  
#define src_test	TYPE_ARGB_32_8888
#define dst_test	TYPE_ALPHA_8
  
#define	BYTE_ALIGN(x) (((UInt)x + (BITS_PER_BYTE-1)) / BITS_PER_BYTE)
  
enum
{
	width		= 256,
	height		= 256,
	num_pixels	= width * height,
	src_size	= BYTE_ALIGN(num_pixels * src_test::COLOR_STORAGE_BITS),
	dst_size	= BYTE_ALIGN(num_pixels * dst_test::COLOR_STORAGE_BITS)
  };
  void main(void)
{
	UChar	input_buffer	[src_size];
	UChar	output_buffer	[dst_size];
	int		i;
  	// clear output buffer
	for (i = 0;i < dst_size;i++) output_buffer[i]	= 0;
  	int j = (src_size - (src_size%15));
	// fill input buffer with predictable junk
	for (i = 0;i < j;i+=16)
	{
		input_buffer[i +  0] = 0x01;
		input_buffer[i +  1] = 0x12;
		input_buffer[i +  2] = 0x23;
		input_buffer[i +  3] = 0x34;
		input_buffer[i +  4] = 0x45;
		input_buffer[i +  5] = 0x56;
		input_buffer[i +  6] = 0x67;
		input_buffer[i +  7] = 0x78;
		input_buffer[i +  8] = 0x89;
		input_buffer[i +  9] = 0x9A;
		input_buffer[i + 10] = 0xAB;
		input_buffer[i + 11] = 0xBC;
		input_buffer[i + 12] = 0xCD;
		input_buffer[i + 13] = 0xDE;
		input_buffer[i + 14] = 0xEF;
		input_buffer[i + 15] = 0xF0;
	}
	for (i=j;i < src_size;i++) input_buffer[i] = 0xFF;
	
	// convert the colors
	ConvertColors<src_test, dst_test>::
		Convert(output_buffer, input_buffer, src_size);
}   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [settings.h] - (1,364 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
  
//
// Some microsoft visual c++ specific compiler settings
//
#ifdef _MSC_VER
  
//
// Disable the following warnings:
//
#	pragma warning( disable : 4786 ) // 'identifier' : identifier was truncated to 'number' characters in the debug information
#	pragma warning( disable : 4284 ) // return type for 'identifier::operator ->' is not a UDT or reference to a UDT. Will produce errors if applied using infix notation
#	pragma warning( disable : 4250 ) // 'class1' : inherits 'class2::member' via dominance
#	pragma warning( disable : 4002 ) // too many actual parameters for macro 'identifier'
#	pragma warning( disable : 4311 ) // 'variable' : pointer truncation from 'type' to 'type'
  
//
// warning 4786 "disabled but still shows warning" bug in msvc6 workaround
// ..god knows why this works
//
class  msVC6_4786WorkAround { public: msVC6_4786WorkAround(){} };
static msVC6_4786WorkAround WowIWonderWhatCrapCodeMustBeInTheCompilerToMakeThisWorkaroundWork;
 
 
  //
// Set the following optimalisations on
//		
#	pragma inline_depth( 255 )
#	pragma inline_recursion( on )
#	define INLINE __forceinline
  
#else//!_MSC_VER_
  //
// Set the following optimalisations on
//
#	define	INLINE	inline
  
#endif
   |  
  
 | 
 
  
Currently browsing [pixelconverter.zip] (9,543 bytes) - [types.h] - (1,243 bytes)
 
 //
// Written by Sander van Rossen
//	You are free to use this piece of code any way you like
//
#pragma once
 
 
  
/*!
	@brief		Declare an alias named <tAliasName> for the type <tTypeName>
*/
#define DECLARE_ALIAS(tTypeName, tAliasName)					\
	typedef		  tTypeName				tAliasName;				\
//endof DECLARE_ALIAS(inType, outType)
 
 
  
/*!
	@brief		Declare the base hungarian names for <tTypeName>
*/
#define DECLARE_HUNGARIAN(tTypeName)							\
	typedef		  tTypeName	  &			r##tTypeName;			\
	typedef		  tTypeName*			p##tTypeName;			\
	typedef		  tTypeName*const		cp##tTypeName;			\
	typedef		  tTypeName*const&		rcp##tTypeName;			\
	typedef	const tTypeName				c##tTypeName;			\
	typedef	const tTypeName	  &			rc##tTypeName;			\
	typedef	const tTypeName*			pc##tTypeName;			\
	typedef	const tTypeName*const		cpc##tTypeName;			\
	typedef	const tTypeName*const&		rcpc##tTypeName;		\
//endof DECLARE_HUNGARIAN(inType)
 
 
  DECLARE_ALIAS(unsigned char, UChar);	// Create UChar alias for unsigned chars
DECLARE_ALIAS(unsigned int,  UInt);		// Create UInt alias for unsigned ints
DECLARE_HUNGARIAN(UChar);				// Declare all hungarian names for UChar
DECLARE_HUNGARIAN(UInt);				// Declare all hungarian names for UInt   |  
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |