PixelFormat.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media / PixelFormat.cs / 1305600 / PixelFormat.cs

                            //------------------------------------------------------------------------------ 
//  Microsoft Avalon
//  Copyright (c) Microsoft Corporation, 2003
//
//  File: PixelFormat.cs 
//
//----------------------------------------------------------------------------- 
#pragma warning disable 1634, 1691 // Allow suppression of certain presharp messages 

using System; 
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Collections.Generic; 
using System.ComponentModel;
using System.ComponentModel.Design.Serialization; 
using System.Reflection; 
using MS.Internal;
using MS.Win32; 
using System.Diagnostics;
using System.Windows.Media;
using System.Globalization;
using System.Runtime.InteropServices; 

using SR=MS.Internal.PresentationCore.SR; 
using SRID=MS.Internal.PresentationCore.SRID; 
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
 
namespace System.Windows.Media
{
    [System.Flags]
    internal enum PixelFormatFlags 
    {
        BitsPerPixelMask        = 0x00FF, 
        BitsPerPixelUndefined   = 0, 
        BitsPerPixel1           = 1,
        BitsPerPixel2           = 2, 
        BitsPerPixel4           = 4,
        BitsPerPixel8           = 8,
        BitsPerPixel16          = 16,
        BitsPerPixel24          = 24, 
        BitsPerPixel32          = 32,
        BitsPerPixel48          = 48, 
        BitsPerPixel64          = 64, 
        BitsPerPixel96          = 96,
        BitsPerPixel128         = 128, 
        IsGray                  = 0x00000100,   // Grayscale only
        IsCMYK                  = 0x00000200,   // CMYK, not ARGB
        IsSRGB                  = 0x00000400,   // Gamma is approximately 2.2
        IsScRGB                 = 0x00000800,   // Gamma is 1.0 
        Premultiplied           = 0x00001000,   // Premultiplied Alpha
        ChannelOrderMask        = 0x0001E000, 
        ChannelOrderRGB         = 0x00002000, 
        ChannelOrderBGR         = 0x00004000,
        ChannelOrderARGB        = 0x00008000, 
        ChannelOrderABGR        = 0x00010000,
        Palettized              = 0x00020000,   // Pixels are indexes into a palette
        NChannelAlpha           = 0x00040000,   // N-Channel format with alpha
        IsNChannel              = 0x00080000,   // N-Channel format 
    }
 
    #region PixelFormat 

    ///  
    /// Describes the bit mask and shift for a specific pixelformat
    /// 
    public struct PixelFormatChannelMask
    { 
        internal PixelFormatChannelMask(byte[] mask)
        { 
            Debug.Assert(mask != null); 
            _mask = mask;
        } 

        /// 
        /// The bitmask for a color channel
        /// It will never be greater then 0xffffffff 
        /// 
        public IList Mask 
        { 
            get
            { 
                return _mask != null ? new PartialList((byte[])_mask.Clone()) : null;
            }
        }
 
        /// 
        /// op_equality - returns whether or not the two pixel format channel masks are equal 
        ///  
        public static bool operator == (PixelFormatChannelMask left, PixelFormatChannelMask right)
        { 
            return Equals(left, right);
        }

        ///  
        /// Equals - Returns whether or not the two pixel format channel masks are equal
        ///  
        public static bool Equals(PixelFormatChannelMask left, PixelFormatChannelMask right) 
        {
            int leftNumChannels  =  left._mask != null ?  left._mask.Length : 0; 
            int rightNumChannels = right._mask != null ? right._mask.Length : 0;

            if (leftNumChannels != rightNumChannels)
            { 
                return false;
            } 
 
            for (int i = 0; i < leftNumChannels; ++i)
            { 
                if (left._mask[i] != right._mask[i])
                {
                    return false;
                } 
            }
 
            return true; 
        }
 
        /// 
        /// op_inequality - returns whether or not the two pixel format channel masks are not equal
        /// 
        public static bool operator != (PixelFormatChannelMask left, PixelFormatChannelMask right) 
        {
            return !(left == right); 
        } 

        ///  
        /// Equals - Returns whether or not this is equal to the Object
        /// 
        public override bool Equals(Object obj)
        { 
            // Can't use "as" since we're looking for a value type
            return obj is PixelFormatChannelMask ? this == (PixelFormatChannelMask)obj : false; 
        } 

        ///  
        /// GetHashCode - Returns a hash code
        /// 
        public override int GetHashCode()
        { 
            int hash = 0;
 
            if (_mask != null) 
            {
                for (int i = 0, count = _mask.Length; i < count; ++i) 
                {
                    hash += _mask[i] * 256 * i;
                }
            } 

            return hash; 
        } 

        private byte[] _mask; 
    }

    /// 
    /// Pixel Format Definition for images and pixel-based surfaces 
    /// 
    [TypeConverter (typeof(PixelFormatConverter))] 
    [Serializable] 
    public struct PixelFormat : IEquatable
    { 
        /// 
        /// Critical - Accesses closely controlled format guid
        /// 
        [SecurityCritical] 
        internal PixelFormat(Guid guidPixelFormat)
        { 
            bool fBuiltIn = true; 

            byte[] guidBytes = guidPixelFormat.ToByteArray(); 
            byte[] guidBuiltIn = WICPixelFormatGUIDs.WICPixelFormatDontCare.ToByteArray();

            // If it's a built-in format, identify the pixel format enum.
            for (int i = 0, count = guidBytes.Length - 1; i < count; ++i) 
            {
                if (guidBytes[i] != guidBuiltIn[i]) 
                { 
                    fBuiltIn = false;
                    break; 
                }
            }

            if (guidBytes[guidBytes.Length - 1] > (byte)PixelFormatEnum.Cmyk32) 
            {
                fBuiltIn = false; 
            } 

            if (fBuiltIn) 
            {
                _format = (PixelFormatEnum) guidBytes[guidBytes.Length - 1];
            }
            else 
            {
                _format = PixelFormatEnum.Extended; 
            } 

            _flags = GetPixelFormatFlagsFromEnum(_format) | GetPixelFormatFlagsFromGuid(guidPixelFormat); 
            _bitsPerPixel = GetBitsPerPixelFromEnum(_format);
            _guidFormat = new SecurityCriticalDataForSet (guidPixelFormat);
        }
 
        /// 
        /// Critical - Accesses closely controlled format guid 
        /// TreatAsSafe - The input (enum) is validated in setting the format guid 
        /// 
        [SecurityCritical, SecurityTreatAsSafe] 
        internal PixelFormat(PixelFormatEnum format)
        {
            _format = format;
 
            _flags = GetPixelFormatFlagsFromEnum(format);
            _bitsPerPixel = GetBitsPerPixelFromEnum(format); 
            _guidFormat = new SecurityCriticalDataForSet (PixelFormat.GetGuidFromFormat(format)); 
        }
 
        /// 
        /// Construct a pixel format from a string that represents the format.
        /// The purpose of this method is only for deserialization of PixelFormat.
        /// The preferred way to construct a PixelFormat is with the PixelFormats class. 
        /// 
        ///  
        ///  
        /// Critical - Accesses closely controlled format guid
        /// TreatAsSafe - The input (string) is validated in setting the format guid 
        /// 
        [SecurityCritical, SecurityTreatAsSafe]
        internal PixelFormat(string pixelFormatString)
        { 
            PixelFormatEnum format = PixelFormatEnum.Default;
 
            if (pixelFormatString == null) 
            {
                throw new System.ArgumentNullException("pixelFormatString"); 
            }

            string upperPixelFormatString = pixelFormatString.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
 
            switch (upperPixelFormatString)
            { 
                case "DEFAULT": 
                    format = PixelFormatEnum.Default;
                    break; 

                case "EXTENDED":
                    format = PixelFormatEnum.Extended;
                    break; 

                case "INDEXED1": 
                    format = PixelFormatEnum.Indexed1; 
                    break;
 
                case "INDEXED2":
                    format = PixelFormatEnum.Indexed2;
                    break;
 
                case "INDEXED4":
                    format = PixelFormatEnum.Indexed4; 
                    break; 

                case "INDEXED8": 
                    format = PixelFormatEnum.Indexed8;
                    break;

                case "BLACKWHITE": 
                    format = PixelFormatEnum.BlackWhite;
                    break; 
 
                case "GRAY2":
                    format = PixelFormatEnum.Gray2; 
                    break;

                case "GRAY4":
                    format = PixelFormatEnum.Gray4; 
                    break;
 
                case "GRAY8": 
                    format = PixelFormatEnum.Gray8;
                    break; 

                case "BGR555":
                    format = PixelFormatEnum.Bgr555;
                    break; 

                case "BGR565": 
                    format = PixelFormatEnum.Bgr565; 
                    break;
 
                case "BGR24":
                    format = PixelFormatEnum.Bgr24;
                    break;
 
                case "RGB24":
                    format = PixelFormatEnum.Rgb24; 
                    break; 

                case "BGR101010": 
                    format = PixelFormatEnum.Bgr101010;
                    break;

                case "BGR32": 
                    format = PixelFormatEnum.Bgr32;
                    break; 
 
                case "BGRA32":
                    format = PixelFormatEnum.Bgra32; 
                    break;

                case "PBGRA32":
                    format = PixelFormatEnum.Pbgra32; 
                    break;
 
                case "RGB48": 
                    format = PixelFormatEnum.Rgb48;
                    break; 

                case "RGBA64":
                    format = PixelFormatEnum.Rgba64;
                    break; 

                case "PRGBA64": 
                    format = PixelFormatEnum.Prgba64; 
                    break;
 
                case "GRAY16":
                    format = PixelFormatEnum.Gray16;
                    break;
 
                case "GRAY32FLOAT":
                    format = PixelFormatEnum.Gray32Float; 
                    break; 

                case "RGB128FLOAT": 
                    format = PixelFormatEnum.Rgb128Float;
                    break;

                case "RGBA128FLOAT": 
                    format = PixelFormatEnum.Rgba128Float;
                    break; 
 
                case "PRGBA128FLOAT":
                    format = PixelFormatEnum.Prgba128Float; 
                    break;

                case "CMYK32":
                    format = PixelFormatEnum.Cmyk32; 
                    break;
 
                default: 
                    throw new System.ArgumentException (SR.Get(SRID.Image_BadPixelFormat, pixelFormatString),
                            "pixelFormatString"); 
            }

            _format = format;
 
            _flags = GetPixelFormatFlagsFromEnum(format);
            _bitsPerPixel = GetBitsPerPixelFromEnum(format); 
            _guidFormat = new SecurityCriticalDataForSet (PixelFormat.GetGuidFromFormat(format)); 
        }
 
        static private Guid GetGuidFromFormat(PixelFormatEnum format)
        {
            switch (format)
            { 
                case PixelFormatEnum.Default:
                    return WICPixelFormatGUIDs.WICPixelFormatDontCare; 
 
                case PixelFormatEnum.Indexed1:
                    return WICPixelFormatGUIDs.WICPixelFormat1bppIndexed; 

                case PixelFormatEnum.Indexed2:
                    return WICPixelFormatGUIDs.WICPixelFormat2bppIndexed;
 
                case PixelFormatEnum.Indexed4:
                    return WICPixelFormatGUIDs.WICPixelFormat4bppIndexed; 
 
                case PixelFormatEnum.Indexed8:
                    return WICPixelFormatGUIDs.WICPixelFormat8bppIndexed; 

                case PixelFormatEnum.BlackWhite:
                    return WICPixelFormatGUIDs.WICPixelFormatBlackWhite;
 
                case PixelFormatEnum.Gray2:
                    return WICPixelFormatGUIDs.WICPixelFormat2bppGray; 
 
                case PixelFormatEnum.Gray4:
                    return WICPixelFormatGUIDs.WICPixelFormat4bppGray; 

                case PixelFormatEnum.Gray8:
                    return WICPixelFormatGUIDs.WICPixelFormat8bppGray;
 
                case PixelFormatEnum.Bgr555:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppBGR555; 
 
                case PixelFormatEnum.Bgr565:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppBGR565; 

                case PixelFormatEnum.Bgr24:
                    return WICPixelFormatGUIDs.WICPixelFormat24bppBGR;
 
                case PixelFormatEnum.Rgb24:
                    return WICPixelFormatGUIDs.WICPixelFormat24bppRGB; 
 
                case PixelFormatEnum.Bgr101010:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGR101010; 

                case PixelFormatEnum.Bgr32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGR;
 
                case PixelFormatEnum.Bgra32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGRA; 
 
                case PixelFormatEnum.Pbgra32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppPBGRA; 

                case PixelFormatEnum.Rgb48:
                    return WICPixelFormatGUIDs.WICPixelFormat48bppRGB;
 
                case PixelFormatEnum.Rgba64:
                    return WICPixelFormatGUIDs.WICPixelFormat64bppRGBA; 
 
                case PixelFormatEnum.Prgba64:
                    return WICPixelFormatGUIDs.WICPixelFormat64bppPRGBA; 

                case PixelFormatEnum.Gray16:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppGray;
 
                case PixelFormatEnum.Gray32Float:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppGrayFloat; 
 
                case PixelFormatEnum.Rgb128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppRGBFloat; 

                case PixelFormatEnum.Rgba128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppRGBAFloat;
 
                case PixelFormatEnum.Prgba128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppPRGBAFloat; 
 
                case PixelFormatEnum.Cmyk32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppCMYK; 
            }

            throw new System.ArgumentException (SR.Get(SRID.Image_BadPixelFormat, format), "format");
        } 

        private PixelFormatFlags FormatFlags 
        { 
            get
            { 
                return _flags;
            }
        }
 
        /// 
        /// op_equality - returns whether or not the two pixel formats are equal 
        ///  
        public static bool operator == (PixelFormat left, PixelFormat right)
        { 
            return (left.Guid == right.Guid);
        }

        ///  
        /// op_inequality - returns whether or not the two pixel formats are not equal
        ///  
        public static bool operator != (PixelFormat left, PixelFormat right) 
        {
            return (left.Guid != right.Guid); 
        }

        /// 
        /// Equals - Returns whether or not the two pixel formats are equal 
        /// 
        public static bool Equals(PixelFormat left, PixelFormat right) 
        { 
            return (left.Guid == right.Guid);
        } 

        /// 
        /// Equals - Returns whether or not this is equal to the PixelFormat
        ///  
        public bool Equals(PixelFormat pixelFormat)
        { 
            return this == pixelFormat; 
        }
 
        /// 
        /// Equals - Returns whether or not this is equal to the Object
        /// 
        public override bool Equals(Object obj) 
        {
            if ((null == obj) || 
                !(obj is PixelFormat)) 
            {
                return false; 
            }

            return this == (PixelFormat)obj;
        } 

        ///  
        /// GetHashCode - Returns a hash code 
        /// 
        public override int GetHashCode() 
        {
            return Guid.GetHashCode();
        }
 
        /// 
        /// The number of bits per pixel for this format. 
        ///  
        public int BitsPerPixel
        { 
            get
            {
                return InternalBitsPerPixel;
            } 
        }
 
