From 1a1d19e93b51c060625fb12a872e2b507e9ef255 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 20 Apr 2022 20:24:31 +0200 Subject: [PATCH] Improve print preview and printing with high DPI All print related scaling is based on 96DPI, so always let the printing contexts return this, and also adjust the font to this DPI. --- include/wx/msw/dcprint.h | 7 +++++++ src/common/prntbase.cpp | 5 +++-- src/msw/dcprint.cpp | 8 ++++++++ src/msw/enhmeta.cpp | 14 ++++++++++++++ src/msw/graphics.cpp | 6 ++---- src/msw/printwin.cpp | 3 ++- src/osx/core/printmac.cpp | 6 ++---- 7 files changed, 38 insertions(+), 11 deletions(-) diff --git a/include/wx/msw/dcprint.h b/include/wx/msw/dcprint.h index adbfb0c632..0b9a9af7fa 100644 --- a/include/wx/msw/dcprint.h +++ b/include/wx/msw/dcprint.h @@ -36,6 +36,13 @@ public: virtual wxRect GetPaperRect() const wxOVERRIDE; + virtual wxSize FromDIP(const wxSize& sz) const wxOVERRIDE + { + return sz; + } + + void SetFont(const wxFont& font) wxOVERRIDE; + protected: virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = false) wxOVERRIDE; diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 96f4ef857c..3089d00202 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -45,6 +45,7 @@ #include "wx/print.h" #include "wx/dcprint.h" #include "wx/artprov.h" +#include "wx/display.h" #include #include @@ -638,7 +639,7 @@ bool wxPrintout::SetUp(wxDC& dc) { wxCHECK_MSG( dc.IsOk(), false, "should have a valid DC to set up" ); - SetPPIScreen(wxGetDisplayPPI()); + SetPPIScreen(wxDisplay::GetStdPPI()); // We need to know printer PPI. In most ports, this can be retrieved from // the printer DC, but in others it is computed (probably for legacy @@ -1613,7 +1614,7 @@ void wxPreviewControlBar::CreateButtons() }; int n = WXSIZEOF(choices); - m_zoomControl = new wxChoice( this, wxID_PREVIEW_ZOOM, wxDefaultPosition, wxSize(70,wxDefaultCoord), n, choices, 0 ); + m_zoomControl = new wxChoice( this, wxID_PREVIEW_ZOOM, wxDefaultPosition, wxSize(FromDIP(70),wxDefaultCoord), n, choices, 0 ); sizer.Add(m_zoomControl); SetZoomControl(m_printPreview->GetZoom()); diff --git a/src/msw/dcprint.cpp b/src/msw/dcprint.cpp index 1a8af53d0d..294e7ebe84 100644 --- a/src/msw/dcprint.cpp +++ b/src/msw/dcprint.cpp @@ -41,6 +41,7 @@ #endif #include "wx/printdlg.h" +#include "wx/display.h" #include "wx/msw/printdlg.h" // mingw32 defines GDI_ERROR incorrectly @@ -230,6 +231,13 @@ wxRect wxPrinterDCImpl::GetPaperRect() const return wxRect(x, y, w, h); } +void wxPrinterDCImpl::SetFont(const wxFont& font) +{ + wxFont scaledFont = font; + if ( scaledFont.IsOk() ) + scaledFont.WXAdjustToPPI(wxDisplay::GetStdPPI()); + wxMSWDCImpl::SetFont(scaledFont); +} #if !wxUSE_PS_PRINTING diff --git a/src/msw/enhmeta.cpp b/src/msw/enhmeta.cpp index aed7dbaad5..62e9105e35 100644 --- a/src/msw/enhmeta.cpp +++ b/src/msw/enhmeta.cpp @@ -33,6 +33,7 @@ #include "wx/metafile.h" #include "wx/clipbrd.h" +#include "wx/display.h" #include "wx/msw/private.h" @@ -223,6 +224,19 @@ public: const wxString& description ); virtual ~wxEnhMetaFileDCImpl(); + wxSize FromDIP(const wxSize& sz) const wxOVERRIDE + { + return sz; + } + + void SetFont(const wxFont& font) wxOVERRIDE + { + wxFont scaledFont = font; + if (scaledFont.IsOk()) + scaledFont.WXAdjustToPPI(wxDisplay::GetStdPPI()); + wxMSWDCImpl::SetFont(scaledFont); + } + // obtain a pointer to the new metafile (caller should delete it) wxEnhMetaFile *Close(); diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index c03fca4a1a..0d67bcf7a6 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -2544,12 +2544,10 @@ wxGDIPlusPrintingContext::wxGDIPlusPrintingContext( wxGraphicsRenderer* renderer void wxGDIPlusPrintingContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) const { - // override to use same scaling as wxWindowsPrintPreview::DetermineScaling - const wxSize dpi = wxGetDPIofHDC(ScreenHDC()); if ( dpiX ) - *dpiX = dpi.x; + *dpiX = 96.0; if ( dpiY ) - *dpiY = dpi.y; + *dpiY = 96.0; } //----------------------------------------------------------------------------- diff --git a/src/msw/printwin.cpp b/src/msw/printwin.cpp index 051b1f93a1..cf644d3a8f 100644 --- a/src/msw/printwin.cpp +++ b/src/msw/printwin.cpp @@ -46,6 +46,7 @@ #include "wx/msw/private.h" #include "wx/msw/dcprint.h" #include "wx/msw/enhmeta.h" +#include "wx/display.h" #include @@ -310,7 +311,7 @@ bool wxWindowsPrintPreview::Print(bool interactive) void wxWindowsPrintPreview::DetermineScaling() { - const wxSize logPPIScreen = wxGetDPIofHDC(ScreenHDC()); + const wxSize logPPIScreen = wxDisplay::GetStdPPI(); m_previewPrintout->SetPPIScreen(logPPIScreen); // Get a device context for the currently selected printer diff --git a/src/osx/core/printmac.cpp b/src/osx/core/printmac.cpp index 235bea2b57..c69ad4d0cc 100644 --- a/src/osx/core/printmac.cpp +++ b/src/osx/core/printmac.cpp @@ -30,6 +30,7 @@ #include "wx/printdlg.h" #include "wx/paper.h" +#include "wx/display.h" #include "wx/osx/printdlg.h" #include @@ -746,10 +747,7 @@ bool wxMacPrintPreview::Print(bool interactive) void wxMacPrintPreview::DetermineScaling() { - int screenWidth , screenHeight ; - wxDisplaySize( &screenWidth , &screenHeight ) ; - - wxSize ppiScreen = wxGetDisplayPPI(); + wxSize ppiScreen = wxDisplay::GetStdPPI(); wxSize ppiPrinter( 72 , 72 ) ; m_previewPrintout->SetPPIScreen( ppiScreen.x , ppiScreen.y ) ;