Code:
/ FX-1434 / FX-1434 / 1.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
- BoolExpr.cs
- OperationResponse.cs
- MailAddress.cs
- ObjectListGeneralPage.cs
- ConfigurationFileMap.cs
- XmlSerializerNamespaces.cs
- ImageKeyConverter.cs
- SqlParameter.cs
- GridViewEditEventArgs.cs
- XslException.cs
- MetafileHeaderWmf.cs
- RecommendedAsConfigurableAttribute.cs
- PostBackOptions.cs
- MembershipPasswordException.cs
- CompiledIdentityConstraint.cs
- PageEventArgs.cs
- sitestring.cs
- ThaiBuddhistCalendar.cs
- Send.cs
- UIPropertyMetadata.cs
- TemplateField.cs
- EventLogEntry.cs
- URLAttribute.cs
- TemplatedMailWebEventProvider.cs
- xmlfixedPageInfo.cs
- ExpressionBuilder.cs
- DbSetClause.cs
- ColumnReorderedEventArgs.cs
- PrinterSettings.cs
- VarRemapper.cs
- BevelBitmapEffect.cs
- Pipe.cs
- TdsValueSetter.cs
- XpsFontSerializationService.cs
- GridViewCancelEditEventArgs.cs
- DataObjectAttribute.cs
- SQLByte.cs
- StandardRuntimeEnumValidatorAttribute.cs
- ControlCachePolicy.cs
- XmlSerializationWriter.cs
- RuleProcessor.cs
- CompiledRegexRunnerFactory.cs
- MulticastIPAddressInformationCollection.cs
- ListViewHitTestInfo.cs
- MarshalByRefObject.cs
- Baml6Assembly.cs
- StringResourceManager.cs
- CharStorage.cs
- GridViewAutomationPeer.cs
- AdCreatedEventArgs.cs
- ReflectionUtil.cs
- AtomPub10ServiceDocumentFormatter.cs
- XmlNodeList.cs
- BaseAddressElement.cs
- DataGridCheckBoxColumn.cs
- SqlDataSourceTableQuery.cs
- DecoderReplacementFallback.cs
- ServiceNameElement.cs
- NameSpaceExtractor.cs
- ViewSimplifier.cs
- InvalidWMPVersionException.cs
- WpfSharedXamlSchemaContext.cs
- Mutex.cs
- NetworkInterface.cs
- ConfigurationValidatorAttribute.cs
- TextServicesDisplayAttribute.cs
- WebReferenceOptions.cs
- ConditionCollection.cs
- HotSpotCollection.cs
- SspiNegotiationTokenAuthenticator.cs
- StyleCollection.cs
- FixedPosition.cs
- StringWriter.cs
- InheritanceAttribute.cs
- ServiceActivationException.cs
- DataSourceXmlElementAttribute.cs
- _ListenerAsyncResult.cs
- GC.cs
- _SslSessionsCache.cs
- MemoryPressure.cs
- ObjectDataSourceEventArgs.cs
- relpropertyhelper.cs
- OLEDB_Util.cs
- ProfileManager.cs
- DocumentGridPage.cs
- MatrixAnimationUsingPath.cs
- XmlDictionaryString.cs
- PolicyStatement.cs
- ToolStripManager.cs
- WorkflowInstanceTerminatedRecord.cs
- DataGridViewLinkCell.cs
- PropertyTabChangedEvent.cs
- TableRow.cs
- HMACSHA384.cs
- LingerOption.cs
- SoapSchemaImporter.cs
- XmlSchemaParticle.cs
- PageTheme.cs
- WorkflowView.cs
- CustomAttributeSerializer.cs