Merge branch 'gc-get-text-extent'

Micro-optimization in wxGDIPlusContext::GetTextExtent() and minor
printing sample cleanup.

See https://github.com/wxWidgets/wxWidgets/pull/1220
This commit is contained in:
Vadim Zeitlin
2019-02-04 11:20:59 +01:00
2 changed files with 28 additions and 22 deletions

View File

@@ -38,6 +38,7 @@
#if wxUSE_GRAPHICS_CONTEXT
#include "wx/graphics.h"
#include "wx/scopedptr.h"
#endif
#ifdef __WXMAC__
@@ -219,7 +220,7 @@ void MyApp::Draw(wxDC&dc)
dc.DrawBitmap( m_bitmap, 10, 10 );
#if wxUSE_GRAPHICS_CONTEXT
wxGraphicsContext *gc = wxGraphicsContext::CreateFromUnknownDC(dc);
wxScopedPtr<wxGraphicsContext> gc(wxGraphicsContext::CreateFromUnknownDC(dc));
if (gc)
{
@@ -243,12 +244,10 @@ void MyApp::Draw(wxDC&dc)
gc->DrawText(text, 25.0, 60.0);
// draw rectangle around the text
double w, h, d, el;
gc->GetTextExtent(text, &w, &h, &d, &el);
double w, h;
gc->GetTextExtent(text, &w, &h);
gc->SetPen( *wxBLACK_PEN );
gc->DrawRectangle(25.0, 60.0, w, h);
delete gc;
}
#endif

View File

@@ -2111,9 +2111,12 @@ 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();
// Get the font metrics if we actually need them.
if ( descent || externalLeading || (height && str.empty()) )
{
FontFamily ffamily ;
f->GetFamily(&ffamily) ;
REAL factorY = m_fontScaleRatio;
@@ -2127,17 +2130,21 @@ void wxGDIPlusContext::GetTextExtent( const wxString &str, wxDouble *width, wxDo
REAL rAscent = ffamily.GetCellAscent(style) * size / emHeight;
REAL rHeight = ffamily.GetLineSpacing(style) * size / emHeight;
if ( height )
if ( height && str.empty() )
*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
{