        ///  
        /// The pixel format mask information for each channel.
        ///  
        /// 
        /// Critical - Access unmanaged code
        /// PublicOK - the pixel format info (an exsternal input) comes from a critical function which creates it based on the pixel format GUID
        ///   and has a TAS boundary tracking all setting of it. 
        /// LinkDemand - blocks information disclosure in partial trust scenario
        ///  
        public IList Masks 
        {
            [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] 
            [SecurityCritical]
            get
            {
                IntPtr pixelFormatInfo = CreatePixelFormatInfo(); 
                Debug.Assert(pixelFormatInfo != IntPtr.Zero);
 
                UInt32 channelCount = 0; 
                PixelFormatChannelMask[] masks = null;
                UInt32 cbBytes = 0; 

                try
                {
                    HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelCount( 
                        pixelFormatInfo,
                        out channelCount 
                        )); 

                    Debug.Assert(channelCount >= 1); 

                    masks = new PixelFormatChannelMask[channelCount];

                    unsafe 
                    {
                        for (uint i = 0; i < channelCount; i++) 
                        { 
                            HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelMask(
                                pixelFormatInfo, i, 0, null, out cbBytes)); 

                            Debug.Assert(cbBytes > 0);

                            byte[] channelMask = new byte[cbBytes]; 

                            fixed (byte *pbChannelMask = channelMask) 
                            { 
                                HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelMask(
                                    pixelFormatInfo, i, cbBytes, pbChannelMask, out cbBytes)); 

                                Debug.Assert(cbBytes == channelMask.Length);
                            }
 
                            masks[i] = new PixelFormatChannelMask(channelMask);
                        } 
                    } 
                }
                finally 
                {
                    if (pixelFormatInfo != IntPtr.Zero)
                    {
                        UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref pixelFormatInfo); 
                    }
                } 
 
                return new PartialList(masks);
            } 
        }

        /// 
        /// Critical - Access unmanaged code 
        /// 
        [SecurityCritical] 
        internal IntPtr CreatePixelFormatInfo() 
        {
            IntPtr componentInfo = IntPtr.Zero; 
            IntPtr pixelFormatInfo = IntPtr.Zero;

            using (FactoryMaker myFactory = new FactoryMaker())
            { 
                try
                { 
                    Guid guidPixelFormat = this.Guid; 

                    int hr = UnsafeNativeMethods.WICImagingFactory.CreateComponentInfo( 
                        myFactory.ImagingFactoryPtr,
                        ref guidPixelFormat,
                        out componentInfo);
                    if (hr == (int)WinCodecErrors.WINCODEC_ERR_COMPONENTINITIALIZEFAILURE || 
                        hr == (int)WinCodecErrors.WINCODEC_ERR_COMPONENTNOTFOUND)
                    { 
                        throw new System.NotSupportedException(SR.Get(SRID.Image_NoPixelFormatFound)); 
                    }
                    HRESULT.Check(hr); 

                    Guid guidPixelFormatInfo = MILGuidData.IID_IWICPixelFormatInfo;
                    HRESULT.Check(UnsafeNativeMethods.MILUnknown.QueryInterface(
                        componentInfo, 
                        ref guidPixelFormatInfo,
                        out pixelFormatInfo)); 
                } 
                finally
                { 
                    if (componentInfo != IntPtr.Zero)
                    {
                        UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref componentInfo);
                    } 
                }
            } 
 
            return pixelFormatInfo;
        } 

        /// 
        /// Critical - Access unmanaged code
        /// TreatAsSafe - BitsPerPixel information is safe to share 
        /// 
        internal int InternalBitsPerPixel 
        { 
 			[SecurityCritical, SecurityTreatAsSafe]
            get 
            {
                if (_bitsPerPixel == 0)
                {
                    UInt32 bpp = 0; 

                    IntPtr pixelFormatInfo = CreatePixelFormatInfo(); 
                    Debug.Assert(pixelFormatInfo != IntPtr.Zero); 

                    try 
                    {
                        HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetBitsPerPixel(
                            pixelFormatInfo,
                            out bpp 
                            ));
                    } 
                    finally 
                    {
                        if (pixelFormatInfo != IntPtr.Zero) 
                        {
                            UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref pixelFormatInfo);
                        }
                    } 

                    _bitsPerPixel = bpp; 
                } 

                return (int) _bitsPerPixel; 
            }
        }

        internal bool HasAlpha 
        {
            get 
            { 
                return ((FormatFlags & PixelFormatFlags.ChannelOrderABGR) != 0 ||
                            (FormatFlags & PixelFormatFlags.ChannelOrderARGB) != 0 || 
                            (FormatFlags & PixelFormatFlags.NChannelAlpha) != 0);
            }
        }
 
        internal bool Palettized
        { 
            get 
            {
                return ((FormatFlags & PixelFormatFlags.Palettized) != 0); 
            }
        }

        internal PixelFormatEnum Format 
        {
            get 
            { 
                return _format;
            } 
        }

        internal Guid Guid
        { 
            get
            { 
                return _guidFormat.Value; 
            }
        } 

        /// 
        /// Convert a PixelFormat to a string that represents it.
        ///  
        /// 
        public override string ToString () 
        { 
            return _format.ToString();
        } 

        /// 
        /// Critical - calls unmanaged code, accepts unmanaged handles as arguments
        ///  
        [SecurityCritical]
        internal static PixelFormat GetPixelFormat ( 
            SafeMILHandle /* IWICBitmapSource */ bitmapSource 
            )
        { 
            Guid guidPixelFormat = WICPixelFormatGUIDs.WICPixelFormatDontCare;

            HRESULT.Check(UnsafeNativeMethods.WICBitmapSource.GetPixelFormat(bitmapSource, out guidPixelFormat));
 
            return new PixelFormat(guidPixelFormat);
        } 
 
        /// 
        /// Convert from the internal guid to the actual PixelFormat value. 
        /// 
        /// 
        /// 
        internal static PixelFormat GetPixelFormat(Guid pixelFormatGuid) 
        {
            byte[] guidBytes = pixelFormatGuid.ToByteArray(); 
            return GetPixelFormat( (PixelFormatEnum)guidBytes[guidBytes.Length-1] ); 
        }
 
        /// 
        /// Convert from the internal enum to the actual PixelFormat value.
        /// 
        ///  
        /// 
        internal static PixelFormat GetPixelFormat(PixelFormatEnum pixelFormatEnum) 
        { 
            switch (pixelFormatEnum)
            { 
                case PixelFormatEnum.Indexed1:
                    return PixelFormats.Indexed1;

                case PixelFormatEnum.Indexed2: 
                    return PixelFormats.Indexed2;
 
                case PixelFormatEnum.Indexed4: 
                    return PixelFormats.Indexed4;
 
                case PixelFormatEnum.Indexed8:
                    return PixelFormats.Indexed8;

                case PixelFormatEnum.BlackWhite: 
                    return PixelFormats.BlackWhite;
 
                case PixelFormatEnum.Gray2: 
                    return PixelFormats.Gray2;
 
                case PixelFormatEnum.Gray4:
                    return PixelFormats.Gray4;

                case PixelFormatEnum.Gray8: 
                    return PixelFormats.Gray8;
 
                case PixelFormatEnum.Bgr555: 
                    return PixelFormats.Bgr555;
 
                case PixelFormatEnum.Bgr565:
                    return PixelFormats.Bgr565;

                case PixelFormatEnum.Bgr101010: 
                    return PixelFormats.Bgr101010;
 
                case PixelFormatEnum.Bgr24: 
                    return PixelFormats.Bgr24;
 
                case PixelFormatEnum.Rgb24:
                    return PixelFormats.Rgb24;

                case PixelFormatEnum.Bgr32: 
                    return PixelFormats.Bgr32;
 
                case PixelFormatEnum.Bgra32: 
                    return PixelFormats.Bgra32;
 
                case PixelFormatEnum.Pbgra32:
                    return PixelFormats.Pbgra32;

                case PixelFormatEnum.Rgb48: 
                    return PixelFormats.Rgb48;
 
                case PixelFormatEnum.Rgba64: 
                    return PixelFormats.Rgba64;
 
                case PixelFormatEnum.Prgba64:
                    return PixelFormats.Prgba64;

                case PixelFormatEnum.Gray16: 
                    return PixelFormats.Gray16;
 
                case PixelFormatEnum.Gray32Float: 
                    return PixelFormats.Gray32Float;
 
                case PixelFormatEnum.Rgb128Float:
                    return PixelFormats.Rgb128Float;

                case PixelFormatEnum.Rgba128Float: 
                    return PixelFormats.Rgba128Float;
 
                case PixelFormatEnum.Prgba128Float: 
                    return PixelFormats.Prgba128Float;
 
                case PixelFormatEnum.Cmyk32:
                    return PixelFormats.Cmyk32;
            }
 
            return PixelFormats.Default;
        } 
 
        static private PixelFormatFlags GetPixelFormatFlagsFromGuid(Guid pixelFormatGuid)
        { 
            PixelFormatFlags result = PixelFormatFlags.BitsPerPixelUndefined;

            if (pixelFormatGuid.CompareTo(WICPixelFormatPhotonFirst) >= 0 &&
                            pixelFormatGuid.CompareTo(WICPixelFormatPhotonLast) <= 0) 
            {
                byte[] b = pixelFormatGuid.ToByteArray(); 
 
                switch (b[15])
                { 
                    case 0x1D:  // GUID_WICPixelFormat64bppRGBAFixedPoint
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x1E:  // GUID_WICPixelFormat128bppRGBAFixedPoint 
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x1F:  // GUID_WICPixelFormat64bppCMYK 
                        result = PixelFormatFlags.IsCMYK;
                        break; 
                    case 0x20:  // GUID_WICPixelFormat24bpp3Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x21:  // GUID_WICPixelFormat32bpp4Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x22:  // GUID_WICPixelFormat40bpp5Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x23:  // GUID_WICPixelFormat48bpp6Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x24:  // GUID_WICPixelFormat56bpp7Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x25:  // GUID_WICPixelFormat64bpp8Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x26:  // GUID_WICPixelFormat48bpp3Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x27:  // GUID_WICPixelFormat64bpp4Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x28:  // GUID_WICPixelFormat80bpp5Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x29:  // GUID_WICPixelFormat96bpp6Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x2A:  // GUID_WICPixelFormat112bpp7Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x2B:  // GUID_WICPixelFormat128bpp8Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x2C:  // GUID_WICPixelFormat40bppCMYKAlpha
                        result = PixelFormatFlags.IsCMYK | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x2D:  // GUID_WICPixelFormat80bppCMYKAlpha 
                        result = PixelFormatFlags.IsCMYK | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x2E:  // GUID_WICPixelFormat32bpp3ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x2F:  // GUID_WICPixelFormat40bpp4ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x30:  // GUID_WICPixelFormat48bpp5ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x31:  // GUID_WICPixelFormat56bpp6ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x32:  // GUID_WICPixelFormat64bpp7ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x33:  // GUID_WICPixelFormat72bpp8ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x34:  // GUID_WICPixelFormat64bpp3ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x35:  // GUID_WICPixelFormat80bpp4ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x36:  // GUID_WICPixelFormat96bpp5ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x37:  // GUID_WICPixelFormat112bpp6ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x38:  // GUID_WICPixelFormat128bpp7ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x39:  // GUID_WICPixelFormat144bpp8ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x3A:  // GUID_WICPixelFormat64bppRGBAHalf 
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3B:  // GUID_WICPixelFormat48bppRGBHalf
                        result = PixelFormatFlags.ChannelOrderRGB | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x3D:  // GUID_WICPixelFormat32bppRGBE 
                        result = PixelFormatFlags.ChannelOrderRGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3E:  // GUID_WICPixelFormat16bppGrayHalf 
                        result = PixelFormatFlags.IsGray | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3F:  // GUID_WICPixelFormat32bppGrayFixedPoint
                        result = PixelFormatFlags.IsGray | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x40:  // GUID_WICPixelFormat64bppRGBFixedPoint 
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break; 
                    case 0x41:  // GUID_WICPixelFormat128bppRGBFixedPoint 
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break; 
                    case 0x42:  // GUID_WICPixelFormat64bppRGBHalf
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break;
                } 
            }
 
            return result; 
        }
 
        static private PixelFormatFlags GetPixelFormatFlagsFromEnum(PixelFormatEnum pixelFormatEnum)
        {
            switch (pixelFormatEnum)
            { 
                case PixelFormatEnum.Default:
                    return PixelFormatFlags.BitsPerPixelUndefined; 
 
                case PixelFormatEnum.Indexed1:
                    return PixelFormatFlags.BitsPerPixel1 | PixelFormatFlags.Palettized; 

                case PixelFormatEnum.Indexed2:
                    return PixelFormatFlags.BitsPerPixel2 | PixelFormatFlags.Palettized;
 
                case PixelFormatEnum.Indexed4:
                    return PixelFormatFlags.BitsPerPixel4 | PixelFormatFlags.Palettized; 
 
                case PixelFormatEnum.Indexed8:
                    return PixelFormatFlags.BitsPerPixel8 | PixelFormatFlags.Palettized; 

                case PixelFormatEnum.BlackWhite:
                    return PixelFormatFlags.BitsPerPixel1 | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Gray2:
                    return PixelFormatFlags.BitsPerPixel2 | PixelFormatFlags.IsGray; 
 
                case PixelFormatEnum.Gray4:
                    return PixelFormatFlags.BitsPerPixel4 | PixelFormatFlags.IsGray; 

                case PixelFormatEnum.Gray8:
                    return PixelFormatFlags.BitsPerPixel8 | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Bgr555:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 
 
                case PixelFormatEnum.Bgr565:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 

                case PixelFormatEnum.Bgr101010:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR;
 
                case PixelFormatEnum.Bgr24:
                    return PixelFormatFlags.BitsPerPixel24 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 
 
                case PixelFormatEnum.Rgb24:
                    return PixelFormatFlags.BitsPerPixel24 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderRGB; 

                case PixelFormatEnum.Bgr32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR;
 
                case PixelFormatEnum.Bgra32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderABGR; 
 
                case PixelFormatEnum.Pbgra32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderABGR; 

                case PixelFormatEnum.Rgb48:
                    return PixelFormatFlags.BitsPerPixel48 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderRGB;
 
                case PixelFormatEnum.Rgba64:
                    return PixelFormatFlags.BitsPerPixel64 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderARGB; 
 
                case PixelFormatEnum.Prgba64:
                    return PixelFormatFlags.BitsPerPixel64 | PixelFormatFlags.IsSRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderARGB; 

                case PixelFormatEnum.Gray16:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Gray32Float:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsScRGB | PixelFormatFlags.IsGray; 
 
                case PixelFormatEnum.Rgb128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB; 

                case PixelFormatEnum.Rgba128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderARGB;
 
                case PixelFormatEnum.Prgba128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderARGB; 
 
                case PixelFormatEnum.Cmyk32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsCMYK; 
            }

            // 3rd party pixel format -- we don't expose anything about it.
            return PixelFormatFlags.BitsPerPixelUndefined; 
        }
 
        static private UInt32 GetBitsPerPixelFromEnum(PixelFormatEnum pixelFormatEnum) 
        {
            switch (pixelFormatEnum) 
            {
                case PixelFormatEnum.Default:
                    return 0;
 
                case PixelFormatEnum.Indexed1:
                    return 1; 
 
                case PixelFormatEnum.Indexed2:
                    return 2; 

                case PixelFormatEnum.Indexed4:
                    return 4;
 
                case PixelFormatEnum.Indexed8:
                    return 8; 
 
                case PixelFormatEnum.BlackWhite:
                    return 1; 

                case PixelFormatEnum.Gray2:
                    return 2;
 
                case PixelFormatEnum.Gray4:
                    return 4; 
 
                case PixelFormatEnum.Gray8:
                    return 8; 

                case PixelFormatEnum.Bgr555:
                case PixelFormatEnum.Bgr565:
                    return 16; 

                case PixelFormatEnum.Bgr101010: 
                    return 32; 

                case PixelFormatEnum.Bgr24: 
                case PixelFormatEnum.Rgb24:
                    return 24;

                case PixelFormatEnum.Bgr32: 
                case PixelFormatEnum.Bgra32:
                case PixelFormatEnum.Pbgra32: 
                    return 32; 

                case PixelFormatEnum.Rgb48: 
                    return 48;

                case PixelFormatEnum.Rgba64:
                case PixelFormatEnum.Prgba64: 
                    return 64;
 
                case PixelFormatEnum.Gray16: 
                    return 16;
 
                case PixelFormatEnum.Gray32Float:
                    return 32;

                case PixelFormatEnum.Rgb128Float: 
                case PixelFormatEnum.Rgba128Float:
                case PixelFormatEnum.Prgba128Float: 
                    return 128; 

                case PixelFormatEnum.Cmyk32: 
                    return 32;
            }

            // 3rd party pixel format -- we don't expose anything about it. 
            return 0;
        } 
 
        [NonSerialized]
        private PixelFormatFlags _flags; 

        [NonSerialized]
        private PixelFormatEnum _format;
 
        [NonSerialized]
        private UInt32 _bitsPerPixel; 
 
        [NonSerialized]
        private SecurityCriticalDataForSet _guidFormat; 

        [NonSerialized]
        private static readonly Guid WICPixelFormatPhotonFirst = new Guid(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1d);
 
        [NonSerialized]
        private static readonly Guid WICPixelFormatPhotonLast  = new Guid(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x42); 
    } 
    #endregion // PixelFormat
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------ 
//  Microsoft Avalon
//  Copyright (c) Microsoft Corporation, 2003
//
//  File: PixelFormat.cs 
//
//----------------------------------------------------------------------------- 
#pragma warning disable 1634, 1691 // Allow suppression of certain presharp messages 

