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 / BitmapSourceSafeMILHandle.cs / 1 / BitmapSourceSafeMILHandle.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// A sub-class of SafeMILHandle that can estimate size for bitmap
// source objects.
//---------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Security;
using MS.Internal;
using MS.Win32;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media.Imaging
{
///
/// Constructor which computes size of the handle and delegates
/// to baseclass safe handle.
///
internal class BitmapSourceSafeMILHandle : SafeMILHandle
{
///
/// Critical - initializes critical static field (autogenerated ctor)
/// TreatAsSafe - sets them to the correct values, it's ok
///
[SecurityCritical, SecurityTreatAsSafe]
static BitmapSourceSafeMILHandle() { }
///
/// Use this constructor if the handle isn't ready yet and later
/// set the handle with SetHandle.
///
///
/// Critical: This derives from a class that has a link demand and inheritance demand
/// TreatAsSafe: Ok to call constructor
///
[SecurityCritical,SecurityTreatAsSafe]
internal BitmapSourceSafeMILHandle() : base()
{
}
///
/// Use this constructor if the handle exists at construction time.
/// SafeMILHandle owns the release of the parameter.
///
///
/// Critical: It is used to keep memory around
///
[SecurityCritical]
internal BitmapSourceSafeMILHandle(IntPtr handle) : base()
{
SetHandle(handle);
}
///
/// Calculate the rough size for this handle
///
///
/// Critical - access unmanaged code
/// TreatAsSafe - queries size of the bitmap, safe operation
///
/// Attributes are required for UnsafeNativeMethods.* calls
///
[SecurityCritical,SecurityTreatAsSafe]
internal void CalculateSize()
{
UpdateEstimatedSize(ComputeEstimatedSize(handle));
}
///
/// Compute a rough estimate of the size in bytes for the image
///
///
/// Critical - access unmanaged code and takes an IntPtr
///
[SecurityCritical]
private static long ComputeEstimatedSize(IntPtr bitmapObject)
{
long estimatedSize = 0;
if (bitmapObject != null && bitmapObject != IntPtr.Zero)
{
IntPtr wicBitmap;
//
// QueryInterface for the bitmap source to ensure we are
// calling through the right vtable on the pinvoke.
//
int hr = UnsafeNativeMethods.MILUnknown.QueryInterface(
bitmapObject,
ref _uuidBitmap,
out wicBitmap
);
if (hr == HRESULT.S_OK)
{
Debug.Assert(wicBitmap != IntPtr.Zero);
// The safe handle will release the ref added by the above QI
SafeMILHandle bitmapSourceSafeHandle = new SafeMILHandle(wicBitmap, 0);
uint pixelWidth = 0;
uint pixelHeight = 0;
hr = UnsafeNativeMethods.WICBitmapSource.GetSize(
bitmapSourceSafeHandle,
out pixelWidth,
out pixelHeight);
if (hr == HRESULT.S_OK)
{
Guid guidFormat;
hr = UnsafeNativeMethods.WICBitmapSource.GetPixelFormat(bitmapSourceSafeHandle, out guidFormat);
if (hr == HRESULT.S_OK)
{
//
// Go to long space to avoid overflow and check for overlfow
//
PixelFormat pixelFormat = new PixelFormat(guidFormat);
long scanlineSize = (long)pixelWidth * pixelFormat.InternalBitsPerPixel / 8;
//
// Check that scanlineSize is small enough that we can multiply by 2*pixelWidth
// without an overflow. Since pixelHeight is a 32-bit value and we multiply by 2*pixelHeight,
// then we can only have a 31-bit scanlineSize. Since we need a sign bit as well,
// we need to check that scanlineSize can fit in 30 bits.
//
if (scanlineSize < 0x40000000)
{
// We often duplicate the image bits in a managed texture or elsewhere, so
// estimate twice the natural size of the image.
estimatedSize = 2*pixelHeight*scanlineSize;
}
}
}
}
}
return estimatedSize;
}
///
/// Guid for IIDM_IMILBitmapSource
///
///
/// Critical - guid used for COM interop, need to be careful not to overwrite
///
[SecurityCritical]
private static Guid _uuidBitmap = MILGuidData.IID_IWICBitmap;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// A sub-class of SafeMILHandle that can estimate size for bitmap
// source objects.
//---------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Security;
using MS.Internal;
using MS.Win32;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media.Imaging
{
///
/// Constructor which computes size of the handle and delegates
/// to baseclass safe handle.
///
internal class BitmapSourceSafeMILHandle : SafeMILHandle
{
///
/// Critical - initializes critical static field (autogenerated ctor)
/// TreatAsSafe - sets them to the correct values, it's ok
///
[SecurityCritical, SecurityTreatAsSafe]
static BitmapSourceSafeMILHandle() { }
///
/// Use this constructor if the handle isn't ready yet and later
/// set the handle with SetHandle.
///
///
/// Critical: This derives from a class that has a link demand and inheritance demand
/// TreatAsSafe: Ok to call constructor
///
[SecurityCritical,SecurityTreatAsSafe]
internal BitmapSourceSafeMILHandle() : base()
{
}
///
/// Use this constructor if the handle exists at construction time.
/// SafeMILHandle owns the release of the parameter.
///
///
/// Critical: It is used to keep memory around
///
[SecurityCritical]
internal BitmapSourceSafeMILHandle(IntPtr handle) : base()
{
SetHandle(handle);
}
///
/// Calculate the rough size for this handle
///
///
/// Critical - access unmanaged code
/// TreatAsSafe - queries size of the bitmap, safe operation
///
/// Attributes are required for UnsafeNativeMethods.* calls
///
[SecurityCritical,SecurityTreatAsSafe]
internal void CalculateSize()
{
UpdateEstimatedSize(ComputeEstimatedSize(handle));
}
///
/// Compute a rough estimate of the size in bytes for the image
///
///
/// Critical - access unmanaged code and takes an IntPtr
///
[SecurityCritical]
private static long ComputeEstimatedSize(IntPtr bitmapObject)
{
long estimatedSize = 0;
if (bitmapObject != null && bitmapObject != IntPtr.Zero)
{
IntPtr wicBitmap;
//
// QueryInterface for the bitmap source to ensure we are
// calling through the right vtable on the pinvoke.
//
int hr = UnsafeNativeMethods.MILUnknown.QueryInterface(
bitmapObject,
ref _uuidBitmap,
out wicBitmap
);
if (hr == HRESULT.S_OK)
{
Debug.Assert(wicBitmap != IntPtr.Zero);
// The safe handle will release the ref added by the above QI
SafeMILHandle bitmapSourceSafeHandle = new SafeMILHandle(wicBitmap, 0);
uint pixelWidth = 0;
uint pixelHeight = 0;
hr = UnsafeNativeMethods.WICBitmapSource.GetSize(
bitmapSourceSafeHandle,
out pixelWidth,
out pixelHeight);
if (hr == HRESULT.S_OK)
{
Guid guidFormat;
hr = UnsafeNativeMethods.WICBitmapSource.GetPixelFormat(bitmapSourceSafeHandle, out guidFormat);
if (hr == HRESULT.S_OK)
{
//
// Go to long space to avoid overflow and check for overlfow
//
PixelFormat pixelFormat = new PixelFormat(guidFormat);
long scanlineSize = (long)pixelWidth * pixelFormat.InternalBitsPerPixel / 8;
//
// Check that scanlineSize is small enough that we can multiply by 2*pixelWidth
// without an overflow. Since pixelHeight is a 32-bit value and we multiply by 2*pixelHeight,
// then we can only have a 31-bit scanlineSize. Since we need a sign bit as well,
// we need to check that scanlineSize can fit in 30 bits.
//
if (scanlineSize < 0x40000000)
{
// We often duplicate the image bits in a managed texture or elsewhere, so
// estimate twice the natural size of the image.
estimatedSize = 2*pixelHeight*scanlineSize;
}
}
}
}
}
return estimatedSize;
}
///
/// Guid for IIDM_IMILBitmapSource
///
///
/// Critical - guid used for COM interop, need to be careful not to overwrite
///
[SecurityCritical]
private static Guid _uuidBitmap = MILGuidData.IID_IWICBitmap;
}
}
// 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
- WebPartEditorCancelVerb.cs
- XmlBinaryReader.cs
- MexBindingElement.cs
- UpdatePanelTrigger.cs
- XamlBrushSerializer.cs
- PowerModeChangedEventArgs.cs
- ClickablePoint.cs
- DataGridCell.cs
- HtmlTable.cs
- DesignerPerfEventProvider.cs
- FreezableOperations.cs
- XmlReturnWriter.cs
- AuthenticationManager.cs
- AdornerDecorator.cs
- StrokeIntersection.cs
- WeakReferenceEnumerator.cs
- AuthenticationException.cs
- KeyValuePair.cs
- SpeechSynthesizer.cs
- MarkerProperties.cs
- ProfileModule.cs
- HttpDebugHandler.cs
- SerializationInfoEnumerator.cs
- FormsAuthenticationTicket.cs
- ObjectItemNoOpAssemblyLoader.cs
- ServiceModelEnumValidator.cs
- SqlDataSourceView.cs
- TypeSystem.cs
- SettingsAttributeDictionary.cs
- NonBatchDirectoryCompiler.cs
- Parser.cs
- OleDbDataReader.cs
- MetadataItemEmitter.cs
- __Filters.cs
- Misc.cs
- BufferedReadStream.cs
- HandlerWithFactory.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- RC2CryptoServiceProvider.cs
- Sql8ConformanceChecker.cs
- _WinHttpWebProxyDataBuilder.cs
- ColumnWidthChangingEvent.cs
- HiddenFieldDesigner.cs
- TextServicesDisplayAttribute.cs
- VirtualPathData.cs
- ColorDialog.cs
- SocketElement.cs
- HierarchicalDataBoundControlAdapter.cs
- DataGridAddNewRow.cs
- QuaternionRotation3D.cs
- APCustomTypeDescriptor.cs
- SqlMethods.cs
- Metadata.cs
- XmlElementList.cs
- DependentTransaction.cs
- remotingproxy.cs
- SRDisplayNameAttribute.cs
- UnSafeCharBuffer.cs
- DataGridRowHeaderAutomationPeer.cs
- Fonts.cs
- PriorityQueue.cs
- TextBoxBase.cs
- XmlEventCache.cs
- TargetConverter.cs
- EventsTab.cs
- COM2ColorConverter.cs
- CommonServiceBehaviorElement.cs
- XPathQueryGenerator.cs
- DbProviderFactoriesConfigurationHandler.cs
- TransformValueSerializer.cs
- DataSourceSelectArguments.cs
- FormViewInsertedEventArgs.cs
- WebPartDescription.cs
- TextServicesManager.cs
- DefaultPrintController.cs
- sqlinternaltransaction.cs
- DescendantOverDescendantQuery.cs
- ProcessInfo.cs
- SharedPerformanceCounter.cs
- CrossAppDomainChannel.cs
- StringToken.cs
- SamlAuthenticationStatement.cs
- ResolveNextArgumentWorkItem.cs
- ServerIdentity.cs
- AppSecurityManager.cs
- GenericEnumerator.cs
- MessageSecurityOverTcpElement.cs
- KeyFrames.cs
- Bitmap.cs
- HttpProfileGroupBase.cs
- MethodExpr.cs
- BinaryObjectWriter.cs
- TreeViewHitTestInfo.cs
- KeyBinding.cs
- RegexBoyerMoore.cs
- ColumnReorderedEventArgs.cs
- StateManagedCollection.cs
- _AutoWebProxyScriptHelper.cs
- SoapFault.cs
- newinstructionaction.cs