unsafe public static void UnpackColor(out float r, out float g, out float b, out float 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 = Bitwise.FixedToFloat(
(value & des.rmask) >> des.rshift, des.rbits);
}
else
{
r = Bitwise.FixedToFloat((value & des.rmask) >> des.rshift, des.rbits);
g = Bitwise.FixedToFloat((value & des.gmask) >> des.gshift, des.gbits);
b = Bitwise.FixedToFloat((value & des.bmask) >> des.bshift, des.bbits);
}
if ((des.flags & PixelFormatFlags.HasAlpha) != 0)
{
a = Bitwise.FixedToFloat((value & des.amask) >> des.ashift, des.abits);
}
else
{
a = 1.0f; // No alpha, default a component to full
}
}
else
{
switch (pf)
{
case PixelFormat.FLOAT32_R:
r = g = b = ((float *)src)[0];
a = 1.0f;
break;
case PixelFormat.FLOAT32_RGB:
r = ((float *)src)[0];
g = ((float *)src)[1];
b = ((float *)src)[2];
a = 1.0f;
break;
case PixelFormat.FLOAT32_RGBA:
r = ((float *)src)[0];
g = ((float *)src)[1];
b = ((float *)src)[2];
a = ((float *)src)[3];
break;
case PixelFormat.FLOAT16_R:
r = g = b = Bitwise.HalfToFloat(((ushort *)src)[0]);
a = 1.0f;
break;
case PixelFormat.FLOAT16_RGB:
r = Bitwise.HalfToFloat(((ushort *)src)[0]);
g = Bitwise.HalfToFloat(((ushort *)src)[1]);
b = Bitwise.HalfToFloat(((ushort *)src)[2]);
a = 1.0f;
break;
case PixelFormat.FLOAT16_RGBA:
r = Bitwise.HalfToFloat(((ushort *)src)[0]);
g = Bitwise.HalfToFloat(((ushort *)src)[1]);
b = Bitwise.HalfToFloat(((ushort *)src)[2]);
a = Bitwise.HalfToFloat(((ushort *)src)[3]);
break;
// case PixelFormat.SHORT_RGBA:
// r = Bitwise.FixedToFloat(((ushort*)src)[0], 16);
// g = Bitwise.FixedToFloat(((ushort*)src)[1], 16);
// b = Bitwise.FixedToFloat(((ushort*)src)[2], 16);
// a = Bitwise.FixedToFloat(((ushort*)src)[3], 16);
// break;
// case PixelFormat.BYTE_LA:
// r = g = b = Bitwise.FixedToFloat(((byte*)src)[0], 8);
// a = Bitwise.FixedToFloat(((byte*)src)[1], 8);
// break;
default:
// Not yet supported
throw new Exception("Unpack from " + pf + " not implemented, in PixelUtil.UnpackColor");
}
}
}