using System; 
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Collections.Generic; 
using System.ComponentModel;
using System.ComponentModel.Design.Serialization; 
using System.Reflection; 
using MS.Internal;
using MS.Win32; 
using System.Diagnostics;
using System.Windows.Media;
using System.Globalization;
using System.Runtime.InteropServices; 

using SR=MS.Internal.PresentationCore.SR; 
using SRID=MS.Internal.PresentationCore.SRID; 
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
 
namespace System.Windows.Media
{
    [System.Flags]
    internal enum PixelFormatFlags 
    {
        BitsPerPixelMask        = 0x00FF, 
        BitsPerPixelUndefined   = 0, 
        BitsPerPixel1           = 1,
        BitsPerPixel2           = 2, 
        BitsPerPixel4           = 4,
        BitsPerPixel8           = 8,
        BitsPerPixel16          = 16,
        BitsPerPixel24          = 24, 
        BitsPerPixel32          = 32,
        BitsPerPixel48          = 48, 
        BitsPerPixel64          = 64, 
        BitsPerPixel96          = 96,
        BitsPerPixel128         = 128, 
        IsGray                  = 0x00000100,   // Grayscale only
        IsCMYK                  = 0x00000200,   // CMYK, not ARGB
        IsSRGB                  = 0x00000400,   // Gamma is approximately 2.2
        IsScRGB                 = 0x00000800,   // Gamma is 1.0 
        Premultiplied           = 0x00001000,   // Premultiplied Alpha
        ChannelOrderMask        = 0x0001E000, 
        ChannelOrderRGB         = 0x00002000, 
        ChannelOrderBGR         = 0x00004000,
        ChannelOrderARGB        = 0x00008000, 
        ChannelOrderABGR        = 0x00010000,
        Palettized              = 0x00020000,   // Pixels are indexes into a palette
        NChannelAlpha           = 0x00040000,   // N-Channel format with alpha
        IsNChannel              = 0x00080000,   // N-Channel format 
    }
 
    #region PixelFormat 

    ///  
    /// Describes the bit mask and shift for a specific pixelformat
    /// 
    public struct PixelFormatChannelMask
    { 
        internal PixelFormatChannelMask(byte[] mask)
        { 
            Debug.Assert(mask != null); 
            _mask = mask;
        } 

        /// 
        /// The bitmask for a color channel
        /// It will never be greater then 0xffffffff 
        /// 
        public IList Mask 
        { 
            get
            { 
                return _mask != null ? new PartialList((byte[])_mask.Clone()) : null;
            }
        }
 
        /// 
        /// op_equality - returns whether or not the two pixel format channel masks are equal 
        ///  
        public static bool operator == (PixelFormatChannelMask left, PixelFormatChannelMask right)
        { 
            return Equals(left, right);
        }

        ///  
        /// Equals - Returns whether or not the two pixel format channel masks are equal
        ///  
        public static bool Equals(PixelFormatChannelMask left, PixelFormatChannelMask right) 
        {
            int leftNumChannels  =  left._mask != null ?  left._mask.Length : 0; 
            int rightNumChannels = right._mask != null ? right._mask.Length : 0;

            if (leftNumChannels != rightNumChannels)
            { 
                return false;
            } 
 
            for (int i = 0; i < leftNumChannels; ++i)
            { 
                if (left._mask[i] != right._mask[i])
                {
                    return false;
                } 
            }
 
            return true; 
        }
 
        /// 
        /// op_inequality - returns whether or not the two pixel format channel masks are not equal
        /// 
        public static bool operator != (PixelFormatChannelMask left, PixelFormatChannelMask right) 
        {
            return !(left == right); 
        } 

        ///  
        /// Equals - Returns whether or not this is equal to the Object
        /// 
        public override bool Equals(Object obj)
        { 
            // Can't use "as" since we're looking for a value type
            return obj is PixelFormatChannelMask ? this == (PixelFormatChannelMask)obj : false; 
        } 

        ///  
        /// GetHashCode - Returns a hash code
        /// 
        public override int GetHashCode()
        { 
            int hash = 0;
 
            if (_mask != null) 
            {
                for (int i = 0, count = _mask.Length; i < count; ++i) 
                {
                    hash += _mask[i] * 256 * i;
                }
            } 

            return hash; 
        } 

        private byte[] _mask; 
    }

    /// 
    /// Pixel Format Definition for images and pixel-based surfaces 
    /// 
    [TypeConverter (typeof(PixelFormatConverter))] 
    [Serializable] 
    public struct PixelFormat : IEquatable
    { 
        /// 
        /// Critical - Accesses closely controlled format guid
        /// 
        [SecurityCritical] 
        internal PixelFormat(Guid guidPixelFormat)
        { 
            bool fBuiltIn = true; 

            byte[] guidBytes = guidPixelFormat.ToByteArray(); 
            byte[] guidBuiltIn = WICPixelFormatGUIDs.WICPixelFormatDontCare.ToByteArray();

            // If it's a built-in format, identify the pixel format enum.
            for (int i = 0, count = guidBytes.Length - 1; i < count; ++i) 
            {
                if (guidBytes[i] != guidBuiltIn[i]) 
                { 
                    fBuiltIn = false;
                    break; 
                }
            }

            if (guidBytes[guidBytes.Length - 1] > (byte)PixelFormatEnum.Cmyk32) 
            {
                fBuiltIn = false; 
            } 

            if (fBuiltIn) 
            {
                _format = (PixelFormatEnum) guidBytes[guidBytes.Length - 1];
            }
            else 
            {
                _format = PixelFormatEnum.Extended; 
            } 

            _flags = GetPixelFormatFlagsFromEnum(_format) | GetPixelFormatFlagsFromGuid(guidPixelFormat); 
            _bitsPerPixel = GetBitsPerPixelFromEnum(_format);
            _guidFormat = new SecurityCriticalDataForSet (guidPixelFormat);
        }
 
        /// 
        /// Critical - Accesses closely controlled format guid 
        /// TreatAsSafe - The input (enum) is validated in setting the format guid 
        /// 
        [SecurityCritical, SecurityTreatAsSafe] 
        internal PixelFormat(PixelFormatEnum format)
        {
            _format = format;
 
            _flags = GetPixelFormatFlagsFromEnum(format);
            _bitsPerPixel = GetBitsPerPixelFromEnum(format); 
            _guidFormat = new SecurityCriticalDataForSet (PixelFormat.GetGuidFromFormat(format)); 
        }
 
        /// 
        /// Construct a pixel format from a string that represents the format.
        /// The purpose of this method is only for deserialization of PixelFormat.
        /// The preferred way to construct a PixelFormat is with the PixelFormats class. 
        /// 
        ///  
        ///  
        /// Critical - Accesses closely controlled format guid
        /// TreatAsSafe - The input (string) is validated in setting the format guid 
        /// 
        [SecurityCritical, SecurityTreatAsSafe]
        internal PixelFormat(string pixelFormatString)
        { 
            PixelFormatEnum format = PixelFormatEnum.Default;
 
            if (pixelFormatString == null) 
            {
                throw new System.ArgumentNullException("pixelFormatString"); 
            }

            string upperPixelFormatString = pixelFormatString.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
 
            switch (upperPixelFormatString)
            { 
                case "DEFAULT": 
                    format = PixelFormatEnum.Default;
                    break; 

                case "EXTENDED":
                    format = PixelFormatEnum.Extended;
                    break; 

                case "INDEXED1": 
                    format = PixelFormatEnum.Indexed1; 
                    break;
 
                case "INDEXED2":
                    format = PixelFormatEnum.Indexed2;
                    break;
 
                case "INDEXED4":
                    format = PixelFormatEnum.Indexed4; 
                    break; 

                case "INDEXED8": 
                    format = PixelFormatEnum.Indexed8;
                    break;

                case "BLACKWHITE": 
                    format = PixelFormatEnum.BlackWhite;
                    break; 
 
                case "GRAY2":
                    format = PixelFormatEnum.Gray2; 
                    break;

                case "GRAY4":
                    format = PixelFormatEnum.Gray4; 
                    break;
 
                case "GRAY8": 
                    format = PixelFormatEnum.Gray8;
                    break; 

                case "BGR555":
                    format = PixelFormatEnum.Bgr555;
                    break; 

                case "BGR565": 
                    format = PixelFormatEnum.Bgr565; 
                    break;
 
                case "BGR24":
                    format = PixelFormatEnum.Bgr24;
                    break;
 
                case "RGB24":
                    format = PixelFormatEnum.Rgb24; 
                    break; 

                case "BGR101010": 
                    format = PixelFormatEnum.Bgr101010;
                    break;

                case "BGR32": 
                    format = PixelFormatEnum.Bgr32;
                    break; 
 
                case "BGRA32":
                    format = PixelFormatEnum.Bgra32; 
                    break;

                case "PBGRA32":
                    format = PixelFormatEnum.Pbgra32; 
                    break;
 
                case "RGB48": 
                    format = PixelFormatEnum.Rgb48;
                    break; 

                case "RGBA64":
                    format = PixelFormatEnum.Rgba64;
                    break; 

                case "PRGBA64": 
                    format = PixelFormatEnum.Prgba64; 
                    break;
 
                case "GRAY16":
                    format = PixelFormatEnum.Gray16;
                    break;
 
                case "GRAY32FLOAT":
                    format = PixelFormatEnum.Gray32Float; 
                    break; 

                case "RGB128FLOAT": 
                    format = PixelFormatEnum.Rgb128Float;
                    break;

                case "RGBA128FLOAT": 
                    format = PixelFormatEnum.Rgba128Float;
                    break; 
 
                case "PRGBA128FLOAT":
                    format = PixelFormatEnum.Prgba128Float; 
                    break;

                case "CMYK32":
                    format = PixelFormatEnum.Cmyk32; 
                    break;
 
                default: 
                    throw new System.ArgumentException (SR.Get(SRID.Image_BadPixelFormat, pixelFormatString),
                            "pixelFormatString"); 
            }

            _format = format;
 
            _flags = GetPixelFormatFlagsFromEnum(format);
            _bitsPerPixel = GetBitsPerPixelFromEnum(format); 
            _guidFormat = new SecurityCriticalDataForSet (PixelFormat.GetGuidFromFormat(format)); 
        }
 
