Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / System / Windows / Media / Imaging / WmpBitmapEncoder.cs / 1 / WmpBitmapEncoder.cs
//------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, All Rights Reserved // // File: WmpBitmapEncoder.cs // //----------------------------------------------------------------------------- using System; using System.Collections; using System.Security; using System.Security.Permissions; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Reflection; using MS.Internal; using MS.Win32.PresentationCore; using System.Diagnostics; using System.Windows.Media; using System.Globalization; using System.Runtime.InteropServices; using System.Windows.Media.Imaging; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.Imaging { #region WmpBitmapEncoder ////// Built-in Encoder for Wmp files. /// public sealed class WmpBitmapEncoder : BitmapEncoder { #region Constructors ////// Constructor for WmpBitmapEncoder /// ////// Critical - will eventually create unmanaged resources /// PublicOk - all inputs are verified /// [SecurityCritical ] public WmpBitmapEncoder() : base(true) { _supportsPreview = false; _supportsGlobalThumbnail = false; _supportsGlobalMetadata = false; _supportsMultipleFrames = false; } #endregion #region Public Properties // Begin WMPhoto-Canonical Encoder Parameter Properties ////// Set the canonical quality level for the encoding. /// The quality level must be between 0.0-1.0, inclusive. /// This property is mutually exclusive with doing lossless encoding. /// public float ImageQualityLevel { get { return _imagequalitylevel; } set { if ((value < 0.0) || (value > 1.0)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0.0, 1.0)); } _imagequalitylevel= value; } } ////// Set the lossless property for encoding. /// The quality level must be true/false. /// This property is mutually exclusive with doing lossy encoding. /// public bool Lossless { get { return _lossless; } set { _lossless = value; } } ////// Set a lossless rotation value of Rotation degrees. /// This replaces any previous lossless transformation. /// public Rotation Rotation { get { if (Rotate90) { return Rotation.Rotate90; } else if (Rotate180) { return Rotation.Rotate180; } else if (Rotate270) { return Rotation.Rotate270; } else { return Rotation.Rotate0; } } set { Rotate90 = false; Rotate180 = false; Rotate270 = false; switch(value) { case(Rotation.Rotate0): // do nothing, we reset everything above // case statement is here for clearness break; case(Rotation.Rotate90): Rotate90 = true; break; case(Rotation.Rotate180): Rotate180 = true; break; case(Rotation.Rotate270): Rotate270 = true; break; } } } ////// Set a lossless horizontal flip. /// This replaces any previous lossless transformation. /// public bool FlipHorizontal { get { return (Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal)); } set { if (value != this.FlipHorizontal) { if (value) { _transformation |= WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal; } else { _transformation &= ~WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal; } } } } ////// Set a lossless vertical flip. /// This replaces any previous lossless transformation. /// public bool FlipVertical { get { return (Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformFlipVertical)); } set { if (value != this.FlipVertical) { if (value) { _transformation |= WICBitmapTransformOptions.WICBitmapTransformFlipVertical; } else { _transformation &= ~WICBitmapTransformOptions.WICBitmapTransformFlipVertical; } } } } // End WMPhoto-Canonical Encoder Parameter Properties // Begin WMPhoto-Specific Encoder Parameter Properties ////// Set the flag to use wmphoto-specific encoding parameters for encoding. /// This property is mutually exclusive with using ImageQuality for encoding. /// public bool UseCodecOptions { get { return _usecodecoptions; } set { _usecodecoptions = value; } } ////// Set the quality level for the encoding. /// The quality level must be between 1-255, inclusive. /// public byte QualityLevel { get { return _qualitylevel; } set { if ((value < 1) || (value > 255)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 1, 255)); } _qualitylevel = value; } } ////// Set the subsampling level for the encoding. /// The subsampling level must be between 0-3, inclusive. /// public byte SubsamplingLevel { get { return _subsamplinglevel; } set { if ((value < 0) || (value > 3)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 3)); } _subsamplinglevel = value; } } ////// Set the overlap level for the encoding. /// The overlap level must be between 0-2, inclusive. /// public byte OverlapLevel { get { return _overlaplevel; } set { if ((value < 0) || (value > 2)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 2)); } _overlaplevel = value; } } ////// Set the number of horizontal tile slices for the encoding. /// The number of horizontal tile slices must be between 0-4096, inclusive. /// public short HorizontalTileSlices { get { return _horizontaltileslices; } set { if ((value < 0) || (value > 4096)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4096)); } _horizontaltileslices = value; } } ////// Set the number of horizontal tice slices for the encoding. /// The number of horizontal tile slices must be between 0-4096, inclusive. /// public short VerticalTileSlices { get { return _verticaltileslices; } set { if ((value < 0) || (value > 4096)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4096)); } _verticaltileslices = value; } } ////// Set the flag to use frequency ordering for encoding. /// public bool FrequencyOrder { get { return _frequencyorder; } set { _frequencyorder = value; } } ////// Set the flag to for interleaved alpha for encoding. /// public bool InterleavedAlpha { get { return _interleavedalpha; } set { _interleavedalpha = value; } } ////// Set the aplha quality level for the encoding. /// The number of horizontal tile slices must be between 0-255, inclusive. /// public byte AlphaQualityLevel { get { return _alphaqualitylevel; } set { if ((value < 0) || (value > 255)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 255)); } _alphaqualitylevel = value; } } ////// Set the flag for Compressed domain operations during encoding. /// public bool CompressedDomainTranscode { get { return _compresseddomaintranscode; } set { _compresseddomaintranscode = value; } } ////// Set the image data discard level for the encoding. /// The image data discard level must be between 0-3, inclusive. /// public byte ImageDataDiscardLevel { get { return _imagedatadiscardlevel; } set { if ((value < 0) || (value > 3)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 3)); } _imagedatadiscardlevel = value; } } ////// Set the alpha data discard level for the encoding. /// The alpha data discard level must be between 0-3, inclusive. /// public byte AlphaDataDiscardLevel { get { return _alphadatadiscardlevel; } set { if ((value < 0) || (value > 4)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4)); } _alphadatadiscardlevel = value; } } ////// Set the flag to ignore overlap during encoding. /// public bool IgnoreOverlap { get { return _ignoreoverlap; } set { _ignoreoverlap = value; } } // End WMPhoto-Specific Encoder Parameter Properties ////// Setups the encoder and other properties before encoding each frame /// ////// Critical - calls Critical IPropertyBag2.Write() and Critical Initialize() /// [SecurityCritical] internal override void SetupFrame(SafeMILHandle frameEncodeHandle, SafeMILHandle encoderOptions) { PROPBAG2 propBag = new PROPBAG2(); PROPVARIANT propValue = new PROPVARIANT(); if (_imagequalitylevel != c_defaultImageQualityLevel) { try { propBag.Init("ImageQuality"); propValue.Init((float)_imagequalitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_transformation != c_defaultTransformation) { try { propBag.Init("BitmapTransform"); propValue.Init((byte) _transformation); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_lossless != c_defaultLossless) { try { propBag.Init("Lossless"); propValue.Init((bool)_lossless); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_usecodecoptions != c_defaultUseCodecOptions) { try { propBag.Init("UseCodecOptions"); propValue.Init((bool)_usecodecoptions); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_qualitylevel != c_defaultQualityLevel) { try { propBag.Init("Quality"); propValue.Init((byte)_qualitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_subsamplinglevel != c_defaultSubsamplingLevel) { try { propBag.Init("Subsampling"); propValue.Init((byte)_subsamplinglevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_overlaplevel != c_defaultOverlapLevel) { try { propBag.Init("Overlap"); propValue.Init((byte)_overlaplevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_horizontaltileslices != c_defaultHorizontalTileSlices) { try { propBag.Init("HorizontalTileSlices"); propValue.Init((ushort)_horizontaltileslices ); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_verticaltileslices != c_defaultVerticalTileSlices) { try { propBag.Init("VerticalTileSlices"); propValue.Init((ushort)_verticaltileslices ); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_frequencyorder != c_defaultFrequencyOrder) { try { propBag.Init("FrequencyOrder"); propValue.Init((bool)_frequencyorder); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_interleavedalpha != c_defaultInterleavedAlpha) { try { propBag.Init("InterleavedAlpha"); propValue.Init((bool)_interleavedalpha); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_alphaqualitylevel != c_defaultAlphaQualityLevel) { try { propBag.Init("AlphaQuality"); propValue.Init((byte)_alphaqualitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_compresseddomaintranscode != c_defaultCompressedDomainTranscode) { try { propBag.Init("CompressedDomainTranscode"); propValue.Init((bool)_compresseddomaintranscode); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_imagedatadiscardlevel != c_defaultImageDataDiscardLevel) { try { propBag.Init("ImageDataDiscard"); propValue.Init((byte)_imagedatadiscardlevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_alphadatadiscardlevel != c_defaultAlphaDataDiscardLevel) { try { propBag.Init("AlphaDataDiscard"); propValue.Init((byte)_alphadatadiscardlevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_ignoreoverlap != c_defaultIgnoreOverlap) { try { propBag.Init("IgnoreOverlap"); propValue.Init((bool)_ignoreoverlap); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } HRESULT.Check(UnsafeNativeMethods.WICBitmapFrameEncode.Initialize( frameEncodeHandle, encoderOptions )); } ////// Set a lossless rotation value of 90 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate90 { get { return ((Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate90) && (!Rotate270))); } set { if (value != this.Rotate90) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate90; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } ////// Set a lossless rotation value of 180 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate180 { get { return ((Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate180) && (!Rotate270))); } set { if (value != this.Rotate180) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate180; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } ////// Set a lossless rotation value of 270 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate270 { get { return (Convert.ToBoolean(((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate270) == (int)WICBitmapTransformOptions.WICBitmapTransformRotate270)); } set { if (value != this.Rotate270) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate270; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } #endregion #region Internal Properties / Methods ////// Returns the container format for this encoder /// ////// Critical - uses guid to create unmanaged resources /// internal override Guid ContainerFormat { [SecurityCritical] get { return _containerFormat; } } #endregion #region Internal Abstract /// Need to implement this to derive from the "sealed" object internal override void SealObject() { throw new NotImplementedException(); } #endregion #region Data Members ////// Critical - CLSID used for creation of critical resources /// [SecurityCritical] private Guid _containerFormat = MILGuidData.GUID_ContainerFormatWmp; private const bool c_defaultLossless = false; private bool _lossless = c_defaultLossless; private const float c_defaultImageQualityLevel= 0.9f; private float _imagequalitylevel= c_defaultImageQualityLevel; private const WICBitmapTransformOptions c_defaultTransformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; private WICBitmapTransformOptions _transformation = c_defaultTransformation; private const bool c_defaultUseCodecOptions = false; private bool _usecodecoptions = c_defaultUseCodecOptions; private const byte c_defaultQualityLevel = 1; private byte _qualitylevel = c_defaultQualityLevel; private const byte c_defaultSubsamplingLevel = 3; private byte _subsamplinglevel = c_defaultSubsamplingLevel; private const byte c_defaultOverlapLevel = 1; private byte _overlaplevel = c_defaultOverlapLevel; private const short c_defaultHorizontalTileSlices = 0; private short _horizontaltileslices = c_defaultHorizontalTileSlices; private const short c_defaultVerticalTileSlices = 0; private short _verticaltileslices = c_defaultVerticalTileSlices; private const bool c_defaultFrequencyOrder = true; private bool _frequencyorder = c_defaultFrequencyOrder; private const bool c_defaultInterleavedAlpha = false; private bool _interleavedalpha = c_defaultInterleavedAlpha; private const byte c_defaultAlphaQualityLevel = 1; private byte _alphaqualitylevel = c_defaultAlphaQualityLevel; private const bool c_defaultCompressedDomainTranscode = true; private bool _compresseddomaintranscode = c_defaultCompressedDomainTranscode; private const byte c_defaultImageDataDiscardLevel = 0; private byte _imagedatadiscardlevel = c_defaultImageDataDiscardLevel; private const byte c_defaultAlphaDataDiscardLevel = 0; private byte _alphadatadiscardlevel = c_defaultAlphaDataDiscardLevel; private const bool c_defaultIgnoreOverlap = false; private bool _ignoreoverlap = c_defaultIgnoreOverlap; #endregion } #endregion // WmpBitmapEncoder } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, All Rights Reserved // // File: WmpBitmapEncoder.cs // //----------------------------------------------------------------------------- using System; using System.Collections; using System.Security; using System.Security.Permissions; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Reflection; using MS.Internal; using MS.Win32.PresentationCore; using System.Diagnostics; using System.Windows.Media; using System.Globalization; using System.Runtime.InteropServices; using System.Windows.Media.Imaging; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.Imaging { #region WmpBitmapEncoder ////// Built-in Encoder for Wmp files. /// public sealed class WmpBitmapEncoder : BitmapEncoder { #region Constructors ////// Constructor for WmpBitmapEncoder /// ////// Critical - will eventually create unmanaged resources /// PublicOk - all inputs are verified /// [SecurityCritical ] public WmpBitmapEncoder() : base(true) { _supportsPreview = false; _supportsGlobalThumbnail = false; _supportsGlobalMetadata = false; _supportsMultipleFrames = false; } #endregion #region Public Properties // Begin WMPhoto-Canonical Encoder Parameter Properties ////// Set the canonical quality level for the encoding. /// The quality level must be between 0.0-1.0, inclusive. /// This property is mutually exclusive with doing lossless encoding. /// public float ImageQualityLevel { get { return _imagequalitylevel; } set { if ((value < 0.0) || (value > 1.0)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0.0, 1.0)); } _imagequalitylevel= value; } } ////// Set the lossless property for encoding. /// The quality level must be true/false. /// This property is mutually exclusive with doing lossy encoding. /// public bool Lossless { get { return _lossless; } set { _lossless = value; } } ////// Set a lossless rotation value of Rotation degrees. /// This replaces any previous lossless transformation. /// public Rotation Rotation { get { if (Rotate90) { return Rotation.Rotate90; } else if (Rotate180) { return Rotation.Rotate180; } else if (Rotate270) { return Rotation.Rotate270; } else { return Rotation.Rotate0; } } set { Rotate90 = false; Rotate180 = false; Rotate270 = false; switch(value) { case(Rotation.Rotate0): // do nothing, we reset everything above // case statement is here for clearness break; case(Rotation.Rotate90): Rotate90 = true; break; case(Rotation.Rotate180): Rotate180 = true; break; case(Rotation.Rotate270): Rotate270 = true; break; } } } ////// Set a lossless horizontal flip. /// This replaces any previous lossless transformation. /// public bool FlipHorizontal { get { return (Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal)); } set { if (value != this.FlipHorizontal) { if (value) { _transformation |= WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal; } else { _transformation &= ~WICBitmapTransformOptions.WICBitmapTransformFlipHorizontal; } } } } ////// Set a lossless vertical flip. /// This replaces any previous lossless transformation. /// public bool FlipVertical { get { return (Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformFlipVertical)); } set { if (value != this.FlipVertical) { if (value) { _transformation |= WICBitmapTransformOptions.WICBitmapTransformFlipVertical; } else { _transformation &= ~WICBitmapTransformOptions.WICBitmapTransformFlipVertical; } } } } // End WMPhoto-Canonical Encoder Parameter Properties // Begin WMPhoto-Specific Encoder Parameter Properties ////// Set the flag to use wmphoto-specific encoding parameters for encoding. /// This property is mutually exclusive with using ImageQuality for encoding. /// public bool UseCodecOptions { get { return _usecodecoptions; } set { _usecodecoptions = value; } } ////// Set the quality level for the encoding. /// The quality level must be between 1-255, inclusive. /// public byte QualityLevel { get { return _qualitylevel; } set { if ((value < 1) || (value > 255)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 1, 255)); } _qualitylevel = value; } } ////// Set the subsampling level for the encoding. /// The subsampling level must be between 0-3, inclusive. /// public byte SubsamplingLevel { get { return _subsamplinglevel; } set { if ((value < 0) || (value > 3)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 3)); } _subsamplinglevel = value; } } ////// Set the overlap level for the encoding. /// The overlap level must be between 0-2, inclusive. /// public byte OverlapLevel { get { return _overlaplevel; } set { if ((value < 0) || (value > 2)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 2)); } _overlaplevel = value; } } ////// Set the number of horizontal tile slices for the encoding. /// The number of horizontal tile slices must be between 0-4096, inclusive. /// public short HorizontalTileSlices { get { return _horizontaltileslices; } set { if ((value < 0) || (value > 4096)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4096)); } _horizontaltileslices = value; } } ////// Set the number of horizontal tice slices for the encoding. /// The number of horizontal tile slices must be between 0-4096, inclusive. /// public short VerticalTileSlices { get { return _verticaltileslices; } set { if ((value < 0) || (value > 4096)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4096)); } _verticaltileslices = value; } } ////// Set the flag to use frequency ordering for encoding. /// public bool FrequencyOrder { get { return _frequencyorder; } set { _frequencyorder = value; } } ////// Set the flag to for interleaved alpha for encoding. /// public bool InterleavedAlpha { get { return _interleavedalpha; } set { _interleavedalpha = value; } } ////// Set the aplha quality level for the encoding. /// The number of horizontal tile slices must be between 0-255, inclusive. /// public byte AlphaQualityLevel { get { return _alphaqualitylevel; } set { if ((value < 0) || (value > 255)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 255)); } _alphaqualitylevel = value; } } ////// Set the flag for Compressed domain operations during encoding. /// public bool CompressedDomainTranscode { get { return _compresseddomaintranscode; } set { _compresseddomaintranscode = value; } } ////// Set the image data discard level for the encoding. /// The image data discard level must be between 0-3, inclusive. /// public byte ImageDataDiscardLevel { get { return _imagedatadiscardlevel; } set { if ((value < 0) || (value > 3)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 3)); } _imagedatadiscardlevel = value; } } ////// Set the alpha data discard level for the encoding. /// The alpha data discard level must be between 0-3, inclusive. /// public byte AlphaDataDiscardLevel { get { return _alphadatadiscardlevel; } set { if ((value < 0) || (value > 4)) { throw new System.ArgumentOutOfRangeException("value", SR.Get(SRID.ParameterMustBeBetween, 0, 4)); } _alphadatadiscardlevel = value; } } ////// Set the flag to ignore overlap during encoding. /// public bool IgnoreOverlap { get { return _ignoreoverlap; } set { _ignoreoverlap = value; } } // End WMPhoto-Specific Encoder Parameter Properties ////// Setups the encoder and other properties before encoding each frame /// ////// Critical - calls Critical IPropertyBag2.Write() and Critical Initialize() /// [SecurityCritical] internal override void SetupFrame(SafeMILHandle frameEncodeHandle, SafeMILHandle encoderOptions) { PROPBAG2 propBag = new PROPBAG2(); PROPVARIANT propValue = new PROPVARIANT(); if (_imagequalitylevel != c_defaultImageQualityLevel) { try { propBag.Init("ImageQuality"); propValue.Init((float)_imagequalitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_transformation != c_defaultTransformation) { try { propBag.Init("BitmapTransform"); propValue.Init((byte) _transformation); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_lossless != c_defaultLossless) { try { propBag.Init("Lossless"); propValue.Init((bool)_lossless); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_usecodecoptions != c_defaultUseCodecOptions) { try { propBag.Init("UseCodecOptions"); propValue.Init((bool)_usecodecoptions); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_qualitylevel != c_defaultQualityLevel) { try { propBag.Init("Quality"); propValue.Init((byte)_qualitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_subsamplinglevel != c_defaultSubsamplingLevel) { try { propBag.Init("Subsampling"); propValue.Init((byte)_subsamplinglevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_overlaplevel != c_defaultOverlapLevel) { try { propBag.Init("Overlap"); propValue.Init((byte)_overlaplevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_horizontaltileslices != c_defaultHorizontalTileSlices) { try { propBag.Init("HorizontalTileSlices"); propValue.Init((ushort)_horizontaltileslices ); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_verticaltileslices != c_defaultVerticalTileSlices) { try { propBag.Init("VerticalTileSlices"); propValue.Init((ushort)_verticaltileslices ); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_frequencyorder != c_defaultFrequencyOrder) { try { propBag.Init("FrequencyOrder"); propValue.Init((bool)_frequencyorder); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_interleavedalpha != c_defaultInterleavedAlpha) { try { propBag.Init("InterleavedAlpha"); propValue.Init((bool)_interleavedalpha); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_alphaqualitylevel != c_defaultAlphaQualityLevel) { try { propBag.Init("AlphaQuality"); propValue.Init((byte)_alphaqualitylevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_compresseddomaintranscode != c_defaultCompressedDomainTranscode) { try { propBag.Init("CompressedDomainTranscode"); propValue.Init((bool)_compresseddomaintranscode); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_imagedatadiscardlevel != c_defaultImageDataDiscardLevel) { try { propBag.Init("ImageDataDiscard"); propValue.Init((byte)_imagedatadiscardlevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_alphadatadiscardlevel != c_defaultAlphaDataDiscardLevel) { try { propBag.Init("AlphaDataDiscard"); propValue.Init((byte)_alphadatadiscardlevel); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } if (_ignoreoverlap != c_defaultIgnoreOverlap) { try { propBag.Init("IgnoreOverlap"); propValue.Init((bool)_ignoreoverlap); HRESULT.Check(UnsafeNativeMethods.IPropertyBag2.Write( encoderOptions, 1, ref propBag, ref propValue)); } finally { propBag.Clear(); propValue.Clear(); } } HRESULT.Check(UnsafeNativeMethods.WICBitmapFrameEncode.Initialize( frameEncodeHandle, encoderOptions )); } ////// Set a lossless rotation value of 90 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate90 { get { return ((Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate90) && (!Rotate270))); } set { if (value != this.Rotate90) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate90; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } ////// Set a lossless rotation value of 180 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate180 { get { return ((Convert.ToBoolean((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate180) && (!Rotate270))); } set { if (value != this.Rotate180) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate180; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } ////// Set a lossless rotation value of 270 degrees. /// This replaces any previous lossless transformation. /// We can coexist with Flip operation /// private bool Rotate270 { get { return (Convert.ToBoolean(((int)_transformation & (int)WICBitmapTransformOptions.WICBitmapTransformRotate270) == (int)WICBitmapTransformOptions.WICBitmapTransformRotate270)); } set { if (value != this.Rotate270) { bool IsFlipH = FlipHorizontal; bool IsFlipV = FlipVertical; if (value) { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate270; } else { _transformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; } FlipHorizontal = IsFlipH; FlipVertical = IsFlipV; } } } #endregion #region Internal Properties / Methods ////// Returns the container format for this encoder /// ////// Critical - uses guid to create unmanaged resources /// internal override Guid ContainerFormat { [SecurityCritical] get { return _containerFormat; } } #endregion #region Internal Abstract /// Need to implement this to derive from the "sealed" object internal override void SealObject() { throw new NotImplementedException(); } #endregion #region Data Members ////// Critical - CLSID used for creation of critical resources /// [SecurityCritical] private Guid _containerFormat = MILGuidData.GUID_ContainerFormatWmp; private const bool c_defaultLossless = false; private bool _lossless = c_defaultLossless; private const float c_defaultImageQualityLevel= 0.9f; private float _imagequalitylevel= c_defaultImageQualityLevel; private const WICBitmapTransformOptions c_defaultTransformation = WICBitmapTransformOptions.WICBitmapTransformRotate0; private WICBitmapTransformOptions _transformation = c_defaultTransformation; private const bool c_defaultUseCodecOptions = false; private bool _usecodecoptions = c_defaultUseCodecOptions; private const byte c_defaultQualityLevel = 1; private byte _qualitylevel = c_defaultQualityLevel; private const byte c_defaultSubsamplingLevel = 3; private byte _subsamplinglevel = c_defaultSubsamplingLevel; private const byte c_defaultOverlapLevel = 1; private byte _overlaplevel = c_defaultOverlapLevel; private const short c_defaultHorizontalTileSlices = 0; private short _horizontaltileslices = c_defaultHorizontalTileSlices; private const short c_defaultVerticalTileSlices = 0; private short _verticaltileslices = c_defaultVerticalTileSlices; private const bool c_defaultFrequencyOrder = true; private bool _frequencyorder = c_defaultFrequencyOrder; private const bool c_defaultInterleavedAlpha = false; private bool _interleavedalpha = c_defaultInterleavedAlpha; private const byte c_defaultAlphaQualityLevel = 1; private byte _alphaqualitylevel = c_defaultAlphaQualityLevel; private const bool c_defaultCompressedDomainTranscode = true; private bool _compresseddomaintranscode = c_defaultCompressedDomainTranscode; private const byte c_defaultImageDataDiscardLevel = 0; private byte _imagedatadiscardlevel = c_defaultImageDataDiscardLevel; private const byte c_defaultAlphaDataDiscardLevel = 0; private byte _alphadatadiscardlevel = c_defaultAlphaDataDiscardLevel; private const bool c_defaultIgnoreOverlap = false; private bool _ignoreoverlap = c_defaultIgnoreOverlap; #endregion } #endregion // WmpBitmapEncoder } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ComEventsMethod.cs
- SqlDataSourceSelectingEventArgs.cs
- DataGridViewEditingControlShowingEventArgs.cs
- FilteredAttributeCollection.cs
- EntityCollection.cs
- RSAPKCS1SignatureDeformatter.cs
- Symbol.cs
- HttpCacheVaryByContentEncodings.cs
- PackageRelationshipSelector.cs
- TemplateXamlParser.cs
- ItemsControl.cs
- TemplateInstanceAttribute.cs
- Propagator.JoinPropagator.cs
- ReliableChannelBinder.cs
- ConfigurationErrorsException.cs
- ConstructorNeedsTagAttribute.cs
- KnownTypesHelper.cs
- DocumentSchemaValidator.cs
- AcceleratedTokenProviderState.cs
- HTTP_SERVICE_CONFIG_URLACL_PARAM.cs
- ListDictionaryInternal.cs
- IndependentlyAnimatedPropertyMetadata.cs
- ReadonlyMessageFilter.cs
- _LoggingObject.cs
- SiteMapHierarchicalDataSourceView.cs
- SiteMapNode.cs
- TriggerAction.cs
- CommittableTransaction.cs
- Timer.cs
- MimeMapping.cs
- BaseUriHelper.cs
- ReadOnlyCollectionBase.cs
- Location.cs
- TopClause.cs
- TransformerTypeCollection.cs
- FileReader.cs
- RuntimeCompatibilityAttribute.cs
- InkCanvasInnerCanvas.cs
- SafeNativeMethods.cs
- DockPanel.cs
- PartManifestEntry.cs
- ReferentialConstraint.cs
- BackEase.cs
- XmlSerializerNamespaces.cs
- CompositeTypefaceMetrics.cs
- EntityCommand.cs
- EntityDataSourceReferenceGroup.cs
- HashHelper.cs
- NavigatingCancelEventArgs.cs
- WizardStepBase.cs
- StartFileNameEditor.cs
- WebPart.cs
- InterleavedZipPartStream.cs
- RawTextInputReport.cs
- LayoutInformation.cs
- ContractComponent.cs
- _LoggingObject.cs
- SchemaImporterExtensionElementCollection.cs
- WebBrowserPermission.cs
- ParallelActivityDesigner.cs
- TextReader.cs
- HeaderLabel.cs
- NeutralResourcesLanguageAttribute.cs
- DashStyles.cs
- FilterUserControlBase.cs
- RunWorkerCompletedEventArgs.cs
- EngineSiteSapi.cs
- CollaborationHelperFunctions.cs
- FamilyMap.cs
- StylusEventArgs.cs
- WebPartZoneCollection.cs
- ManagementBaseObject.cs
- UnderstoodHeaders.cs
- KeySplineConverter.cs
- MdImport.cs
- DocumentSequenceHighlightLayer.cs
- DetailsViewUpdateEventArgs.cs
- CodeArrayCreateExpression.cs
- RightNameExpirationInfoPair.cs
- securitymgrsite.cs
- SafeBitVector32.cs
- FileSystemEnumerable.cs
- PassportAuthenticationEventArgs.cs
- FormViewPageEventArgs.cs
- InstanceCreationEditor.cs
- UserPreferenceChangingEventArgs.cs
- MemberNameValidator.cs
- ResourcesBuildProvider.cs
- _ListenerAsyncResult.cs
- TypeConverterAttribute.cs
- NamespaceMapping.cs
- MetadataSource.cs
- SecurityElement.cs
- XmlCharacterData.cs
- EndEvent.cs
- TrackPointCollection.cs
- Button.cs
- HostProtectionPermission.cs
- WebPartMovingEventArgs.cs
- OperationExecutionFault.cs