Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Misc / GDI / DeviceContexts.cs / 5 / DeviceContexts.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
#if WGCM_TEST_SUITE // Enable tracking when built for the test suites.
#define TRACK_HDC
#define GDI_FONT_CACHE_TRACK
#endif
#if WINFORMS_NAMESPACE
namespace System.Windows.Forms.Internal
#elif DRAWING_NAMESPACE
namespace System.Drawing.Internal
#else
namespace System.Experimental.Gdi
#endif
{
using System;
using System.Collections.Generic;
using System.Internal;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using Microsoft.Win32;
///
/// Keeps a cache of some graphics primitives.
/// Created to improve performance of TextRenderer.MeasureText methods that don't receive a WindowsGraphics.
/// This class mantains a cache of MRU WindowsFont objects in the process. (See VSWhidbey#301492).
///
#if WINFORMS_PUBLIC_GRAPHICS_LIBRARY
public
#else
internal
#endif
static class DeviceContexts
{
[ThreadStatic]
private static ClientUtils.WeakRefCollection activeDeviceContexts;
///
/// WindowsGraphicsCacheManager needs to track DeviceContext
/// objects so it can ask them if a font is in use before they
/// it's deleted.
internal static void AddDeviceContext(DeviceContext dc) {
if (activeDeviceContexts == null) {
activeDeviceContexts = new ClientUtils.WeakRefCollection();
activeDeviceContexts.RefCheckThreshold = 20; // See DevDiv#82664 (the repro app attached to this bug was used to determine this number).
}
if (!activeDeviceContexts.Contains(dc)) {
dc.Disposing += new EventHandler(OnDcDisposing);
activeDeviceContexts.Add(dc);
}
}
private static void OnDcDisposing(object sender, EventArgs e)
{
DeviceContext dc = sender as DeviceContext;
if (dc != null)
{
dc.Disposing -= new EventHandler(OnDcDisposing);
RemoveDeviceContext(dc);
}
}
internal static void RemoveDeviceContext(DeviceContext dc) {
if (activeDeviceContexts == null) {
return;
}
activeDeviceContexts.RemoveByHashCode(dc);
}
#if !DRAWING_NAMESPACE
internal static bool IsFontInUse(WindowsFont wf) {
if (wf == null) {
return false;
}
for (int i = 0; i < activeDeviceContexts.Count; i++) {
DeviceContext dc = activeDeviceContexts[i] as DeviceContext;
if (dc != null && (dc.ActiveFont == wf || dc.IsFontOnContextStack(wf))) {
return true;
}
}
return false;
}
#endif
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
#if WGCM_TEST_SUITE // Enable tracking when built for the test suites.
#define TRACK_HDC
#define GDI_FONT_CACHE_TRACK
#endif
#if WINFORMS_NAMESPACE
namespace System.Windows.Forms.Internal
#elif DRAWING_NAMESPACE
namespace System.Drawing.Internal
#else
namespace System.Experimental.Gdi
#endif
{
using System;
using System.Collections.Generic;
using System.Internal;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using Microsoft.Win32;
///
/// Keeps a cache of some graphics primitives.
/// Created to improve performance of TextRenderer.MeasureText methods that don't receive a WindowsGraphics.
/// This class mantains a cache of MRU WindowsFont objects in the process. (See VSWhidbey#301492).
///
#if WINFORMS_PUBLIC_GRAPHICS_LIBRARY
public
#else
internal
#endif
static class DeviceContexts
{
[ThreadStatic]
private static ClientUtils.WeakRefCollection activeDeviceContexts;
///
/// WindowsGraphicsCacheManager needs to track DeviceContext
/// objects so it can ask them if a font is in use before they
/// it's deleted.
internal static void AddDeviceContext(DeviceContext dc) {
if (activeDeviceContexts == null) {
activeDeviceContexts = new ClientUtils.WeakRefCollection();
activeDeviceContexts.RefCheckThreshold = 20; // See DevDiv#82664 (the repro app attached to this bug was used to determine this number).
}
if (!activeDeviceContexts.Contains(dc)) {
dc.Disposing += new EventHandler(OnDcDisposing);
activeDeviceContexts.Add(dc);
}
}
private static void OnDcDisposing(object sender, EventArgs e)
{
DeviceContext dc = sender as DeviceContext;
if (dc != null)
{
dc.Disposing -= new EventHandler(OnDcDisposing);
RemoveDeviceContext(dc);
}
}
internal static void RemoveDeviceContext(DeviceContext dc) {
if (activeDeviceContexts == null) {
return;
}
activeDeviceContexts.RemoveByHashCode(dc);
}
#if !DRAWING_NAMESPACE
internal static bool IsFontInUse(WindowsFont wf) {
if (wf == null) {
return false;
}
for (int i = 0; i < activeDeviceContexts.Count; i++) {
DeviceContext dc = activeDeviceContexts[i] as DeviceContext;
if (dc != null && (dc.ActiveFont == wf || dc.IsFontOnContextStack(wf))) {
return true;
}
}
return false;
}
#endif
}
}
// 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
- ResourcesBuildProvider.cs
- MemberDescriptor.cs
- SafeArrayRankMismatchException.cs
- SchemaNotation.cs
- DependencyStoreSurrogate.cs
- RSAOAEPKeyExchangeDeformatter.cs
- ListenDesigner.cs
- Span.cs
- CacheSection.cs
- SafeSystemMetrics.cs
- BufferedReceiveElement.cs
- DocumentXPathNavigator.cs
- ListViewUpdateEventArgs.cs
- UIAgentMonitor.cs
- StreamInfo.cs
- FormsAuthentication.cs
- Double.cs
- DeferredBinaryDeserializerExtension.cs
- serverconfig.cs
- KeyEventArgs.cs
- sqlmetadatafactory.cs
- GroupLabel.cs
- TreeNodeBindingCollection.cs
- StrongName.cs
- XmlUTF8TextWriter.cs
- StateMachineHistory.cs
- BmpBitmapEncoder.cs
- ExpressionBuilderCollection.cs
- UInt64Converter.cs
- FormViewUpdatedEventArgs.cs
- FragmentNavigationEventArgs.cs
- ColumnHeaderConverter.cs
- InvokeSchedule.cs
- RemoteWebConfigurationHost.cs
- SapiRecoContext.cs
- documentsequencetextview.cs
- TablePatternIdentifiers.cs
- ApplicationManager.cs
- DesignerTransaction.cs
- UnsafeNativeMethods.cs
- Triangle.cs
- SQLMoney.cs
- BitmapEffect.cs
- WindowsClientCredential.cs
- ByteAnimationUsingKeyFrames.cs
- RelationalExpressions.cs
- CodeAttributeArgumentCollection.cs
- SafeRightsManagementHandle.cs
- Point3DCollection.cs
- CodeNamespaceImportCollection.cs
- AnimationClockResource.cs
- QilXmlReader.cs
- SafeRightsManagementHandle.cs
- _ShellExpression.cs
- IsolatedStorageFilePermission.cs
- WindowsToolbar.cs
- StringAttributeCollection.cs
- EncryptedData.cs
- SettingsPropertyCollection.cs
- HostElement.cs
- BufferedGraphicsManager.cs
- ToolboxBitmapAttribute.cs
- ObservableDictionary.cs
- Propagator.cs
- CorePropertiesFilter.cs
- PassportAuthenticationModule.cs
- SplayTreeNode.cs
- IntSecurity.cs
- Accessible.cs
- propertyentry.cs
- FirstMatchCodeGroup.cs
- DetailsViewUpdatedEventArgs.cs
- localization.cs
- SafeLocalAllocation.cs
- BamlResourceSerializer.cs
- GridSplitterAutomationPeer.cs
- StatusBarPanel.cs
- ButtonBaseAdapter.cs
- RegexReplacement.cs
- RemoteWebConfigurationHost.cs
- ViewCellSlot.cs
- XmlSchemaSequence.cs
- thaishape.cs
- PageContent.cs
- ExpandCollapseProviderWrapper.cs
- SortDescriptionCollection.cs
- FixedStringLookup.cs
- URI.cs
- TreeIterators.cs
- NegotiateStream.cs
- DesignUtil.cs
- NullRuntimeConfig.cs
- PreDigestedSignedInfo.cs
- EmptyElement.cs
- SchemaConstraints.cs
- MemoryRecordBuffer.cs
- MailDefinition.cs
- COM2EnumConverter.cs
- __Error.cs
- XmlSchemaAnnotation.cs