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

FixedToFixed() public static method

Convert N bit colour channel value to P bits. It fills P bits with the bit pattern repeated. (this is /((1<<n)-1) in fixed point)
public static FixedToFixed ( uint value, int n, int p ) : uint
value uint
n int
p int
return uint
		public static uint FixedToFixed( uint value, int n, int p )
		{
			if ( n > p )
				// Less bits required than available; this is easy
				value >>= n - p;
			else if ( n < p )
			{
				// More bits required than are there, do the fill
				// Use old fashioned division, probably better than a loop
				if ( value == 0 )
					value = 0;
				else if ( value == ( (uint)( 1 ) << n ) - 1 )
					value = ( 1u << p ) - 1;
				else
					value = value * ( 1u << p ) / ( ( 1u << n ) - 1u );
			}
			return value;
		}

Usage Example

        ///*************************************************************************
        ///   Pixel packing/unpacking utilities
        ///*************************************************************************


        //           ///<summary>
        //           ///    Pack a color value to memory
        //           ///</summary>
        //           ///<param name="color">The color</param>
        //           ///<param name="format">Pixel format in which to write the color</param>
        //           ///<param name="dest">Destination memory location</param>
        //          public static void PackColor(System.Drawing.Color color, PixelFormat format,  IntPtr dest) {
        //              PackColor(color.r, color.g, color.b, color.a, format, dest);
        //          }

        ///<summary>
        ///    Pack a color value to memory
        ///</summary>
        ///<param name="r,g,b,a">The four color components, range 0x00 to 0xFF</param>
        ///<param name="format">Pixelformat in which to write the color</param>
        ///<param name="dest">Destination memory location</param>
        unsafe public void PackColor(uint r, uint g, uint b, uint a, PixelFormat format, byte *dest)
        {
            PixelFormatDescription des = PixelConverter.GetDescriptionFor(format);

            if ((des.flags & PixelFormatFlags.NativeEndian) != 0)
            {
                // Shortcut for integer formats packing
                uint value = (((Bitwise.FixedToFixed(r, 8, des.rbits) << des.rshift) & des.rmask) |
                              ((Bitwise.FixedToFixed(g, 8, des.gbits) << des.gshift) & des.gmask) |
                              ((Bitwise.FixedToFixed(b, 8, des.bbits) << des.bshift) & des.bmask) |
                              ((Bitwise.FixedToFixed(a, 8, des.abits) << des.ashift) & des.amask));
                // And write to memory
                Bitwise.IntWrite(dest, des.elemBytes, value);
            }
            else
            {
                // Convert to float
                PackColor((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f, (float)a / 255.0f, format, dest);
            }
        }
All Usage Examples Of Axiom.Media.Bitwise::FixedToFixed