// /** 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); } }