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
- XmlIgnoreAttribute.cs
- AssemblySettingAttributes.cs
- RtfControls.cs
- TemplatePartAttribute.cs
- PropertyPanel.cs
- HScrollProperties.cs
- JsonSerializer.cs
- TargetException.cs
- BindToObject.cs
- NotifyCollectionChangedEventArgs.cs
- SmiSettersStream.cs
- DataGridViewButtonColumn.cs
- OrCondition.cs
- StructuredTypeEmitter.cs
- StateBag.cs
- BitmapImage.cs
- WebPartEditorApplyVerb.cs
- MimeObjectFactory.cs
- SHA384Managed.cs
- ListViewDesigner.cs
- TemplateParser.cs
- BindingEditor.xaml.cs
- UnlockInstanceCommand.cs
- CollectionChangedEventManager.cs
- TypeConverterHelper.cs
- MethodCallConverter.cs
- BuildManager.cs
- SecondaryIndexList.cs
- ObjectCloneHelper.cs
- MembershipSection.cs
- KoreanLunisolarCalendar.cs
- HashRepartitionEnumerator.cs
- DependencyProperty.cs
- StyleHelper.cs
- AssemblyCache.cs
- IndependentAnimationStorage.cs
- DataBindEngine.cs
- CompositionDesigner.cs
- PageFunction.cs
- HttpPostedFileBase.cs
- PolygonHotSpot.cs
- AutomationIdentifierGuids.cs
- OptimalTextSource.cs
- HtmlElementCollection.cs
- StyleCollection.cs
- SiteMapDataSourceDesigner.cs
- SeparatorAutomationPeer.cs
- DynamicObjectAccessor.cs
- WsdlBuildProvider.cs
- CellParagraph.cs
- PointF.cs
- DataServiceHost.cs
- DoubleIndependentAnimationStorage.cs
- KeyMatchBuilder.cs
- DesignerCalendarAdapter.cs
- SliderAutomationPeer.cs
- SingleKeyFrameCollection.cs
- PointLight.cs
- EdmProperty.cs
- CodeValidator.cs
- Pair.cs
- QualifiedCellIdBoolean.cs
- WorkflowInstanceUnhandledExceptionRecord.cs
- RolePrincipal.cs
- EllipticalNodeOperations.cs
- Pool.cs
- TemplatedWizardStep.cs
- ExtractedStateEntry.cs
- CompilerGlobalScopeAttribute.cs
- ResourceReferenceKeyNotFoundException.cs
- FormViewPageEventArgs.cs
- OleDbCommand.cs
- DocumentStream.cs
- Border.cs
- ContentFileHelper.cs
- ConvertEvent.cs
- ExceptionRoutedEventArgs.cs
- ProtocolsConfiguration.cs
- DataGridViewRowPrePaintEventArgs.cs
- RequestCachingSection.cs
- DetailsViewUpdatedEventArgs.cs
- ProxyElement.cs
- ObfuscateAssemblyAttribute.cs
- ApplicationId.cs
- SafeThemeHandle.cs
- bidPrivateBase.cs
- WmpBitmapEncoder.cs
- XmlSchemaFacet.cs
- BatchServiceHost.cs
- PropertyGrid.cs
- WebServicesDescriptionAttribute.cs
- UriTemplateVariablePathSegment.cs
- SkewTransform.cs
- SqlRetyper.cs
- TrackPointCollection.cs
- X509Chain.cs
- FormattedTextSymbols.cs
- ObjectItemConventionAssemblyLoader.cs
- XmlText.cs
- DataGridItemEventArgs.cs