From c08ea68b4aaa9bcf600f0e8c8e7fc511fc7549a8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 3 Feb 2019 22:46:02 +0100 Subject: [PATCH] Avoid unnecessary calls in wxGDIPlusContext::GetTextExtent() Don't always call several GDI+ functions when we often don't need their results: only retrieve the cell descent, ascent and the line spacing if we are going to really use any of these values. --- src/msw/graphics.cpp | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index ebecbeb72a..4d201c7a9f 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -2111,33 +2111,40 @@ void wxGDIPlusContext::GetTextExtent( const wxString &str, wxDouble *width, wxDo wxCHECK_RET( !m_font.IsNull(), wxT("wxGDIPlusContext::GetTextExtent - no valid font set") ); wxWCharBuffer s = str.wc_str( *wxConvUI ); - FontFamily ffamily ; Font* f = ((wxGDIPlusFontData*)m_font.GetRefData())->GetGDIPlusFont(); - f->GetFamily(&ffamily) ; + // Get the font metrics if we actually need them. + if ( descent || externalLeading || (height && str.empty()) ) + { + FontFamily ffamily ; + f->GetFamily(&ffamily) ; - REAL factorY = m_fontScaleRatio; + REAL factorY = m_fontScaleRatio; - // Notice that we must use the real font style or the results would be - // incorrect for italic/bold fonts. - const INT style = f->GetStyle(); - const REAL size = f->GetSize(); - const REAL emHeight = ffamily.GetEmHeight(style); - REAL rDescent = ffamily.GetCellDescent(style) * size / emHeight; - REAL rAscent = ffamily.GetCellAscent(style) * size / emHeight; - REAL rHeight = ffamily.GetLineSpacing(style) * size / emHeight; + // Notice that we must use the real font style or the results would be + // incorrect for italic/bold fonts. + const INT style = f->GetStyle(); + const REAL size = f->GetSize(); + const REAL emHeight = ffamily.GetEmHeight(style); + REAL rDescent = ffamily.GetCellDescent(style) * size / emHeight; + REAL rAscent = ffamily.GetCellAscent(style) * size / emHeight; + REAL rHeight = ffamily.GetLineSpacing(style) * size / emHeight; + + if ( height && str.empty() ) + *height = rHeight * factorY; + if ( descent ) + *descent = rDescent * factorY; + if ( externalLeading ) + *externalLeading = (rHeight - rAscent - rDescent) * factorY; + } - if ( height ) - *height = rHeight * factorY; - if ( descent ) - *descent = rDescent * factorY; - if ( externalLeading ) - *externalLeading = (rHeight - rAscent - rDescent) * factorY; // measuring empty strings is not guaranteed, so do it by hand if ( str.IsEmpty()) { if ( width ) *width = 0 ; + + // Height already assigned above if necessary. } else {