Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Misc / GDI / MeasurementDCInfo.cs / 1305376 / 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 [....]_NAMESPACE namespace System.Windows.Forms.Internal { #elif DRAWING_NAMESPACE namespace System.Drawing.Internal { #else namespace System.Experimental.Gdi { #endif #if [....]_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
- WpfKnownMember.cs
- SolidColorBrush.cs
- QilTernary.cs
- rsa.cs
- SqlBulkCopyColumnMapping.cs
- ping.cs
- InputDevice.cs
- WebWorkflowRole.cs
- HtmlEmptyTagControlBuilder.cs
- CodeAttributeDeclarationCollection.cs
- SingleSelectRootGridEntry.cs
- StringDictionaryWithComparer.cs
- ReadOnlyDictionary.cs
- ComponentManagerBroker.cs
- DoubleCollectionConverter.cs
- Slider.cs
- Baml2006KnownTypes.cs
- QEncodedStream.cs
- DataGridCell.cs
- CultureMapper.cs
- DbConnectionFactory.cs
- WebPartEditorCancelVerb.cs
- UidPropertyAttribute.cs
- ProjectionNode.cs
- StylusButtonCollection.cs
- ValueChangedEventManager.cs
- BinaryEditor.cs
- TreeNodeStyleCollection.cs
- PrimaryKeyTypeConverter.cs
- storepermissionattribute.cs
- StringArrayConverter.cs
- ConfigurationManagerHelperFactory.cs
- CompositionTarget.cs
- MarkupObject.cs
- ImageListImage.cs
- CommandLibraryHelper.cs
- FilteredXmlReader.cs
- AccessViolationException.cs
- ContentOperations.cs
- SessionStateUtil.cs
- ObjectItemCachedAssemblyLoader.cs
- VectorValueSerializer.cs
- AspCompat.cs
- _TLSstream.cs
- TemplatedMailWebEventProvider.cs
- DataServicePagingProviderWrapper.cs
- PanelStyle.cs
- BufferModeSettings.cs
- XPathAncestorQuery.cs
- EntityContainer.cs
- PageHandlerFactory.cs
- Buffer.cs
- RSAPKCS1KeyExchangeFormatter.cs
- HebrewCalendar.cs
- TextSchema.cs
- ColorTransformHelper.cs
- MsmqReceiveParameters.cs
- NotConverter.cs
- XmlJsonWriter.cs
- TypedTableHandler.cs
- MessageHeader.cs
- SizeIndependentAnimationStorage.cs
- ExpressionDumper.cs
- DispatchOperationRuntime.cs
- ReferenceConverter.cs
- PolicyAssertionCollection.cs
- _CookieModule.cs
- ActivitiesCollection.cs
- SchemaDeclBase.cs
- TextRunCacheImp.cs
- QuotedStringWriteStateInfo.cs
- ExternalException.cs
- TimeoutException.cs
- ParallelTimeline.cs
- CodeSnippetStatement.cs
- DynamicMethod.cs
- Misc.cs
- SafeCoTaskMem.cs
- StylusPlugInCollection.cs
- MiniModule.cs
- VisualBrush.cs
- DataGridViewLinkCell.cs
- Win32.cs
- CheckedPointers.cs
- XmlAttributeAttribute.cs
- ContainsSearchOperator.cs
- BasicHttpSecurity.cs
- LabelEditEvent.cs
- FlowLayout.cs
- MeasureItemEvent.cs
- FloaterBaseParagraph.cs
- BooleanFunctions.cs
- UnsafePeerToPeerMethods.cs
- _ListenerRequestStream.cs
- UserControlParser.cs
- DataControlFieldHeaderCell.cs
- XAMLParseException.cs
- XmlReader.cs
- EqualityComparer.cs
- _ShellExpression.cs