Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ContractUtils.cs
- TrustLevelCollection.cs
- IChannel.cs
- FontSizeConverter.cs
- ConstraintManager.cs
- XmlHierarchicalDataSourceView.cs
- EntityDataSourceValidationException.cs
- FileSecurity.cs
- RegexCaptureCollection.cs
- KerberosSecurityTokenProvider.cs
- WebAdminConfigurationHelper.cs
- DataFormat.cs
- AssemblyAttributes.cs
- FixedSOMTable.cs
- HtmlButton.cs
- CDSsyncETWBCLProvider.cs
- OrderedDictionaryStateHelper.cs
- Camera.cs
- TypefaceMap.cs
- SmiEventSink.cs
- XPathAncestorIterator.cs
- RelationshipDetailsRow.cs
- WebPartAuthorizationEventArgs.cs
- TypefaceMap.cs
- CodeDOMUtility.cs
- DispatcherExceptionEventArgs.cs
- DrawTreeNodeEventArgs.cs
- ActivationServices.cs
- CapabilitiesPattern.cs
- HostedImpersonationContext.cs
- EndpointAddressProcessor.cs
- NativeCompoundFileAPIs.cs
- TextRange.cs
- HitTestParameters3D.cs
- PathFigureCollection.cs
- Error.cs
- DateTimeUtil.cs
- PriorityBinding.cs
- MemoryFailPoint.cs
- XmlAutoDetectWriter.cs
- Context.cs
- TimeoutException.cs
- Attributes.cs
- TypeBuilder.cs
- TemplateLookupAction.cs
- DurableEnlistmentState.cs
- CapabilitiesState.cs
- XmlQueryStaticData.cs
- ExecutedRoutedEventArgs.cs
- DashStyle.cs
- NavigationFailedEventArgs.cs
- XPathMultyIterator.cs
- UrlMappingsSection.cs
- PnrpPermission.cs
- FileLogRecordStream.cs
- RIPEMD160.cs
- ViewCellSlot.cs
- PenLineCapValidation.cs
- WebBrowser.cs
- RangeValidator.cs
- ConfigViewGenerator.cs
- RedistVersionInfo.cs
- MetadataArtifactLoaderFile.cs
- CalloutQueueItem.cs
- Window.cs
- ListBoxAutomationPeer.cs
- DataTableReader.cs
- SuppressMessageAttribute.cs
- ListControl.cs
- TaskFormBase.cs
- StandardCommandToolStripMenuItem.cs
- FilterException.cs
- ListBoxItem.cs
- FixedSOMTextRun.cs
- TextChangedEventArgs.cs
- PropertyRecord.cs
- DeflateStream.cs
- EmptyEnumerator.cs
- StrictModeSecurityHeaderElementInferenceEngine.cs
- ScriptingRoleServiceSection.cs
- EllipseGeometry.cs
- MapPathBasedVirtualPathProvider.cs
- SQLBytes.cs
- PocoPropertyAccessorStrategy.cs
- VariantWrapper.cs
- FileLogRecordEnumerator.cs
- HttpWriter.cs
- SecurityState.cs
- MailMessageEventArgs.cs
- DataGrid.cs
- MetabaseServerConfig.cs
- BuildDependencySet.cs
- FixedTextBuilder.cs
- CodeExpressionCollection.cs
- ResolveNameEventArgs.cs
- DataViewSetting.cs
- FixUp.cs
- HostedHttpContext.cs
- ImmComposition.cs
- ExtendedTransformFactory.cs