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
- Double.cs
- InvalidPrinterException.cs
- SqlDelegatedTransaction.cs
- SafeFileMappingHandle.cs
- PersonalizationStateQuery.cs
- WebPartConnectionsCancelEventArgs.cs
- Script.cs
- ArrayTypeMismatchException.cs
- ColorConvertedBitmap.cs
- CommonGetThemePartSize.cs
- LoginNameDesigner.cs
- PositiveTimeSpanValidator.cs
- OutputCacheSection.cs
- keycontainerpermission.cs
- SynchronizedCollection.cs
- NonValidatingSecurityTokenAuthenticator.cs
- PropertyExpression.cs
- RectangleHotSpot.cs
- _AuthenticationState.cs
- EditorBrowsableAttribute.cs
- QueryOperationResponseOfT.cs
- IntegerCollectionEditor.cs
- Crypto.cs
- ThreadExceptionEvent.cs
- Int16Animation.cs
- DurableMessageDispatchInspector.cs
- ScriptingJsonSerializationSection.cs
- ContextMenu.cs
- FileDialog_Vista_Interop.cs
- PrivateFontCollection.cs
- XmlNode.cs
- MonthChangedEventArgs.cs
- XmlAttributeCollection.cs
- ToolboxItemImageConverter.cs
- CustomTrackingRecord.cs
- ListViewHitTestInfo.cs
- FamilyCollection.cs
- LeftCellWrapper.cs
- HwndSource.cs
- CompiledRegexRunnerFactory.cs
- QuaternionConverter.cs
- StyleXamlTreeBuilder.cs
- DbParameterHelper.cs
- X509SecurityTokenProvider.cs
- InputLangChangeRequestEvent.cs
- PropertyValueUIItem.cs
- CatalogPart.cs
- DrawingContextWalker.cs
- ExpressionTextBox.xaml.cs
- ScriptDescriptor.cs
- SortFieldComparer.cs
- WebContentFormatHelper.cs
- PrintDialog.cs
- BitmapEffectDrawing.cs
- ProtocolViolationException.cs
- GridViewEditEventArgs.cs
- WarningException.cs
- HasCopySemanticsAttribute.cs
- ExpressionVisitorHelpers.cs
- DetailsViewInsertedEventArgs.cs
- SiteMapNodeItem.cs
- AndCondition.cs
- WorkflowInstanceAbortedRecord.cs
- EventLogPermissionAttribute.cs
- ColumnTypeConverter.cs
- SecureEnvironment.cs
- MemberHolder.cs
- CodeExpressionRuleDeclaration.cs
- PathSegment.cs
- DataGridViewTopLeftHeaderCell.cs
- XmlChildNodes.cs
- DependencyObject.cs
- StylusLogic.cs
- WindowsGraphicsWrapper.cs
- SafeRightsManagementHandle.cs
- OracleFactory.cs
- CommandEventArgs.cs
- ManifestResourceInfo.cs
- HotSpotCollection.cs
- IndentedTextWriter.cs
- Equal.cs
- FilterQuery.cs
- ApplicationInterop.cs
- SafeMemoryMappedFileHandle.cs
- SqlTypesSchemaImporter.cs
- SqlXmlStorage.cs
- MultiDataTrigger.cs
- IncrementalHitTester.cs
- ComponentChangedEvent.cs
- WebPartConnectionsConnectVerb.cs
- mediaclock.cs
- GreaterThanOrEqual.cs
- ReceiveMessageRecord.cs
- XmlCountingReader.cs
- CodeTypeDeclaration.cs
- XslCompiledTransform.cs
- _FixedSizeReader.cs
- IDReferencePropertyAttribute.cs
- InputLanguage.cs
- MailHeaderInfo.cs