Axiom.Media.Bitwise.FixedToFloat C# (CSharp) Method

FixedToFloat() public static method

Fixed point to float
public static FixedToFloat ( uint value, int bits ) : float
value uint
bits int
return float
		public static float FixedToFloat( uint value, int bits )
		{
			return (float)value / (float)( ( 1u << bits ) - 1 );
		}

Usage Example

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