Improve DPI support in wxMSW wxCairoRenderer

Drawing sample looks correct on Windows and Linux GTK3 at 200% scaling,
and correct DPI is returned.
This commit is contained in:
Maarten Bent
2022-04-20 00:44:31 +02:00
parent afe2d55b3e
commit acc32082e8

View File

@@ -40,6 +40,7 @@ bool wxCairoInit();
#include "wx/private/graphics.h"
#include "wx/rawbmp.h"
#include "wx/vector.h"
#include "wx/display.h"
#ifdef __WXMSW__
#include "wx/msw/enhmeta.h"
#endif
@@ -332,7 +333,10 @@ protected:
class wxCairoFontData : public wxGraphicsObjectRefData
{
public:
wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col );
wxCairoFontData( wxGraphicsRenderer* renderer,
const wxFont &font,
const wxRealPoint& dpi,
const wxColour& col );
wxCairoFontData(wxGraphicsRenderer* renderer,
double sizeInPixels,
const wxString& facename,
@@ -508,6 +512,8 @@ public:
virtual void PopState() wxOVERRIDE;
virtual void Flush() wxOVERRIDE;
void GetDPI(wxDouble* dpiX, wxDouble* dpiY) const wxOVERRIDE;
virtual void GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height,
wxDouble *descent, wxDouble *externalLeading ) const wxOVERRIDE;
virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const wxOVERRIDE;
@@ -1124,7 +1130,7 @@ wxCairoFontData::InitFontComponents(const wxString& facename,
}
wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font,
const wxColour& col )
const wxRealPoint& dpi, const wxColour& col )
: wxGraphicsObjectRefData(renderer)
#ifdef __WXGTK__
, m_wxfont(font)
@@ -1132,7 +1138,14 @@ wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &fo
{
InitColour(col);
#ifndef __WXMAC__
m_size = !dpi.y
? double(font.GetPixelSize().GetHeight())
: double(font.GetFractionalPointSize() * dpi.y / 72);
#else
wxUnusedVar(dpi);
m_size = font.GetPointSize();
#endif
#ifdef __WXMAC__
m_font = cairo_quartz_font_face_create_for_cgfont( font.OSXGetCGFont() );
@@ -2749,6 +2762,31 @@ void wxCairoContext::Flush()
#endif
}
void wxCairoContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) const
{
if ( GetWindow() )
{
const wxSize dpi = GetWindow()->GetDPI();
if ( dpiX )
*dpiX = dpi.x;
if ( dpiY )
*dpiY = dpi.y;
}
else
{
double dpi = (double)wxDisplay::GetStdPPIValue();
#ifndef __WXMAC__
dpi *= GetContentScaleFactor();
#endif
if ( dpiX )
*dpiX = dpi;
if ( dpiY )
*dpiY = dpi;
}
}
void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
{
wxGraphicsBitmap bitmap = GetRenderer()->CreateBitmap(bmp);
@@ -3377,13 +3415,7 @@ wxCairoRenderer::CreateRadialGradientBrush(wxDouble startX, wxDouble startY,
wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col )
{
wxGraphicsFont p;
ENSURE_LOADED_OR_RETURN(p);
if ( font.IsOk() )
{
p.SetRefData(new wxCairoFontData( this , font, col ));
}
return p;
return CreateFontAtDPI(font, wxRealPoint(), col);
}
wxGraphicsFont
@@ -3400,10 +3432,16 @@ wxCairoRenderer::CreateFont(double sizeInPixels,
wxGraphicsFont
wxCairoRenderer::CreateFontAtDPI(const wxFont& font,
const wxRealPoint& WXUNUSED(dpi),
const wxRealPoint& dpi,
const wxColour& col)
{
return CreateFont(font, col);
wxGraphicsFont p;
ENSURE_LOADED_OR_RETURN(p);
if ( font.IsOk() )
{
p.SetRefData(new wxCairoFontData( this, font, dpi, col ));
}
return p;
}
wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp )