// /** Unpack a color value from memory
// @param color The color is returned here
// @param pf Pixelformat in which to read the color
// @param src Source memory location
// */
// protected static void UnpackColor(ref System.Drawing.Color color, PixelFormat pf, IntPtr src) {
// UnpackColor(color.r, color.g, color.b, color.a, pf, src);
// }
/** Unpack a color value from memory
* @param r,g,b,a The color is returned here (as byte)
* @param pf Pixelformat in which to read the color
* @param src Source memory location
* @remarks This function returns the color components in 8 bit precision,
* this will lose precision when coming from A2R10G10B10 or floating
* point formats.
*/
unsafe public static void UnpackColor(ref byte r, ref byte g, ref byte b, ref byte a,
PixelFormat pf, byte *src)
{
PixelFormatDescription des = PixelConverter.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);
}
}