Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Misc / GDI / MeasurementDCInfo.cs / 1 / MeasurementDCInfo.cs
#if OPTIMIZED_MEASUREMENTDC #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 #if WINFORMS_PUBLIC_GRAPHICS_LIBRARY public #else internal #endif static class MeasurementDCInfo { /// MeasurementDCInfo /// This class optimizes the MeasurmentGraphics as it caches in the last used font and TextMargins used. /// This prevents unnecessary p/invoke calls to GetCurrentObject, etc /// It has been found to give close to 2x performance when drawing lots of text in rapid succession /// DataGridView with lots of text, etc. /// To turn it on for your DLL, use the OPTIMIZED_MEASUREMENTDC compiler switch and add this class to the sources. [ThreadStatic] private static CachedInfo cachedMeasurementDCInfo; /// IsMeasurementDC /// Returns whether the IDeviceContext passed in is our static MeasurementDC. /// If it is, we know a bit more information about it. internal static bool IsMeasurementDC(DeviceContext dc) { WindowsGraphics sharedGraphics = WindowsGraphicsCacheManager.GetCurrentMeasurementGraphics(); return sharedGraphics != null && sharedGraphics.DeviceContext != null && sharedGraphics.DeviceContext.Hdc == dc.Hdc; } /// LastUsedFont - /// Returns the font we think was last selected into the MeasurementGraphics. /// internal static WindowsFont LastUsedFont { get { return (cachedMeasurementDCInfo == null) ? null : cachedMeasurementDCInfo.LastUsedFont; } set { if (cachedMeasurementDCInfo == null) { cachedMeasurementDCInfo = new CachedInfo(); } cachedMeasurementDCInfo.UpdateFont(value); } } /// GetTextMargins - checks to see if we have cached information about the current font, /// returns info about it. /// An MRU of Font margins was considered, but seems like overhead. internal static IntNativeMethods.DRAWTEXTPARAMS GetTextMargins(WindowsGraphics wg, WindowsFont font) { // PERF: operate on a local reference rather than party directly on the thread static one. CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null && currentCachedInfo.LeftTextMargin >0 && currentCachedInfo.RightTextMargin >0 && font == currentCachedInfo.LastUsedFont) { // we have to return clones as DrawTextEx will modify this struct return new IntNativeMethods.DRAWTEXTPARAMS(currentCachedInfo.LeftTextMargin,currentCachedInfo.RightTextMargin); } else if (currentCachedInfo == null) { currentCachedInfo = new CachedInfo(); cachedMeasurementDCInfo = currentCachedInfo; } IntNativeMethods.DRAWTEXTPARAMS drawTextParams = wg.GetTextMargins(font); currentCachedInfo.LeftTextMargin = drawTextParams.iLeftMargin; currentCachedInfo.RightTextMargin = drawTextParams.iRightMargin; // returning a copy here to be consistent with the return value from the cache. return new IntNativeMethods.DRAWTEXTPARAMS(currentCachedInfo.LeftTextMargin,currentCachedInfo.RightTextMargin); } internal static void ResetIfIsMeasurementDC(IntPtr hdc) { WindowsGraphics sharedGraphics = WindowsGraphicsCacheManager.GetCurrentMeasurementGraphics(); if (sharedGraphics != null && sharedGraphics.DeviceContext != null && sharedGraphics.DeviceContext.Hdc == hdc) { CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null) { currentCachedInfo.UpdateFont(null); } } } /// Reset /// clear the current cached information about the measurement dc. internal static void Reset() { CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null) { currentCachedInfo.UpdateFont(null); } } /// CachedInfo /// store all the thread statics together so we dont have to fetch individual fields out of TLS private sealed class CachedInfo { public WindowsFont LastUsedFont; public int LeftTextMargin; public int RightTextMargin; internal void UpdateFont(WindowsFont font) { if (LastUsedFont != font) { LastUsedFont = font; LeftTextMargin = -1; RightTextMargin = -1; } } } } } #endif // OPTIMIZED_MEASUREMENTDC // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. #if OPTIMIZED_MEASUREMENTDC #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 #if WINFORMS_PUBLIC_GRAPHICS_LIBRARY public #else internal #endif static class MeasurementDCInfo { /// MeasurementDCInfo /// This class optimizes the MeasurmentGraphics as it caches in the last used font and TextMargins used. /// This prevents unnecessary p/invoke calls to GetCurrentObject, etc /// It has been found to give close to 2x performance when drawing lots of text in rapid succession /// DataGridView with lots of text, etc. /// To turn it on for your DLL, use the OPTIMIZED_MEASUREMENTDC compiler switch and add this class to the sources. [ThreadStatic] private static CachedInfo cachedMeasurementDCInfo; /// IsMeasurementDC /// Returns whether the IDeviceContext passed in is our static MeasurementDC. /// If it is, we know a bit more information about it. internal static bool IsMeasurementDC(DeviceContext dc) { WindowsGraphics sharedGraphics = WindowsGraphicsCacheManager.GetCurrentMeasurementGraphics(); return sharedGraphics != null && sharedGraphics.DeviceContext != null && sharedGraphics.DeviceContext.Hdc == dc.Hdc; } /// LastUsedFont - /// Returns the font we think was last selected into the MeasurementGraphics. /// internal static WindowsFont LastUsedFont { get { return (cachedMeasurementDCInfo == null) ? null : cachedMeasurementDCInfo.LastUsedFont; } set { if (cachedMeasurementDCInfo == null) { cachedMeasurementDCInfo = new CachedInfo(); } cachedMeasurementDCInfo.UpdateFont(value); } } /// GetTextMargins - checks to see if we have cached information about the current font, /// returns info about it. /// An MRU of Font margins was considered, but seems like overhead. internal static IntNativeMethods.DRAWTEXTPARAMS GetTextMargins(WindowsGraphics wg, WindowsFont font) { // PERF: operate on a local reference rather than party directly on the thread static one. CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null && currentCachedInfo.LeftTextMargin >0 && currentCachedInfo.RightTextMargin >0 && font == currentCachedInfo.LastUsedFont) { // we have to return clones as DrawTextEx will modify this struct return new IntNativeMethods.DRAWTEXTPARAMS(currentCachedInfo.LeftTextMargin,currentCachedInfo.RightTextMargin); } else if (currentCachedInfo == null) { currentCachedInfo = new CachedInfo(); cachedMeasurementDCInfo = currentCachedInfo; } IntNativeMethods.DRAWTEXTPARAMS drawTextParams = wg.GetTextMargins(font); currentCachedInfo.LeftTextMargin = drawTextParams.iLeftMargin; currentCachedInfo.RightTextMargin = drawTextParams.iRightMargin; // returning a copy here to be consistent with the return value from the cache. return new IntNativeMethods.DRAWTEXTPARAMS(currentCachedInfo.LeftTextMargin,currentCachedInfo.RightTextMargin); } internal static void ResetIfIsMeasurementDC(IntPtr hdc) { WindowsGraphics sharedGraphics = WindowsGraphicsCacheManager.GetCurrentMeasurementGraphics(); if (sharedGraphics != null && sharedGraphics.DeviceContext != null && sharedGraphics.DeviceContext.Hdc == hdc) { CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null) { currentCachedInfo.UpdateFont(null); } } } /// Reset /// clear the current cached information about the measurement dc. internal static void Reset() { CachedInfo currentCachedInfo = cachedMeasurementDCInfo; if (currentCachedInfo != null) { currentCachedInfo.UpdateFont(null); } } /// CachedInfo /// store all the thread statics together so we dont have to fetch individual fields out of TLS private sealed class CachedInfo { public WindowsFont LastUsedFont; public int LeftTextMargin; public int RightTextMargin; internal void UpdateFont(WindowsFont font) { if (LastUsedFont != font) { LastUsedFont = font; LeftTextMargin = -1; RightTextMargin = -1; } } } } } #endif // OPTIMIZED_MEASUREMENTDC // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PageHandlerFactory.cs
- LocationUpdates.cs
- SafeMILHandle.cs
- SmtpFailedRecipientsException.cs
- _DisconnectOverlappedAsyncResult.cs
- ComponentResourceKey.cs
- StatusBarDrawItemEvent.cs
- IPGlobalProperties.cs
- LinearQuaternionKeyFrame.cs
- ThreadAttributes.cs
- DoubleCollection.cs
- DateRangeEvent.cs
- StyleXamlParser.cs
- SoundPlayerAction.cs
- ByteStack.cs
- UnSafeCharBuffer.cs
- ThemeDirectoryCompiler.cs
- WindowsUpDown.cs
- ButtonFlatAdapter.cs
- RecognizeCompletedEventArgs.cs
- FamilyMap.cs
- IisNotInstalledException.cs
- UIPropertyMetadata.cs
- PeerResolverElement.cs
- HttpBrowserCapabilitiesWrapper.cs
- XPathDocumentBuilder.cs
- OperationAbortedException.cs
- LOSFormatter.cs
- pingexception.cs
- EditCommandColumn.cs
- SqlDataSourceCommandEventArgs.cs
- FileDialog_Vista_Interop.cs
- DelimitedListTraceListener.cs
- TextEndOfParagraph.cs
- UriTemplate.cs
- RSAOAEPKeyExchangeFormatter.cs
- Thread.cs
- SmtpNegotiateAuthenticationModule.cs
- WhitespaceRuleReader.cs
- TimeManager.cs
- DynamicValueConverter.cs
- WindowsFormsHostPropertyMap.cs
- infer.cs
- SmiMetaDataProperty.cs
- TabletDeviceInfo.cs
- CodeDOMProvider.cs
- CustomCategoryAttribute.cs
- InternalPolicyElement.cs
- CqlErrorHelper.cs
- GestureRecognitionResult.cs
- LongTypeConverter.cs
- BinarySerializer.cs
- DbException.cs
- FixedSchema.cs
- PeerConnector.cs
- DesignerGenericWebPart.cs
- NativeRightsManagementAPIsStructures.cs
- RestHandlerFactory.cs
- basecomparevalidator.cs
- XmlQueryContext.cs
- NativeRecognizer.cs
- KnownTypesProvider.cs
- Base64Encoder.cs
- CatalogPart.cs
- WebPartVerb.cs
- ContentHostHelper.cs
- PtsCache.cs
- CustomErrorsSectionWrapper.cs
- DataGridrowEditEndingEventArgs.cs
- Attributes.cs
- XmlObjectSerializerWriteContextComplexJson.cs
- CommonDialog.cs
- EnumConverter.cs
- SiteOfOriginPart.cs
- XmlDataLoader.cs
- ToolStripComboBox.cs
- SoundPlayer.cs
- VarRefManager.cs
- StickyNoteContentControl.cs
- BamlBinaryReader.cs
- FrameSecurityDescriptor.cs
- ComAdminWrapper.cs
- MessageFormatterConverter.cs
- BinaryParser.cs
- AuthenticationService.cs
- Rect3DConverter.cs
- PropertyTabAttribute.cs
- NestPullup.cs
- RootNamespaceAttribute.cs
- FlagPanel.cs
- DesignerActionUI.cs
- TextCollapsingProperties.cs
- UpdateManifestForBrowserApplication.cs
- MatrixTransform3D.cs
- DateTimeConverter.cs
- EditorZoneBase.cs
- PowerStatus.cs
- OrderedEnumerableRowCollection.cs
- GetChildSubtree.cs
- StringKeyFrameCollection.cs