        static private Guid GetGuidFromFormat(PixelFormatEnum format)
        {
            switch (format)
            { 
                case PixelFormatEnum.Default:
                    return WICPixelFormatGUIDs.WICPixelFormatDontCare; 
 
                case PixelFormatEnum.Indexed1:
                    return WICPixelFormatGUIDs.WICPixelFormat1bppIndexed; 

                case PixelFormatEnum.Indexed2:
                    return WICPixelFormatGUIDs.WICPixelFormat2bppIndexed;
 
                case PixelFormatEnum.Indexed4:
                    return WICPixelFormatGUIDs.WICPixelFormat4bppIndexed; 
 
                case PixelFormatEnum.Indexed8:
                    return WICPixelFormatGUIDs.WICPixelFormat8bppIndexed; 

                case PixelFormatEnum.BlackWhite:
                    return WICPixelFormatGUIDs.WICPixelFormatBlackWhite;
 
                case PixelFormatEnum.Gray2:
                    return WICPixelFormatGUIDs.WICPixelFormat2bppGray; 
 
                case PixelFormatEnum.Gray4:
                    return WICPixelFormatGUIDs.WICPixelFormat4bppGray; 

                case PixelFormatEnum.Gray8:
                    return WICPixelFormatGUIDs.WICPixelFormat8bppGray;
 
                case PixelFormatEnum.Bgr555:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppBGR555; 
 
                case PixelFormatEnum.Bgr565:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppBGR565; 

                case PixelFormatEnum.Bgr24:
                    return WICPixelFormatGUIDs.WICPixelFormat24bppBGR;
 
                case PixelFormatEnum.Rgb24:
                    return WICPixelFormatGUIDs.WICPixelFormat24bppRGB; 
 
                case PixelFormatEnum.Bgr101010:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGR101010; 

                case PixelFormatEnum.Bgr32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGR;
 
                case PixelFormatEnum.Bgra32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppBGRA; 
 
                case PixelFormatEnum.Pbgra32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppPBGRA; 

                case PixelFormatEnum.Rgb48:
                    return WICPixelFormatGUIDs.WICPixelFormat48bppRGB;
 
                case PixelFormatEnum.Rgba64:
                    return WICPixelFormatGUIDs.WICPixelFormat64bppRGBA; 
 
                case PixelFormatEnum.Prgba64:
                    return WICPixelFormatGUIDs.WICPixelFormat64bppPRGBA; 

                case PixelFormatEnum.Gray16:
                    return WICPixelFormatGUIDs.WICPixelFormat16bppGray;
 
                case PixelFormatEnum.Gray32Float:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppGrayFloat; 
 
                case PixelFormatEnum.Rgb128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppRGBFloat; 

                case PixelFormatEnum.Rgba128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppRGBAFloat;
 
                case PixelFormatEnum.Prgba128Float:
                    return WICPixelFormatGUIDs.WICPixelFormat128bppPRGBAFloat; 
 
                case PixelFormatEnum.Cmyk32:
                    return WICPixelFormatGUIDs.WICPixelFormat32bppCMYK; 
            }

            throw new System.ArgumentException (SR.Get(SRID.Image_BadPixelFormat, format), "format");
        } 

        private PixelFormatFlags FormatFlags 
        { 
            get
            { 
                return _flags;
            }
        }
 
        /// 
        /// op_equality - returns whether or not the two pixel formats are equal 
        ///  
        public static bool operator == (PixelFormat left, PixelFormat right)
        { 
            return (left.Guid == right.Guid);
        }

        ///  
        /// op_inequality - returns whether or not the two pixel formats are not equal
        ///  
        public static bool operator != (PixelFormat left, PixelFormat right) 
        {
            return (left.Guid != right.Guid); 
        }

        /// 
        /// Equals - Returns whether or not the two pixel formats are equal 
        /// 
        public static bool Equals(PixelFormat left, PixelFormat right) 
        { 
            return (left.Guid == right.Guid);
        } 

        /// 
        /// Equals - Returns whether or not this is equal to the PixelFormat
        ///  
        public bool Equals(PixelFormat pixelFormat)
        { 
            return this == pixelFormat; 
        }
 
        /// 
        /// Equals - Returns whether or not this is equal to the Object
        /// 
        public override bool Equals(Object obj) 
        {
            if ((null == obj) || 
                !(obj is PixelFormat)) 
            {
                return false; 
            }

            return this == (PixelFormat)obj;
        } 

        ///  
        /// GetHashCode - Returns a hash code 
        /// 
        public override int GetHashCode() 
        {
            return Guid.GetHashCode();
        }
 
        /// 
        /// The number of bits per pixel for this format. 
        ///  
        public int BitsPerPixel
        { 
            get
            {
                return InternalBitsPerPixel;
            } 
        }
 
