Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Misc / GDI / DeviceContexts.cs / 1305376 / 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 [....]_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 [....]_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 [....]_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 [....]_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
- InfoCardSymmetricAlgorithm.cs
- FastPropertyAccessor.cs
- StorageEndPropertyMapping.cs
- Variant.cs
- BrushMappingModeValidation.cs
- RectConverter.cs
- ToolStripHighContrastRenderer.cs
- SoapClientMessage.cs
- UserNameServiceElement.cs
- SqlFacetAttribute.cs
- ElementMarkupObject.cs
- SqlTypeSystemProvider.cs
- DataException.cs
- ToolBar.cs
- UmAlQuraCalendar.cs
- CustomError.cs
- invalidudtexception.cs
- AppSettingsReader.cs
- ExpressionBinding.cs
- SByteConverter.cs
- XmlQueryContext.cs
- ValueType.cs
- XmlConvert.cs
- XsltContext.cs
- DbModificationCommandTree.cs
- MarkedHighlightComponent.cs
- UInt32Storage.cs
- CompilerError.cs
- EntityTypeEmitter.cs
- WebPartDisplayMode.cs
- RegularExpressionValidator.cs
- HwndPanningFeedback.cs
- CharStorage.cs
- OutputCache.cs
- StylusButton.cs
- MessageHeader.cs
- Point.cs
- DataServiceHostFactory.cs
- DataRelationCollection.cs
- CacheHelper.cs
- TextAction.cs
- ActivityExecutorDelegateInfo.cs
- AmbientLight.cs
- Preprocessor.cs
- SystemTcpStatistics.cs
- RoutedEventArgs.cs
- SizeAnimationUsingKeyFrames.cs
- DesignerLabelAdapter.cs
- SR.cs
- BitmapEffectInputData.cs
- SystemTcpStatistics.cs
- FamilyCollection.cs
- ObjectItemCollection.cs
- IisTraceListener.cs
- WebBrowserNavigatingEventHandler.cs
- DataGridComboBoxColumn.cs
- ImmComposition.cs
- ProjectionNode.cs
- IDReferencePropertyAttribute.cs
- VisualStateManager.cs
- BinaryFormatterWriter.cs
- InfocardChannelParameter.cs
- GradientSpreadMethodValidation.cs
- WpfGeneratedKnownTypes.cs
- ScriptResourceAttribute.cs
- SafePEFileHandle.cs
- FtpWebResponse.cs
- MethodImplAttribute.cs
- ProcessHostFactoryHelper.cs
- DataMember.cs
- IListConverters.cs
- WindowsListBox.cs
- ScrollContentPresenter.cs
- GraphicsState.cs
- HttpProtocolImporter.cs
- SapiAttributeParser.cs
- XmlIgnoreAttribute.cs
- GridViewDeleteEventArgs.cs
- ScopelessEnumAttribute.cs
- ScriptingWebServicesSectionGroup.cs
- Odbc32.cs
- DiscoveryServerProtocol.cs
- PageAsyncTaskManager.cs
- PcmConverter.cs
- PassportAuthentication.cs
- ButtonChrome.cs
- NotifyCollectionChangedEventArgs.cs
- UnsafeNetInfoNativeMethods.cs
- TextBoxView.cs
- SqlVisitor.cs
- DependencyPropertyChangedEventArgs.cs
- LinkDesigner.cs
- ScriptServiceAttribute.cs
- Ops.cs
- XmlComplianceUtil.cs
- SmtpReplyReaderFactory.cs
- ListenerConnectionDemuxer.cs
- CompressEmulationStream.cs
- WindowsAuthenticationEventArgs.cs
- DurableTimerExtension.cs