From b991dc9d5a9c357ffdadafc993d92762b6902a63 Mon Sep 17 00:00:00 2001 From: Jay Nabonne Date: Mon, 21 Jan 2019 13:49:02 +0000 Subject: [PATCH] Fix using inactive painter when getting text extent Ensure that the painter is active before using it. --- src/qt/graphics.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/qt/graphics.cpp b/src/qt/graphics.cpp index 4d2c351071..5b2d32122e 100644 --- a/src/qt/graphics.cpp +++ b/src/qt/graphics.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #ifndef WX_PRECOMP #include "wx/bitmap.h" @@ -34,6 +35,38 @@ #include "wx/private/graphics.h" +namespace +{ + +// Ensure that the given painter is active by calling begin() if it isn't. If +// it already is, don't do anything. +class EnsurePainterIsActive +{ +public: + explicit EnsurePainterIsActive(QPainter* painter) + : m_painter(painter), + m_wasActive(painter->isActive()) + { + if ( !m_wasActive ) + m_painter->begin(&m_picture); + } + + ~EnsurePainterIsActive() + { + if ( !m_wasActive ) + m_painter->end(); + } + +private: + QPainter* m_painter; + QPicture m_picture; + bool m_wasActive; + + wxDECLARE_NO_COPY_CLASS(EnsurePainterIsActive); +}; + +} // anonymous namespace + class WXDLLIMPEXP_CORE wxQtBrushData : public wxGraphicsObjectRefData { public: @@ -935,6 +968,8 @@ public: wxCHECK_RET( !m_font.IsNull(), "wxQtContext::GetTextExtent - no valid font set" ); + EnsurePainterIsActive active(m_qtPainter); + const wxQtFontData* fontData = static_cast(m_font.GetRefData()); m_qtPainter->setFont(fontData->GetFont()); @@ -959,6 +994,8 @@ public: wxCHECK_RET( !m_font.IsNull(), "wxQtContext::GetPartialTextExtents - no valid font set" ); + EnsurePainterIsActive active(m_qtPainter); + const wxQtFontData* fontData = static_cast(m_font.GetRefData()); m_qtPainter->setFont(fontData->GetFont());