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
- OutputCacheSection.cs
- OleDbRowUpdatedEvent.cs
- Pens.cs
- HybridWebProxyFinder.cs
- ToolStripDesigner.cs
- DtcInterfaces.cs
- DropDownList.cs
- MenuItemBindingCollection.cs
- DbConnectionPoolGroup.cs
- RelationshipEnd.cs
- ResetableIterator.cs
- ReadOnlyActivityGlyph.cs
- EventLogPermission.cs
- Int16KeyFrameCollection.cs
- OAVariantLib.cs
- EventLevel.cs
- Compiler.cs
- CacheMode.cs
- PointAnimationUsingKeyFrames.cs
- WebBrowserBase.cs
- NumberFormatInfo.cs
- UpDownBase.cs
- SizeAnimationBase.cs
- PathData.cs
- Tuple.cs
- UnSafeCharBuffer.cs
- AdditionalEntityFunctions.cs
- FindCriteria11.cs
- SizeConverter.cs
- InkCanvasSelectionAdorner.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- ObjectDataSourceView.cs
- SQLBytes.cs
- CommonProperties.cs
- SEHException.cs
- MembershipUser.cs
- Int64.cs
- DecoderFallback.cs
- Oci.cs
- CachedFontFace.cs
- PropertyChangedEventArgs.cs
- XmlDocumentFragment.cs
- WmlCalendarAdapter.cs
- XamlStream.cs
- PasswordValidationException.cs
- ExpressionCopier.cs
- InkPresenterAutomationPeer.cs
- BitSet.cs
- ImplicitInputBrush.cs
- EmptyControlCollection.cs
- SizeChangedEventArgs.cs
- TreeViewItemAutomationPeer.cs
- LicenseManager.cs
- RowToFieldTransformer.cs
- XmlWellformedWriter.cs
- baseaxisquery.cs
- Convert.cs
- DefaultPrintController.cs
- BitmapEffectGeneralTransform.cs
- BamlResourceContent.cs
- Enum.cs
- SqlDataSourceCommandEventArgs.cs
- oledbmetadatacolumnnames.cs
- PageFunction.cs
- Win32.cs
- SoapObjectInfo.cs
- MetadataHelper.cs
- ProfileSettingsCollection.cs
- XmlTextAttribute.cs
- SecurityState.cs
- Point.cs
- SerializationStore.cs
- ConnectionPoint.cs
- ProtocolProfile.cs
- Vector3DCollectionValueSerializer.cs
- ObjectParameter.cs
- ImmutableClientRuntime.cs
- BaseDataList.cs
- IdentityHolder.cs
- RelationshipDetailsRow.cs
- ObjectComplexPropertyMapping.cs
- TextSearch.cs
- Query.cs
- FormViewUpdateEventArgs.cs
- SystemTcpStatistics.cs
- ConstraintManager.cs
- UIElementHelper.cs
- ForwardPositionQuery.cs
- IndicShape.cs
- PassportIdentity.cs
- ExpressionCopier.cs
- ThemeableAttribute.cs
- RowToParametersTransformer.cs
- DesignerWebPartChrome.cs
- Array.cs
- ProcessModelSection.cs
- SettingsPropertyWrongTypeException.cs
- AuthenticationConfig.cs
- ArglessEventHandlerProxy.cs
- TabPage.cs