Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / Imaging / FormatConvertedBitmap.cs / 1 / FormatConvertedBitmap.cs
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation. All Rights Reserved.
//
// File: FormatConvertedBitmap.cs
//
//-----------------------------------------------------------------------------
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using MS.Internal;
using MS.Win32.PresentationCore;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using System.Windows.Media;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Windows.Media.Animation;
using System.Windows.Media.Composition;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
namespace System.Windows.Media.Imaging
{
#region FormatConvertedBitmap
///
/// FormatConvertedBitmap provides caching functionality for a BitmapSource.
///
public sealed partial class FormatConvertedBitmap : Imaging.BitmapSource, ISupportInitialize
{
///
/// Constructor
///
public FormatConvertedBitmap() : base(true)
{
}
///
/// Construct a FormatConvertedBitmap
///
/// BitmapSource to apply to the format conversion to
/// Destionation Format to apply to the bitmap
/// Palette if format is palettized
/// Alpha threshold
public FormatConvertedBitmap(BitmapSource source, PixelFormat destinationFormat, BitmapPalette destinationPalette, double alphaThreshold)
: base(true) // Use base class virtuals
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (alphaThreshold < (double)(0.0) || alphaThreshold > (double)(100.0))
{
throw new ArgumentException(SR.Get(SRID.Image_AlphaThresholdOutOfRange));
}
_bitmapInit.BeginInit();
Source = source;
DestinationFormat = destinationFormat;
DestinationPalette = destinationPalette;
AlphaThreshold = alphaThreshold;
_bitmapInit.EndInit();
FinalizeCreation();
}
// ISupportInitialize
///
/// Prepare the bitmap to accept initialize paramters.
///
public void BeginInit()
{
WritePreamble();
_bitmapInit.BeginInit();
}
///
/// Prepare the bitmap to accept initialize paramters.
///
///
/// Critical - access critical resources
/// PublicOK - All inputs verified
///
[SecurityCritical ]
public void EndInit()
{
WritePreamble();
_bitmapInit.EndInit();
if (Source == null)
{
throw new InvalidOperationException(SR.Get(SRID.Image_NoArgument, "Source"));
}
if (DestinationFormat.Palettized)
{
if (DestinationPalette == null)
{
throw new InvalidOperationException(SR.Get(SRID.Image_IndexedPixelFormatRequiresPalette));
}
else if ((1 << DestinationFormat.BitsPerPixel) < DestinationPalette.Colors.Count)
{
throw new InvalidOperationException(SR.Get(SRID.Image_PaletteColorsDoNotMatchFormat));
}
}
FinalizeCreation();
}
private void ClonePrequel(FormatConvertedBitmap otherFormatConvertedBitmap)
{
BeginInit();
}
private void ClonePostscript(FormatConvertedBitmap otherFormatConvertedBitmap)
{
EndInit();
}
///
/// Create the unmanaged resources
///
///
/// Critical - access critical resource
///
[SecurityCritical]
internal override void FinalizeCreation()
{
_bitmapInit.EnsureInitializedComplete();
BitmapSourceSafeMILHandle wicFormatter = null;
using (FactoryMaker factoryMaker = new FactoryMaker())
{
try
{
IntPtr wicFactory = factoryMaker.ImagingFactoryPtr;
HRESULT.Check(UnsafeNativeMethods.WICImagingFactory.CreateFormatConverter(
wicFactory,
out wicFormatter));
SafeMILHandle internalPalette;
if (DestinationPalette != null)
internalPalette = DestinationPalette.InternalPalette;
else
internalPalette = new SafeMILHandle();
Guid format = DestinationFormat.Guid;
lock (_syncObject)
{
HRESULT.Check(UnsafeNativeMethods.WICFormatConverter.Initialize(
wicFormatter,
Source.WicSourceHandle,
ref format,
DitherType.DitherTypeErrorDiffusion,
internalPalette,
AlphaThreshold,
WICPaletteType.WICPaletteTypeOptimal
));
}
WicSourceHandle = wicFormatter;
// Even if our source is cached, format conversion is expensive and so we'll
// always maintain our own cache for the purpose of rendering.
_isSourceCached = false;
}
catch
{
_bitmapInit.Reset();
throw;
}
}
CreationCompleted = true;
UpdateCachedSettings();
}
///
/// Notification on source changing.
///
private void SourcePropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
if (!e.IsASubPropertyChange)
{
BitmapSource newSource = e.NewValue as BitmapSource;
_source = newSource;
_syncObject = (newSource != null) ? newSource.SyncObject : _bitmapInit;
}
}
///
/// Notification on destination format changing.
///
private void DestinationFormatPropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
if (!e.IsASubPropertyChange)
{
_destinationFormat = (PixelFormat)e.NewValue;
}
}
///
/// Notification on destination palette changing.
///
private void DestinationPalettePropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
if (!e.IsASubPropertyChange)
{
_destinationPalette = e.NewValue as BitmapPalette;
}
}
///
/// Notification on alpha threshold changing.
///
private void AlphaThresholdPropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
if (!e.IsASubPropertyChange)
{
_alphaThreshold = (double)e.NewValue;
}
}
///
/// Coerce Source
///
private static object CoerceSource(DependencyObject d, object value)
{
FormatConvertedBitmap bitmap = (FormatConvertedBitmap)d;
if (!bitmap._bitmapInit.IsInInit)
{
return bitmap._source;
}
else
{
return value;
}
}
///
/// Coerce DestinationFormat
///
private static object CoerceDestinationFormat(DependencyObject d, object value)
{
FormatConvertedBitmap bitmap = (FormatConvertedBitmap)d;
if (!bitmap._bitmapInit.IsInInit)
{
return bitmap._destinationFormat;
}
else
{
//
// If the client is trying to create a FormatConvertedBitmap with a
// DestinationFormat == PixelFormats.Default, then coerce it to either
// the Source bitmaps format (providing the Source bitmap is non-null)
// or the original DP value.
//
if (((PixelFormat)value).Format == PixelFormatEnum.Default)
{
if (bitmap.Source != null)
{
return bitmap.Source.Format;
}
else
{
return bitmap._destinationFormat;
}
}
else
{
return value;
}
}
}
///
/// Coerce DestinationPalette
///
private static object CoerceDestinationPalette(DependencyObject d, object value)
{
FormatConvertedBitmap bitmap = (FormatConvertedBitmap)d;
if (!bitmap._bitmapInit.IsInInit)
{
return bitmap._destinationPalette;
}
else
{
return value;
}
}
///
/// Coerce Transform
///
private static object CoerceAlphaThreshold(DependencyObject d, object value)
{
FormatConvertedBitmap bitmap = (FormatConvertedBitmap)d;
if (!bitmap._bitmapInit.IsInInit)
{
return bitmap._alphaThreshold;
}
else
{
return value;
}
}
#region Data Members
private BitmapSource _source;
private PixelFormat _destinationFormat;
private BitmapPalette _destinationPalette;
private double _alphaThreshold;
#endregion
}
#endregion // FormatConvertedBitmap
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DBAsyncResult.cs
- ArrayConverter.cs
- UnauthorizedWebPart.cs
- ListDictionaryInternal.cs
- CacheHelper.cs
- DataGridViewCellMouseEventArgs.cs
- StylusPlugin.cs
- ResourceLoader.cs
- HeaderCollection.cs
- PasswordBox.cs
- RuleSet.cs
- HashCodeCombiner.cs
- TypeBuilderInstantiation.cs
- SQLBytes.cs
- IBuiltInEvidence.cs
- AssemblyAttributes.cs
- GenericPrincipal.cs
- QueryLifecycle.cs
- SqlFacetAttribute.cs
- RegexInterpreter.cs
- AsnEncodedData.cs
- LocalValueEnumerator.cs
- ContextProperty.cs
- TableRowCollection.cs
- XhtmlStyleClass.cs
- ProxyWebPartManager.cs
- DescendantBaseQuery.cs
- GradientStop.cs
- FontSourceCollection.cs
- TextTreeTextNode.cs
- CheckBoxBaseAdapter.cs
- XmlTextAttribute.cs
- IncrementalReadDecoders.cs
- HttpCacheVary.cs
- TextEvent.cs
- WindowsTreeView.cs
- _NetworkingPerfCounters.cs
- SystemKeyConverter.cs
- SchemaSetCompiler.cs
- QilXmlWriter.cs
- DataTable.cs
- EndpointAddressAugust2004.cs
- ContainerFilterService.cs
- BindingMAnagerBase.cs
- XhtmlConformanceSection.cs
- RemotingException.cs
- GetReadStreamResult.cs
- ColumnReorderedEventArgs.cs
- SqlDuplicator.cs
- BaseProcessor.cs
- DefaultValueConverter.cs
- ToolStripMenuItemDesigner.cs
- ShutDownListener.cs
- InvalidStoreProtectionKeyException.cs
- EdgeModeValidation.cs
- CLSCompliantAttribute.cs
- XsltSettings.cs
- WindowVisualStateTracker.cs
- BuildManagerHost.cs
- PageThemeParser.cs
- VirtualPathProvider.cs
- BindUriHelper.cs
- TracedNativeMethods.cs
- HasCopySemanticsAttribute.cs
- odbcmetadatacollectionnames.cs
- ValidationErrorEventArgs.cs
- MatchAllMessageFilter.cs
- InvalidPrinterException.cs
- RegexCaptureCollection.cs
- HMACSHA1.cs
- DrawingAttributeSerializer.cs
- PrtTicket_Public_Simple.cs
- BasicCellRelation.cs
- EventManager.cs
- DuplicateWaitObjectException.cs
- FrameSecurityDescriptor.cs
- Table.cs
- DelayedRegex.cs
- FormsAuthenticationModule.cs
- StickyNoteContentControl.cs
- SelectionPatternIdentifiers.cs
- ObjectDataSourceEventArgs.cs
- ReadOnlyObservableCollection.cs
- PixelFormatConverter.cs
- Pens.cs
- BitmapCache.cs
- DetailsViewInsertEventArgs.cs
- DataGridViewEditingControlShowingEventArgs.cs
- FixedSchema.cs
- XmlFormatExtensionPrefixAttribute.cs
- SettingsBase.cs
- BaseProcessProtocolHandler.cs
- TabPanel.cs
- GridViewColumn.cs
- TransferRequestHandler.cs
- ReceiveDesigner.xaml.cs
- XmlCharCheckingWriter.cs
- BoundPropertyEntry.cs
- DispatcherOperation.cs
- oledbmetadatacolumnnames.cs