From afe0e776b94eb1544da706c5166a246578d80ab8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Jan 2018 14:14:05 +0100 Subject: [PATCH 1/6] Remove confusing "base_type" typedef from wxGTK3 wxDC code This typedef isn't really useful in base class initializer lists and it wasn't really used anywhere else. --- include/wx/gtk/dc.h | 7 ------- src/gtk/dc.cpp | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index 2c08c1f200..6c8fb391e3 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -15,7 +15,6 @@ class wxGTKCairoDCImpl: public wxGCDCImpl { - typedef wxGCDCImpl base_type; public: wxGTKCairoDCImpl(wxDC* owner); wxGTKCairoDCImpl(wxDC* owner, int); @@ -42,7 +41,6 @@ protected: class wxWindowDCImpl: public wxGTKCairoDCImpl { - typedef wxGTKCairoDCImpl base_type; public: wxWindowDCImpl(wxWindowDC* owner, wxWindow* window); @@ -52,7 +50,6 @@ public: class wxClientDCImpl: public wxGTKCairoDCImpl { - typedef wxGTKCairoDCImpl base_type; public: wxClientDCImpl(wxClientDC* owner, wxWindow* window); @@ -62,7 +59,6 @@ public: class wxPaintDCImpl: public wxGTKCairoDCImpl { - typedef wxGTKCairoDCImpl base_type; public: wxPaintDCImpl(wxPaintDC* owner, wxWindow* window); @@ -72,7 +68,6 @@ public: class wxScreenDCImpl: public wxGTKCairoDCImpl { - typedef wxGTKCairoDCImpl base_type; public: wxScreenDCImpl(wxScreenDC* owner); @@ -82,7 +77,6 @@ public: class wxMemoryDCImpl: public wxGTKCairoDCImpl { - typedef wxGTKCairoDCImpl base_type; public: wxMemoryDCImpl(wxMemoryDC* owner); wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap); @@ -102,7 +96,6 @@ private: class WXDLLIMPEXP_CORE wxGTKCairoDC: public wxDC { - typedef wxDC base_type; public: wxGTKCairoDC(cairo_t* cr, wxWindow* window); diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index 401551b7f7..711b96d517 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -21,21 +21,21 @@ #include wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner) - : base_type(owner) + : wxGCDCImpl(owner) { m_width = 0; m_height = 0; } wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, int) - : base_type(owner, 0) + : wxGCDCImpl(owner, 0) { m_width = 0; m_height = 0; } wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, double scaleFactor) - : base_type(owner, 0) + : wxGCDCImpl(owner, 0) { m_width = 0; m_height = 0; @@ -43,7 +43,7 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, double scaleFactor) } wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) - : base_type(owner, 0) + : wxGCDCImpl(owner, 0) { m_window = window; m_font = window->GetFont(); @@ -236,10 +236,11 @@ void* wxGTKCairoDCImpl::GetCairoContext() const cr = static_cast(m_graphicContext->GetNativeContext()); return cr; } + //----------------------------------------------------------------------------- wxWindowDCImpl::wxWindowDCImpl(wxWindowDC* owner, wxWindow* window) - : base_type(owner, window) + : wxGTKCairoDCImpl(owner, window) { GtkWidget* widget = window->m_wxwindow; if (widget == NULL) @@ -285,7 +286,7 @@ wxWindowDCImpl::wxWindowDCImpl(wxWindowDC* owner, wxWindow* window) //----------------------------------------------------------------------------- wxClientDCImpl::wxClientDCImpl(wxClientDC* owner, wxWindow* window) - : base_type(owner, window) + : wxGTKCairoDCImpl(owner, window) { GtkWidget* widget = window->m_wxwindow; if (widget == NULL) @@ -325,7 +326,7 @@ wxClientDCImpl::wxClientDCImpl(wxClientDC* owner, wxWindow* window) //----------------------------------------------------------------------------- wxPaintDCImpl::wxPaintDCImpl(wxPaintDC* owner, wxWindow* window) - : base_type(owner, window) + : wxGTKCairoDCImpl(owner, window) { cairo_t* cr = window->GTKPaintContext(); wxCHECK_RET(cr, "using wxPaintDC without being in a native paint event"); @@ -339,7 +340,7 @@ wxPaintDCImpl::wxPaintDCImpl(wxPaintDC* owner, wxWindow* window) //----------------------------------------------------------------------------- wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) - : base_type(owner, 0) + : wxGTKCairoDCImpl(owner, 0) { GdkWindow* window = gdk_get_default_root_window(); m_width = gdk_window_get_width(window); @@ -353,20 +354,20 @@ wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) //----------------------------------------------------------------------------- wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner) - : base_type(owner) + : wxGTKCairoDCImpl(owner) { m_ok = false; } wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap) - : base_type(owner, 0) + : wxGTKCairoDCImpl(owner, 0) , m_bitmap(bitmap) { Setup(); } wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner, wxDC*) - : base_type(owner) + : wxGTKCairoDCImpl(owner) { m_ok = false; } @@ -411,7 +412,7 @@ void wxMemoryDCImpl::Setup() //----------------------------------------------------------------------------- wxGTKCairoDC::wxGTKCairoDC(cairo_t* cr, wxWindow* window) - : base_type(new wxGTKCairoDCImpl(this, window->GetContentScaleFactor())) + : wxDC(new wxGTKCairoDCImpl(this, window->GetContentScaleFactor())) { wxGraphicsContext* gc = wxGraphicsContext::CreateFromNative(cr); gc->EnableOffset(window->GetContentScaleFactor() <= 1); From 4ad1a3d9695c118ac85c3ea9f6fba519122f5ab4 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Jan 2018 14:58:08 +0100 Subject: [PATCH 2/6] Return display PPI from wxDC::GetPPI() in wxGTK3 For wxDC associated with a window, such as wx{Window,Client,Paint}DC, this method should return the window PPI, not the hard coded 72 DPI of Cairo graphics context. This still doesn't work correctly when using multiple monitors with different DPI settings, but is still a (modest) improvement. --- include/wx/gtk/dc.h | 5 +++++ src/gtk/dc.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index 6c8fb391e3..de09ee2494 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -32,9 +32,14 @@ public: virtual bool DoStretchBlit(int xdest, int ydest, int dstWidth, int dstHeight, wxDC* source, int xsrc, int ysrc, int srcWidth, int srcHeight, wxRasterOperationMode rop, bool useMask, int xsrcMask, int ysrcMask) wxOVERRIDE; virtual void* GetCairoContext() const wxOVERRIDE; + virtual wxSize GetPPI() const wxOVERRIDE; + protected: int m_width, m_height; +private: + bool TryGetWindowSize(wxSize& size, wxSize& sizeMM) const; + wxDECLARE_NO_COPY_CLASS(wxGTKCairoDCImpl); }; //----------------------------------------------------------------------------- diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index 711b96d517..ed846c0899 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -15,6 +15,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" #include "wx/dcscreen.h" +#include "wx/gdicmn.h" #include "wx/icon.h" #include "wx/gtk/dc.h" @@ -237,6 +238,18 @@ void* wxGTKCairoDCImpl::GetCairoContext() const return cr; } +wxSize wxGTKCairoDCImpl::GetPPI() const +{ + if ( m_window ) + { + return wxGetDisplayPPI(); + } + + // For a non-window-based DC the concept of PPI doesn't make much sense + // anyhow, so just return the hardcoded value used by the base class. + return wxGCDCImpl::GetPPI(); +} + //----------------------------------------------------------------------------- wxWindowDCImpl::wxWindowDCImpl(wxWindowDC* owner, wxWindow* window) From a1cb2eb12a0ea295deb1d13afcba5ce566849ed6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 25 Jan 2018 14:55:31 +0100 Subject: [PATCH 3/6] Also return display DPI from wxScreenDC in wxGTK3 This is similar to the previous commit and is done for the same reasons: screen DC needs to use the same DPI as the screen itself, instead of the default Cairo 72 DPI. --- include/wx/gtk/dc.h | 2 ++ src/gtk/dc.cpp | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index de09ee2494..3e3b600f68 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -76,6 +76,8 @@ class wxScreenDCImpl: public wxGTKCairoDCImpl public: wxScreenDCImpl(wxScreenDC* owner); + virtual wxSize GetPPI() const wxOVERRIDE; + wxDECLARE_NO_COPY_CLASS(wxScreenDCImpl); }; //----------------------------------------------------------------------------- diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index ed846c0899..ccd61f9b02 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -364,6 +364,12 @@ wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) gc->EnableOffset(m_contentScaleFactor <= 1); SetGraphicsContext(gc); } + +wxSize wxScreenDCImpl::GetPPI() const +{ + return wxGetDisplayPPI(); +} + //----------------------------------------------------------------------------- wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner) From 0be81cb34be50597593fe422b1e3cd72c0e0395a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 25 Jan 2018 14:40:10 +0100 Subject: [PATCH 4/6] Add wxGTKCairoDCImpl::SetSize() helper Avoid repeating gdk_window_get_{width,height}() calls in several places. --- include/wx/gtk/dc.h | 6 +++--- src/gtk/dc.cpp | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index 3e3b600f68..3c8619cb8a 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -35,10 +35,10 @@ public: virtual wxSize GetPPI() const wxOVERRIDE; protected: - int m_width, m_height; + // Set m_width and m_height from the given (valid) GdkWindow. + void InitSize(GdkWindow* window); -private: - bool TryGetWindowSize(wxSize& size, wxSize& sizeMM) const; + int m_width, m_height; wxDECLARE_NO_COPY_CLASS(wxGTKCairoDCImpl); }; diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index ccd61f9b02..79c90e20d2 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -55,6 +55,12 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) m_contentScaleFactor = window->GetContentScaleFactor(); } +void wxGTKCairoDCImpl::InitSize(GdkWindow* window) +{ + m_width = gdk_window_get_width(window); + m_height = gdk_window_get_height(window); +} + void wxGTKCairoDCImpl::DoDrawBitmap(const wxBitmap& bitmap, int x, int y, bool useMask) { wxCHECK_RET(IsOk(), "invalid DC"); @@ -343,9 +349,7 @@ wxPaintDCImpl::wxPaintDCImpl(wxPaintDC* owner, wxWindow* window) { cairo_t* cr = window->GTKPaintContext(); wxCHECK_RET(cr, "using wxPaintDC without being in a native paint event"); - GdkWindow* gdkWindow = gtk_widget_get_window(window->m_wxwindow); - m_width = gdk_window_get_width(gdkWindow); - m_height = gdk_window_get_height(gdkWindow); + InitSize(gtk_widget_get_window(window->m_wxwindow)); wxGraphicsContext* gc = wxGraphicsContext::CreateFromNative(cr); gc->EnableOffset(m_contentScaleFactor <= 1); SetGraphicsContext(gc); @@ -356,8 +360,8 @@ wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) : wxGTKCairoDCImpl(owner, 0) { GdkWindow* window = gdk_get_default_root_window(); - m_width = gdk_window_get_width(window); - m_height = gdk_window_get_height(window); + InitSize(window); + cairo_t* cr = gdk_cairo_create(window); wxGraphicsContext* gc = wxGraphicsContext::CreateFromNative(cr); cairo_destroy(cr); From 4c8e701d84dbaf8d20ee7a1d22721ad34ca36fcb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 25 Jan 2018 14:48:14 +0100 Subject: [PATCH 5/6] Remove wxGTKCairoDCImpl ctor taking dummy int We can reuse another ctor taking wxWindow* instead. Although this does require an ugly cast, it's more explicit than just passing 0 which could, in principle, match both the ctor taking wxWindow* and another one taking double, and so is still preferable. --- include/wx/gtk/dc.h | 1 - src/gtk/dc.cpp | 25 +++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index 3c8619cb8a..f0807e3d12 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -17,7 +17,6 @@ class wxGTKCairoDCImpl: public wxGCDCImpl { public: wxGTKCairoDCImpl(wxDC* owner); - wxGTKCairoDCImpl(wxDC* owner, int); wxGTKCairoDCImpl(wxDC* owner, double scaleFactor); wxGTKCairoDCImpl(wxDC* owner, wxWindow* window); diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index 79c90e20d2..61f3951724 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -28,13 +28,6 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner) m_height = 0; } -wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, int) - : wxGCDCImpl(owner, 0) -{ - m_width = 0; - m_height = 0; -} - wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, double scaleFactor) : wxGCDCImpl(owner, 0) { @@ -46,13 +39,17 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, double scaleFactor) wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) : wxGCDCImpl(owner, 0) { - m_window = window; - m_font = window->GetFont(); - m_textForegroundColour = window->GetForegroundColour(); - m_textBackgroundColour = window->GetBackgroundColour(); m_width = 0; m_height = 0; - m_contentScaleFactor = window->GetContentScaleFactor(); + + if ( window ) + { + m_window = window; + m_font = window->GetFont(); + m_textForegroundColour = window->GetForegroundColour(); + m_textBackgroundColour = window->GetBackgroundColour(); + m_contentScaleFactor = window->GetContentScaleFactor(); + } } void wxGTKCairoDCImpl::InitSize(GdkWindow* window) @@ -357,7 +354,7 @@ wxPaintDCImpl::wxPaintDCImpl(wxPaintDC* owner, wxWindow* window) //----------------------------------------------------------------------------- wxScreenDCImpl::wxScreenDCImpl(wxScreenDC* owner) - : wxGTKCairoDCImpl(owner, 0) + : wxGTKCairoDCImpl(owner, static_cast(NULL)) { GdkWindow* window = gdk_get_default_root_window(); InitSize(window); @@ -383,7 +380,7 @@ wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner) } wxMemoryDCImpl::wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap) - : wxGTKCairoDCImpl(owner, 0) + : wxGTKCairoDCImpl(owner, static_cast(NULL)) , m_bitmap(bitmap) { Setup(); From ee0dd4edb1445c91dcfdb61d903a26ac23745e79 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 25 Jan 2018 14:52:29 +0100 Subject: [PATCH 6/6] Replace wxGTKCairoDCImpl::m_{width,height} with m_size This allows to avoid initializing the variables to 0 in all the overloaded ctors: wxSize default ctor already does it. It's also more convenient to use GetScaledSize() rather than assigning m_width and m_height separately, even if the rest of the code is broadly unchanged. --- include/wx/gtk/dc.h | 4 ++-- src/gtk/dc.cpp | 38 +++++++++++++++----------------------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index f0807e3d12..88e46392f6 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -34,10 +34,10 @@ public: virtual wxSize GetPPI() const wxOVERRIDE; protected: - // Set m_width and m_height from the given (valid) GdkWindow. + // Set m_size from the given (valid) GdkWindow. void InitSize(GdkWindow* window); - int m_width, m_height; + wxSize m_size; wxDECLARE_NO_COPY_CLASS(wxGTKCairoDCImpl); }; diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index 61f3951724..4a6603f5ee 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -24,24 +24,17 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner) : wxGCDCImpl(owner) { - m_width = 0; - m_height = 0; } wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, double scaleFactor) : wxGCDCImpl(owner, 0) { - m_width = 0; - m_height = 0; m_contentScaleFactor = scaleFactor; } wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) : wxGCDCImpl(owner, 0) { - m_width = 0; - m_height = 0; - if ( window ) { m_window = window; @@ -54,8 +47,8 @@ wxGTKCairoDCImpl::wxGTKCairoDCImpl(wxDC* owner, wxWindow* window) void wxGTKCairoDCImpl::InitSize(GdkWindow* window) { - m_width = gdk_window_get_width(window); - m_height = gdk_window_get_height(window); + m_size.x = gdk_window_get_width(window); + m_size.y = gdk_window_get_height(window); } void wxGTKCairoDCImpl::DoDrawBitmap(const wxBitmap& bitmap, int x, int y, bool useMask) @@ -122,9 +115,9 @@ bool wxGTKCairoDCImpl::DoGetPixel(int x, int y, wxColour* col) const void wxGTKCairoDCImpl::DoGetSize(int* width, int* height) const { if (width) - *width = m_width; + *width = m_size.x; if (height) - *height = m_height; + *height = m_size.y; } bool wxGTKCairoDCImpl::DoStretchBlit(int xdest, int ydest, int dstWidth, int dstHeight, wxDC* source, int xsrc, int ysrc, int srcWidth, int srcHeight, wxRasterOperationMode rop, bool useMask, int xsrcMask, int ysrcMask) @@ -279,15 +272,15 @@ wxWindowDCImpl::wxWindowDCImpl(wxWindowDC* owner, wxWindow* window) int x, y; if (gtk_widget_get_has_window(widget)) { - m_width = gdk_window_get_width(gdkWindow); - m_height = gdk_window_get_height(gdkWindow); - x = m_width - a.width; - y = m_height - a.height; + m_size.x = gdk_window_get_width(gdkWindow); + m_size.y = gdk_window_get_height(gdkWindow); + x = m_size.x - a.width; + y = m_size.y - a.height; } else { - m_width = a.width; - m_height = a.height; + m_size.x = a.width; + m_size.y = a.height; x = a.x; y = a.y; cairo_rectangle(cr, a.x, a.y, a.width, a.height); @@ -322,15 +315,15 @@ wxClientDCImpl::wxClientDCImpl(wxClientDC* owner, wxWindow* window) SetGraphicsContext(gc); if (gtk_widget_get_has_window(widget)) { - m_width = gdk_window_get_width(gdkWindow); - m_height = gdk_window_get_height(gdkWindow); + m_size.x = gdk_window_get_width(gdkWindow); + m_size.y = gdk_window_get_height(gdkWindow); } else { GtkAllocation a; gtk_widget_get_allocation(widget, &a); - m_width = a.width; - m_height = a.height; + m_size.x = a.width; + m_size.y = a.height; cairo_rectangle(cr, a.x, a.y, a.width, a.height); cairo_clip(cr); SetDeviceLocalOrigin(a.x, a.y); @@ -419,8 +412,7 @@ void wxMemoryDCImpl::Setup() m_ok = m_bitmap.IsOk(); if (m_ok) { - m_width = int(m_bitmap.GetScaledWidth()); - m_height = int(m_bitmap.GetScaledHeight()); + m_size = m_bitmap.GetScaledSize(); m_contentScaleFactor = m_bitmap.GetScaleFactor(); cairo_t* cr = m_bitmap.CairoCreate(); gc = wxGraphicsContext::CreateFromNative(cr);