/// 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 User32.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 User32.DRAWTEXTPARAMS { iLeftMargin = currentCachedInfo.LeftTextMargin, iRightMargin = currentCachedInfo.RightTextMargin }); } else if (currentCachedInfo == null) { currentCachedInfo = new CachedInfo(); cachedMeasurementDCInfo = currentCachedInfo; } User32.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 User32.DRAWTEXTPARAMS { iLeftMargin = currentCachedInfo.LeftTextMargin, iRightMargin = currentCachedInfo.RightTextMargin }); }
internal static IntNativeMethods.DRAWTEXTPARAMS GetTextMargins(WindowsGraphics wg, WindowsFont font) { CachedInfo cachedMeasurementDCInfo = MeasurementDCInfo.cachedMeasurementDCInfo; if (((cachedMeasurementDCInfo == null) || (cachedMeasurementDCInfo.LeftTextMargin <= 0)) || ((cachedMeasurementDCInfo.RightTextMargin <= 0) || (font != cachedMeasurementDCInfo.LastUsedFont))) { if (cachedMeasurementDCInfo == null) { cachedMeasurementDCInfo = new CachedInfo(); MeasurementDCInfo.cachedMeasurementDCInfo = cachedMeasurementDCInfo; } IntNativeMethods.DRAWTEXTPARAMS textMargins = wg.GetTextMargins(font); cachedMeasurementDCInfo.LeftTextMargin = textMargins.iLeftMargin; cachedMeasurementDCInfo.RightTextMargin = textMargins.iRightMargin; } return new IntNativeMethods.DRAWTEXTPARAMS(cachedMeasurementDCInfo.LeftTextMargin, cachedMeasurementDCInfo.RightTextMargin); }
internal static IntNativeMethods.DRAWTEXTPARAMS GetTextMargins(WindowsGraphics wg, WindowsFont font) { CachedInfo cachedMeasurementDCInfo = MeasurementDCInfo.cachedMeasurementDCInfo; if (((cachedMeasurementDCInfo == null) || (cachedMeasurementDCInfo.LeftTextMargin <= 0)) || ((cachedMeasurementDCInfo.RightTextMargin <= 0) || (font != cachedMeasurementDCInfo.LastUsedFont))) { if (cachedMeasurementDCInfo == null) { cachedMeasurementDCInfo = new CachedInfo(); MeasurementDCInfo.cachedMeasurementDCInfo = cachedMeasurementDCInfo; } IntNativeMethods.DRAWTEXTPARAMS textMargins = wg.GetTextMargins(font); cachedMeasurementDCInfo.LeftTextMargin = textMargins.iLeftMargin; cachedMeasurementDCInfo.RightTextMargin = textMargins.iRightMargin; } return(new IntNativeMethods.DRAWTEXTPARAMS(cachedMeasurementDCInfo.LeftTextMargin, cachedMeasurementDCInfo.RightTextMargin)); }