public static void UnpackColor( ref byte r, ref byte g, ref byte b, ref byte a, PixelFormat pf, IntPtr src )
{
PixelFormatDescription des = GetDescriptionFor( pf );
if ( ( des.flags & PixelFormatFlags.NativeEndian ) != 0 )
{
// Shortcut for integer formats unpacking
uint value = Bitwise.IntRead( src, des.elemBytes );
if ( ( des.flags & PixelFormatFlags.Luminance ) != 0 )
// Luminance format -- only rbits used
r = g = b = (byte)Bitwise.FixedToFixed( ( value & des.rmask ) >> des.rshift, des.rbits, 8 );
else
{
r = (byte)Bitwise.FixedToFixed( ( value & des.rmask ) >> des.rshift, des.rbits, 8 );
g = (byte)Bitwise.FixedToFixed( ( value & des.gmask ) >> des.gshift, des.gbits, 8 );
b = (byte)Bitwise.FixedToFixed( ( value & des.bmask ) >> des.bshift, des.bbits, 8 );
}
if ( ( des.flags & PixelFormatFlags.HasAlpha ) != 0 )
{
a = (byte)Bitwise.FixedToFixed( ( value & des.amask ) >> des.ashift, des.abits, 8 );
}
else
a = 255; // No alpha, default a component to full
}
else
{
// Do the operation with the more generic floating point
float rr, gg, bb, aa;
UnpackColor( out rr, out gg, out bb, out aa, pf, src );
r = Bitwise.FloatToByteFixed( rr );
g = Bitwise.FloatToByteFixed( gg );
b = Bitwise.FloatToByteFixed( bb );
a = Bitwise.FloatToByteFixed( aa );
}
}
/// <summary>