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"); } } }