DeviceContexts.cs source code in C# .NET

Source code for the .NET framework in C#

                        

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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK