avoid creating and immediately destroying a wxGraphicsContext when creating a wxDC with wxGTK3

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72073 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2012-07-13 16:58:37 +00:00
parent 04b2b47a4e
commit f30b9eed38
4 changed files with 27 additions and 11 deletions

View File

@@ -201,6 +201,10 @@ public:
#endif // __WXMSW__ #endif // __WXMSW__
protected: protected:
// unused int parameter distinguishes this version, which does not create a
// wxGraphicsContext, in the expectation that the derived class will do it
wxGCDCImpl(wxDC* owner, int);
// scaling variables // scaling variables
bool m_logicalFunctionSupported; bool m_logicalFunctionSupported;
wxGraphicsMatrix m_matrixOriginal; wxGraphicsMatrix m_matrixOriginal;

View File

@@ -19,7 +19,9 @@ class wxGTKCairoDCImpl: public wxGCDCImpl
typedef wxGCDCImpl base_type; typedef wxGCDCImpl base_type;
public: public:
wxGTKCairoDCImpl(wxDC* owner); wxGTKCairoDCImpl(wxDC* owner);
wxGTKCairoDCImpl(wxDC* owner, int);
wxGTKCairoDCImpl(wxDC* owner, wxWindow* window); wxGTKCairoDCImpl(wxDC* owner, wxWindow* window);
virtual void DoDrawBitmap(const wxBitmap& bitmap, int x, int y, bool useMask); virtual void DoDrawBitmap(const wxBitmap& bitmap, int x, int y, bool useMask);
virtual void DoDrawIcon(const wxIcon& icon, int x, int y); virtual void DoDrawIcon(const wxIcon& icon, int x, int y);
#if wxUSE_IMAGE #if wxUSE_IMAGE

View File

@@ -205,6 +205,13 @@ wxGCDCImpl::wxGCDCImpl(wxDC *owner, const wxEnhMetaFileDC& dc)
} }
#endif #endif
wxGCDCImpl::wxGCDCImpl(wxDC* owner, int)
: wxDCImpl(owner)
{
// derived class will set a context
Init(NULL);
}
void wxGCDCImpl::Init(wxGraphicsContext* ctx) void wxGCDCImpl::Init(wxGraphicsContext* ctx)
{ {
m_ok = false; m_ok = false;

View File

@@ -28,8 +28,15 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner)
m_height = 0; m_height = 0;
} }
wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, int)
: base_type(owner, 0)
{
m_width = 0;
m_height = 0;
}
wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window)
: base_type(owner) : base_type(owner, 0)
{ {
m_window = window; m_window = window;
m_font = window->GetFont(); m_font = window->GetFont();
@@ -219,6 +226,8 @@ wxWindowDCImpl::wxWindowDCImpl(wxWindowDC* owner, wxWindow* window)
if (x || y) if (x || y)
SetDeviceLocalOrigin(x, y); SetDeviceLocalOrigin(x, y);
} }
else
SetGraphicsContext(wxGraphicsContext::Create());
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -255,13 +264,7 @@ wxClientDCImpl::wxClientDCImpl(wxClientDC* owner, wxWindow* window)
} }
} }
else else
{ SetGraphicsContext(wxGraphicsContext::Create());
// create something that can be used for measuring, but not drawing
cairo_t* cr = gdk_cairo_create(gdk_get_default_root_window());
cairo_rectangle(cr, 0, 0, 0, 0);
cairo_clip(cr);
SetGraphicsContext(wxGraphicsContext::CreateFromNative(cr));
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -279,7 +282,7 @@ wxPaintDCImpl::wxPaintDCImpl(wxPaintDC* owner, wxWindow* window)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner)
: base_type(owner) : base_type(owner, 0)
{ {
GdkWindow* window = gdk_get_default_root_window(); GdkWindow* window = gdk_get_default_root_window();
m_width = gdk_window_get_width(window); m_width = gdk_window_get_width(window);
@@ -296,7 +299,7 @@ wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner)
} }
wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap) wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap)
: base_type(owner) : base_type(owner, 0)
, m_bitmap(bitmap) , m_bitmap(bitmap)
{ {
Setup(); Setup();
@@ -345,7 +348,7 @@ void wxMemoryDCImpl::Setup()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
wxGTKCairoDC::wxGTKCairoDC(cairo_t* cr) wxGTKCairoDC::wxGTKCairoDC(cairo_t* cr)
: base_type(new wxGTKCairoDCImpl(this)) : base_type(new wxGTKCairoDCImpl(this, 0))
{ {
cairo_reference(cr); cairo_reference(cr);
SetGraphicsContext(wxGraphicsContext::CreateFromNative(cr)); SetGraphicsContext(wxGraphicsContext::CreateFromNative(cr));