Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / Misc / GDI / DeviceContexts.cs / 1 / 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
- SqlMethodTransformer.cs
- AssertFilter.cs
- ProcessModule.cs
- SocketInformation.cs
- AmbientValueAttribute.cs
- XamlSerializationHelper.cs
- SimpleModelProvider.cs
- SynchronizedDispatch.cs
- ClientScriptManager.cs
- EventSetterHandlerConverter.cs
- WebPartVerbsEventArgs.cs
- Events.cs
- UnsafeNativeMethods.cs
- TextBoxBase.cs
- TimerEventSubscription.cs
- XmlDocumentType.cs
- IISUnsafeMethods.cs
- SystemFonts.cs
- Dump.cs
- ActivityInstance.cs
- Highlights.cs
- InitializationEventAttribute.cs
- PointAnimationBase.cs
- WmlListAdapter.cs
- ResourceContainer.cs
- XmlException.cs
- DataServiceKeyAttribute.cs
- Identity.cs
- WhitespaceRuleReader.cs
- Link.cs
- XmlUTF8TextWriter.cs
- X509UI.cs
- FunctionQuery.cs
- ProcessProtocolHandler.cs
- TreeViewDesigner.cs
- QuinticEase.cs
- WebEventCodes.cs
- Package.cs
- Source.cs
- HelpProvider.cs
- ObjectDataSource.cs
- ConfigurationManager.cs
- RegexReplacement.cs
- SafeProcessHandle.cs
- DesignSurfaceEvent.cs
- DynamicActivityXamlReader.cs
- HMACSHA1.cs
- ThicknessAnimation.cs
- ReadContentAsBinaryHelper.cs
- ToolStripItemCollection.cs
- GridViewEditEventArgs.cs
- RuleSettings.cs
- IEnumerable.cs
- HeaderUtility.cs
- GeometryCollection.cs
- UTF32Encoding.cs
- DataBinder.cs
- OutputCacheProfile.cs
- FreeFormDesigner.cs
- HandlerBase.cs
- DynamicDataRouteHandler.cs
- EdgeModeValidation.cs
- FlowPosition.cs
- Assert.cs
- PassportPrincipal.cs
- ViewLoader.cs
- EventLogPermissionEntry.cs
- ResourceReferenceExpression.cs
- ListView.cs
- BinaryUtilClasses.cs
- DataObject.cs
- UpdateCommand.cs
- _CacheStreams.cs
- KeyPullup.cs
- DataControlLinkButton.cs
- SmtpDigestAuthenticationModule.cs
- DesignerAutoFormatStyle.cs
- PersistenceProvider.cs
- QueryCacheKey.cs
- OutputCacheModule.cs
- NumberEdit.cs
- SqlRowUpdatingEvent.cs
- MatrixCamera.cs
- _NestedMultipleAsyncResult.cs
- BooleanAnimationUsingKeyFrames.cs
- FontCacheLogic.cs
- HttpTransportBindingElement.cs
- Stacktrace.cs
- WebFaultClientMessageInspector.cs
- PathSegmentCollection.cs
- WebPartMovingEventArgs.cs
- SelectionProcessor.cs
- QuaternionIndependentAnimationStorage.cs
- ObjectDataSourceDisposingEventArgs.cs
- FormsAuthenticationConfiguration.cs
- NTAccount.cs
- TopClause.cs
- InstanceOwnerQueryResult.cs
- InkCanvasAutomationPeer.cs
- InputScopeManager.cs