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
- XmlException.cs
- TimeSpanConverter.cs
- InputEventArgs.cs
- BezierSegment.cs
- TextHidden.cs
- SelfIssuedAuthAsymmetricKey.cs
- DataGridCellClipboardEventArgs.cs
- NameScope.cs
- RegexCaptureCollection.cs
- FlowDocumentPageViewerAutomationPeer.cs
- MessagingDescriptionAttribute.cs
- shaperfactoryquerycacheentry.cs
- Zone.cs
- QilTernary.cs
- ListViewContainer.cs
- ZipIOLocalFileBlock.cs
- MemberJoinTreeNode.cs
- XmlDocumentFragment.cs
- tabpagecollectioneditor.cs
- HwndMouseInputProvider.cs
- RegexParser.cs
- ComPlusContractBehavior.cs
- LiteralSubsegment.cs
- BaseUriHelper.cs
- HandleTable.cs
- WhereaboutsReader.cs
- CreateUserErrorEventArgs.cs
- ConstraintConverter.cs
- IOException.cs
- ListViewItemSelectionChangedEvent.cs
- securestring.cs
- HandledMouseEvent.cs
- ServicesUtilities.cs
- TreeNodeClickEventArgs.cs
- HttpWebRequestElement.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- InternalRelationshipCollection.cs
- LineMetrics.cs
- DataGridHeaderBorder.cs
- DataListGeneralPage.cs
- ClientBuildManager.cs
- SqlMethods.cs
- QuadraticBezierSegment.cs
- ILGen.cs
- DrawingCollection.cs
- XmlNodeChangedEventArgs.cs
- EntityDataSourceDesigner.cs
- SelectedGridItemChangedEvent.cs
- OrderPreservingPipeliningMergeHelper.cs
- FileLevelControlBuilderAttribute.cs
- Application.cs
- AuditLogLocation.cs
- oledbmetadatacolumnnames.cs
- WpfPayload.cs
- ComponentDispatcherThread.cs
- SocketException.cs
- FrameworkContextData.cs
- UiaCoreApi.cs
- BackEase.cs
- EntityViewContainer.cs
- PartialList.cs
- XmlRootAttribute.cs
- TemplateGroupCollection.cs
- ApplicationManager.cs
- Pts.cs
- ExpressionBuilder.cs
- HttpResponse.cs
- SourceInterpreter.cs
- ConnectionsZone.cs
- NegotiateStream.cs
- IgnoreSectionHandler.cs
- ServiceReflector.cs
- SecurityKeyIdentifierClause.cs
- PropertyPushdownHelper.cs
- ServiceHttpModule.cs
- MaskedTextBox.cs
- HitTestParameters3D.cs
- CodeSnippetCompileUnit.cs
- DeploymentSection.cs
- CodeExporter.cs
- RemoveStoryboard.cs
- DependsOnAttribute.cs
- PackageDocument.cs
- TemplateControl.cs
- WebPartCancelEventArgs.cs
- InvokePatternIdentifiers.cs
- HierarchicalDataTemplate.cs
- controlskin.cs
- securitymgrsite.cs
- MachineKeyValidationConverter.cs
- RecognizedWordUnit.cs
- TreeNodeCollectionEditorDialog.cs
- XmlSchemaElement.cs
- FileEnumerator.cs
- BasicBrowserDialog.designer.cs
- CommunicationException.cs
- querybuilder.cs
- BindingBase.cs
- GeometryGroup.cs
- X509CertificateValidationMode.cs