        ///  
        /// The pixel format mask information for each channel.
        ///  
        /// 
        /// Critical - Access unmanaged code
        /// PublicOK - the pixel format info (an exsternal input) comes from a critical function which creates it based on the pixel format GUID
        ///   and has a TAS boundary tracking all setting of it. 
        /// LinkDemand - blocks information disclosure in partial trust scenario
        ///  
        public IList Masks 
        {
            [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] 
            [SecurityCritical]
            get
            {
                IntPtr pixelFormatInfo = CreatePixelFormatInfo(); 
                Debug.Assert(pixelFormatInfo != IntPtr.Zero);
 
                UInt32 channelCount = 0; 
                PixelFormatChannelMask[] masks = null;
                UInt32 cbBytes = 0; 

                try
                {
                    HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelCount( 
                        pixelFormatInfo,
                        out channelCount 
                        )); 

                    Debug.Assert(channelCount >= 1); 

                    masks = new PixelFormatChannelMask[channelCount];

                    unsafe 
                    {
                        for (uint i = 0; i < channelCount; i++) 
                        { 
                            HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelMask(
                                pixelFormatInfo, i, 0, null, out cbBytes)); 

                            Debug.Assert(cbBytes > 0);

                            byte[] channelMask = new byte[cbBytes]; 

                            fixed (byte *pbChannelMask = channelMask) 
                            { 
                                HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetChannelMask(
                                    pixelFormatInfo, i, cbBytes, pbChannelMask, out cbBytes)); 

                                Debug.Assert(cbBytes == channelMask.Length);
                            }
 
                            masks[i] = new PixelFormatChannelMask(channelMask);
                        } 
                    } 
                }
                finally 
                {
                    if (pixelFormatInfo != IntPtr.Zero)
                    {
                        UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref pixelFormatInfo); 
                    }
                } 
 
                return new PartialList(masks);
            } 
        }

        /// 
        /// Critical - Access unmanaged code 
        /// 
        [SecurityCritical] 
        internal IntPtr CreatePixelFormatInfo() 
        {
            IntPtr componentInfo = IntPtr.Zero; 
            IntPtr pixelFormatInfo = IntPtr.Zero;

            using (FactoryMaker myFactory = new FactoryMaker())
            { 
                try
                { 
                    Guid guidPixelFormat = this.Guid; 

                    int hr = UnsafeNativeMethods.WICImagingFactory.CreateComponentInfo( 
                        myFactory.ImagingFactoryPtr,
                        ref guidPixelFormat,
                        out componentInfo);
                    if (hr == (int)WinCodecErrors.WINCODEC_ERR_COMPONENTINITIALIZEFAILURE || 
                        hr == (int)WinCodecErrors.WINCODEC_ERR_COMPONENTNOTFOUND)
                    { 
                        throw new System.NotSupportedException(SR.Get(SRID.Image_NoPixelFormatFound)); 
                    }
                    HRESULT.Check(hr); 

                    Guid guidPixelFormatInfo = MILGuidData.IID_IWICPixelFormatInfo;
                    HRESULT.Check(UnsafeNativeMethods.MILUnknown.QueryInterface(
                        componentInfo, 
                        ref guidPixelFormatInfo,
                        out pixelFormatInfo)); 
                } 
                finally
                { 
                    if (componentInfo != IntPtr.Zero)
                    {
                        UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref componentInfo);
                    } 
                }
            } 
 
            return pixelFormatInfo;
        } 

        /// 
        /// Critical - Access unmanaged code
        /// TreatAsSafe - BitsPerPixel information is safe to share 
        /// 
        internal int InternalBitsPerPixel 
        { 
 			[SecurityCritical, SecurityTreatAsSafe]
            get 
            {
                if (_bitsPerPixel == 0)
                {
                    UInt32 bpp = 0; 

                    IntPtr pixelFormatInfo = CreatePixelFormatInfo(); 
                    Debug.Assert(pixelFormatInfo != IntPtr.Zero); 

                    try 
                    {
                        HRESULT.Check(UnsafeNativeMethods.WICPixelFormatInfo.GetBitsPerPixel(
                            pixelFormatInfo,
                            out bpp 
                            ));
                    } 
                    finally 
                    {
                        if (pixelFormatInfo != IntPtr.Zero) 
                        {
                            UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref pixelFormatInfo);
                        }
                    } 

                    _bitsPerPixel = bpp; 
                } 

                return (int) _bitsPerPixel; 
            }
        }

        internal bool HasAlpha 
        {
            get 
            { 
                return ((FormatFlags & PixelFormatFlags.ChannelOrderABGR) != 0 ||
                            (FormatFlags & PixelFormatFlags.ChannelOrderARGB) != 0 || 
                            (FormatFlags & PixelFormatFlags.NChannelAlpha) != 0);
            }
        }
 
        internal bool Palettized
        { 
            get 
            {
                return ((FormatFlags & PixelFormatFlags.Palettized) != 0); 
            }
        }

        internal PixelFormatEnum Format 
        {
            get 
            { 
                return _format;
            } 
        }

        internal Guid Guid
        { 
            get
            { 
                return _guidFormat.Value; 
            }
        } 

        /// 
        /// Convert a PixelFormat to a string that represents it.
        ///  
        /// 
        public override string ToString () 
        { 
            return _format.ToString();
        } 

        /// 
        /// Critical - calls unmanaged code, accepts unmanaged handles as arguments
        ///  
        [SecurityCritical]
        internal static PixelFormat GetPixelFormat ( 
            SafeMILHandle /* IWICBitmapSource */ bitmapSource 
            )
        { 
            Guid guidPixelFormat = WICPixelFormatGUIDs.WICPixelFormatDontCare;

            HRESULT.Check(UnsafeNativeMethods.WICBitmapSource.GetPixelFormat(bitmapSource, out guidPixelFormat));
 
            return new PixelFormat(guidPixelFormat);
        } 
 
        /// 
        /// Convert from the internal guid to the actual PixelFormat value. 
        /// 
        /// 
        /// 
        internal static PixelFormat GetPixelFormat(Guid pixelFormatGuid) 
        {
            byte[] guidBytes = pixelFormatGuid.ToByteArray(); 
            return GetPixelFormat( (PixelFormatEnum)guidBytes[guidBytes.Length-1] ); 
        }
 
        /// 
        /// Convert from the internal enum to the actual PixelFormat value.
        /// 
        ///  
        /// 
        internal static PixelFormat GetPixelFormat(PixelFormatEnum pixelFormatEnum) 
        { 
            switch (pixelFormatEnum)
            { 
                case PixelFormatEnum.Indexed1:
                    return PixelFormats.Indexed1;

                case PixelFormatEnum.Indexed2: 
                    return PixelFormats.Indexed2;
 
                case PixelFormatEnum.Indexed4: 
                    return PixelFormats.Indexed4;
 
                case PixelFormatEnum.Indexed8:
                    return PixelFormats.Indexed8;

                case PixelFormatEnum.BlackWhite: 
                    return PixelFormats.BlackWhite;
 
                case PixelFormatEnum.Gray2: 
                    return PixelFormats.Gray2;
 
                case PixelFormatEnum.Gray4:
                    return PixelFormats.Gray4;

                case PixelFormatEnum.Gray8: 
                    return PixelFormats.Gray8;
 
                case PixelFormatEnum.Bgr555: 
                    return PixelFormats.Bgr555;
 
                case PixelFormatEnum.Bgr565:
                    return PixelFormats.Bgr565;

                case PixelFormatEnum.Bgr101010: 
                    return PixelFormats.Bgr101010;
 
                case PixelFormatEnum.Bgr24: 
                    return PixelFormats.Bgr24;
 
                case PixelFormatEnum.Rgb24:
                    return PixelFormats.Rgb24;

                case PixelFormatEnum.Bgr32: 
                    return PixelFormats.Bgr32;
 
                case PixelFormatEnum.Bgra32: 
                    return PixelFormats.Bgra32;
 
                case PixelFormatEnum.Pbgra32:
                    return PixelFormats.Pbgra32;

                case PixelFormatEnum.Rgb48: 
                    return PixelFormats.Rgb48;
 
                case PixelFormatEnum.Rgba64: 
                    return PixelFormats.Rgba64;
 
                case PixelFormatEnum.Prgba64:
                    return PixelFormats.Prgba64;

                case PixelFormatEnum.Gray16: 
                    return PixelFormats.Gray16;
 
                case PixelFormatEnum.Gray32Float: 
                    return PixelFormats.Gray32Float;
 
                case PixelFormatEnum.Rgb128Float:
                    return PixelFormats.Rgb128Float;

                case PixelFormatEnum.Rgba128Float: 
                    return PixelFormats.Rgba128Float;
 
                case PixelFormatEnum.Prgba128Float: 
                    return PixelFormats.Prgba128Float;
 
                case PixelFormatEnum.Cmyk32:
                    return PixelFormats.Cmyk32;
            }
 
            return PixelFormats.Default;
        } 
 
        static private PixelFormatFlags GetPixelFormatFlagsFromGuid(Guid pixelFormatGuid)
        { 
            PixelFormatFlags result = PixelFormatFlags.BitsPerPixelUndefined;

            if (pixelFormatGuid.CompareTo(WICPixelFormatPhotonFirst) >= 0 &&
                            pixelFormatGuid.CompareTo(WICPixelFormatPhotonLast) <= 0) 
            {
                byte[] b = pixelFormatGuid.ToByteArray(); 
 
                switch (b[15])
                { 
                    case 0x1D:  // GUID_WICPixelFormat64bppRGBAFixedPoint
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x1E:  // GUID_WICPixelFormat128bppRGBAFixedPoint 
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x1F:  // GUID_WICPixelFormat64bppCMYK 
                        result = PixelFormatFlags.IsCMYK;
                        break; 
                    case 0x20:  // GUID_WICPixelFormat24bpp3Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x21:  // GUID_WICPixelFormat32bpp4Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x22:  // GUID_WICPixelFormat40bpp5Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x23:  // GUID_WICPixelFormat48bpp6Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x24:  // GUID_WICPixelFormat56bpp7Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x25:  // GUID_WICPixelFormat64bpp8Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x26:  // GUID_WICPixelFormat48bpp3Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x27:  // GUID_WICPixelFormat64bpp4Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x28:  // GUID_WICPixelFormat80bpp5Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x29:  // GUID_WICPixelFormat96bpp6Channels
                        result = PixelFormatFlags.IsNChannel;
                        break;
                    case 0x2A:  // GUID_WICPixelFormat112bpp7Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x2B:  // GUID_WICPixelFormat128bpp8Channels 
                        result = PixelFormatFlags.IsNChannel;
                        break; 
                    case 0x2C:  // GUID_WICPixelFormat40bppCMYKAlpha
                        result = PixelFormatFlags.IsCMYK | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x2D:  // GUID_WICPixelFormat80bppCMYKAlpha 
                        result = PixelFormatFlags.IsCMYK | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x2E:  // GUID_WICPixelFormat32bpp3ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x2F:  // GUID_WICPixelFormat40bpp4ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x30:  // GUID_WICPixelFormat48bpp5ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x31:  // GUID_WICPixelFormat56bpp6ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x32:  // GUID_WICPixelFormat64bpp7ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x33:  // GUID_WICPixelFormat72bpp8ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x34:  // GUID_WICPixelFormat64bpp3ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x35:  // GUID_WICPixelFormat80bpp4ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x36:  // GUID_WICPixelFormat96bpp5ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x37:  // GUID_WICPixelFormat112bpp6ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x38:  // GUID_WICPixelFormat128bpp7ChannelsAlpha
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break;
                    case 0x39:  // GUID_WICPixelFormat144bpp8ChannelsAlpha 
                        result = PixelFormatFlags.IsNChannel | PixelFormatFlags.NChannelAlpha;
                        break; 
                    case 0x3A:  // GUID_WICPixelFormat64bppRGBAHalf 
                        result = PixelFormatFlags.ChannelOrderARGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3B:  // GUID_WICPixelFormat48bppRGBHalf
                        result = PixelFormatFlags.ChannelOrderRGB | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x3D:  // GUID_WICPixelFormat32bppRGBE 
                        result = PixelFormatFlags.ChannelOrderRGB | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3E:  // GUID_WICPixelFormat16bppGrayHalf 
                        result = PixelFormatFlags.IsGray | PixelFormatFlags.IsScRGB;
                        break; 
                    case 0x3F:  // GUID_WICPixelFormat32bppGrayFixedPoint
                        result = PixelFormatFlags.IsGray | PixelFormatFlags.IsScRGB;
                        break;
                    case 0x40:  // GUID_WICPixelFormat64bppRGBFixedPoint 
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break; 
                    case 0x41:  // GUID_WICPixelFormat128bppRGBFixedPoint 
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break; 
                    case 0x42:  // GUID_WICPixelFormat64bppRGBHalf
                        result = PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB;
                        break;
                } 
            }
 
            return result; 
        }
 
        static private PixelFormatFlags GetPixelFormatFlagsFromEnum(PixelFormatEnum pixelFormatEnum)
        {
            switch (pixelFormatEnum)
            { 
                case PixelFormatEnum.Default:
                    return PixelFormatFlags.BitsPerPixelUndefined; 
 
                case PixelFormatEnum.Indexed1:
                    return PixelFormatFlags.BitsPerPixel1 | PixelFormatFlags.Palettized; 

                case PixelFormatEnum.Indexed2:
                    return PixelFormatFlags.BitsPerPixel2 | PixelFormatFlags.Palettized;
 
                case PixelFormatEnum.Indexed4:
                    return PixelFormatFlags.BitsPerPixel4 | PixelFormatFlags.Palettized; 
 
                case PixelFormatEnum.Indexed8:
                    return PixelFormatFlags.BitsPerPixel8 | PixelFormatFlags.Palettized; 

                case PixelFormatEnum.BlackWhite:
                    return PixelFormatFlags.BitsPerPixel1 | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Gray2:
                    return PixelFormatFlags.BitsPerPixel2 | PixelFormatFlags.IsGray; 
 
                case PixelFormatEnum.Gray4:
                    return PixelFormatFlags.BitsPerPixel4 | PixelFormatFlags.IsGray; 

                case PixelFormatEnum.Gray8:
                    return PixelFormatFlags.BitsPerPixel8 | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Bgr555:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 
 
                case PixelFormatEnum.Bgr565:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 

                case PixelFormatEnum.Bgr101010:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR;
 
                case PixelFormatEnum.Bgr24:
                    return PixelFormatFlags.BitsPerPixel24 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR; 
 
                case PixelFormatEnum.Rgb24:
                    return PixelFormatFlags.BitsPerPixel24 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderRGB; 

                case PixelFormatEnum.Bgr32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderBGR;
 
                case PixelFormatEnum.Bgra32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderABGR; 
 
                case PixelFormatEnum.Pbgra32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsSRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderABGR; 

                case PixelFormatEnum.Rgb48:
                    return PixelFormatFlags.BitsPerPixel48 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderRGB;
 
                case PixelFormatEnum.Rgba64:
                    return PixelFormatFlags.BitsPerPixel64 | PixelFormatFlags.IsSRGB | PixelFormatFlags.ChannelOrderARGB; 
 
                case PixelFormatEnum.Prgba64:
                    return PixelFormatFlags.BitsPerPixel64 | PixelFormatFlags.IsSRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderARGB; 

                case PixelFormatEnum.Gray16:
                    return PixelFormatFlags.BitsPerPixel16 | PixelFormatFlags.IsSRGB | PixelFormatFlags.IsGray;
 
                case PixelFormatEnum.Gray32Float:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsScRGB | PixelFormatFlags.IsGray; 
 
                case PixelFormatEnum.Rgb128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderRGB; 

                case PixelFormatEnum.Rgba128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.ChannelOrderARGB;
 
                case PixelFormatEnum.Prgba128Float:
                    return PixelFormatFlags.BitsPerPixel128 | PixelFormatFlags.IsScRGB | PixelFormatFlags.Premultiplied | PixelFormatFlags.ChannelOrderARGB; 
 
                case PixelFormatEnum.Cmyk32:
                    return PixelFormatFlags.BitsPerPixel32 | PixelFormatFlags.IsCMYK; 
            }

            // 3rd party pixel format -- we don't expose anything about it.
            return PixelFormatFlags.BitsPerPixelUndefined; 
        }
 
        static private UInt32 GetBitsPerPixelFromEnum(PixelFormatEnum pixelFormatEnum) 
        {
            switch (pixelFormatEnum) 
            {
                case PixelFormatEnum.Default:
                    return 0;
 
                case PixelFormatEnum.Indexed1:
                    return 1; 
 
                case PixelFormatEnum.Indexed2:
                    return 2; 

                case PixelFormatEnum.Indexed4:
                    return 4;
 
                case PixelFormatEnum.Indexed8:
                    return 8; 
 
                case PixelFormatEnum.BlackWhite:
                    return 1; 

                case PixelFormatEnum.Gray2:
                    return 2;
 
                case PixelFormatEnum.Gray4:
                    return 4; 
 
                case PixelFormatEnum.Gray8:
                    return 8; 

                case PixelFormatEnum.Bgr555:
                case PixelFormatEnum.Bgr565:
                    return 16; 

                case PixelFormatEnum.Bgr101010: 
                    return 32; 

                case PixelFormatEnum.Bgr24: 
                case PixelFormatEnum.Rgb24:
                    return 24;

                case PixelFormatEnum.Bgr32: 
                case PixelFormatEnum.Bgra32:
                case PixelFormatEnum.Pbgra32: 
                    return 32; 

                case PixelFormatEnum.Rgb48: 
                    return 48;

                case PixelFormatEnum.Rgba64:
                case PixelFormatEnum.Prgba64: 
                    return 64;
 
                case PixelFormatEnum.Gray16: 
                    return 16;
 
                case PixelFormatEnum.Gray32Float:
                    return 32;

                case PixelFormatEnum.Rgb128Float: 
                case PixelFormatEnum.Rgba128Float:
                case PixelFormatEnum.Prgba128Float: 
                    return 128; 

                case PixelFormatEnum.Cmyk32: 
                    return 32;
            }

            // 3rd party pixel format -- we don't expose anything about it. 
            return 0;
        } 
 
        [NonSerialized]
        private PixelFormatFlags _flags; 

        [NonSerialized]
        private PixelFormatEnum _format;
 
        [NonSerialized]
        private UInt32 _bitsPerPixel; 
 
        [NonSerialized]
        private SecurityCriticalDataForSet _guidFormat; 

        [NonSerialized]
        private static readonly Guid WICPixelFormatPhotonFirst = new Guid(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1d);
 
        [NonSerialized]
        private static readonly Guid WICPixelFormatPhotonLast  = new Guid(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x42); 
    } 
    #endregion // PixelFormat
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK