diff --git a/include/wx/graphics.h b/include/wx/graphics.h index 059d11c62d..415b8c9e83 100644 --- a/include/wx/graphics.h +++ b/include/wx/graphics.h @@ -727,7 +727,7 @@ public: } // returns the resolution of the graphics context in device points per inch - virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY); + virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY) const; #if 0 // sets the current alpha on this context @@ -1038,6 +1038,9 @@ public: const wxString& facename, int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) = 0; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col = *wxBLACK) = 0; // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; diff --git a/interface/wx/graphics.h b/interface/wx/graphics.h index 7e09c7d6ee..16b294209a 100644 --- a/interface/wx/graphics.h +++ b/interface/wx/graphics.h @@ -1116,7 +1116,7 @@ public: /** Returns the resolution of the graphics context in device points per inch. */ - virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY); + virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY) const; /** Returns the associated window if any. @@ -1459,6 +1459,17 @@ public: int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) = 0; + /** + Creates a native graphics font from a wxFont and a text colour. + + The specified DPI is used to convert the (fractional) wxFont point-size + to a fractional pixel-size. + + @since 3.1.3 + */ + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col = *wxBLACK) = 0; /** Creates a native brush with a linear gradient. diff --git a/src/common/graphcmn.cpp b/src/common/graphcmn.cpp index e0db708881..bc44f0b270 100644 --- a/src/common/graphcmn.cpp +++ b/src/common/graphcmn.cpp @@ -619,7 +619,7 @@ wxDouble wxGraphicsContext::GetAlpha() const } #endif -void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY) +void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY) const { if ( m_window ) { @@ -944,7 +944,9 @@ wxGraphicsContext::CreateRadialGradientBrush( wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColour &col ) const { - return GetRenderer()->CreateFont(font,col); + wxRealPoint dpi; + GetDPI(&dpi.x, &dpi.y); + return GetRenderer()->CreateFontAtDPI(font, dpi, col); } wxGraphicsFont diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index c6586c98e8..60c09fa4da 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -3009,6 +3009,9 @@ public : const wxString& facename, int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) wxOVERRIDE; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) wxOVERRIDE; // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE; @@ -3238,6 +3241,14 @@ wxCairoRenderer::CreateFont(double sizeInPixels, return font; } +wxGraphicsFont +wxCairoRenderer::CreateFontAtDPI(const wxFont& font, + const wxRealPoint& WXUNUSED(dpi), + const wxColour& col) +{ + return CreateFont(font, col); +} + wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp ) { wxGraphicsBitmap p; diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index 0e53578ac0..6bbf407a73 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -342,6 +342,7 @@ class wxGDIPlusFontData : public wxGraphicsObjectRefData public: wxGDIPlusFontData( wxGraphicsRenderer* renderer, const wxFont &font, + const wxRealPoint& dpi, const wxColour& col ); wxGDIPlusFontData(wxGraphicsRenderer* renderer, const wxString& name, @@ -661,6 +662,10 @@ public : int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) wxOVERRIDE; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) wxOVERRIDE; + // create a graphics bitmap from a native bitmap virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ) wxOVERRIDE; @@ -1144,6 +1149,7 @@ wxGDIPlusFontData::Init(const wxString& name, wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer, const wxFont &font, + const wxRealPoint& dpi, const wxColour& col ) : wxGraphicsObjectRefData( renderer ) { @@ -1157,7 +1163,11 @@ wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer, if ( font.GetWeight() == wxFONTWEIGHT_BOLD ) style |= FontStyleBold; - Init(font.GetFaceName(), (REAL)(font.GetPixelSize().GetHeight()), style, col); + REAL fontSize = (REAL)(!dpi.y + ? font.GetPixelSize().GetHeight() + : (font.GetFractionalPointSize() * dpi.y / 72.0f)); + + Init(font.GetFaceName(), fontSize, style, col); } wxGDIPlusFontData::wxGDIPlusFontData(wxGraphicsRenderer* renderer, @@ -2720,15 +2730,7 @@ wxGraphicsFont wxGDIPlusRenderer::CreateFont( const wxFont &font, const wxColour &col ) { - ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); - if ( font.IsOk() ) - { - wxGraphicsFont p; - p.SetRefData(new wxGDIPlusFontData( this, font, col )); - return p; - } - else - return wxNullGraphicsFont; + return CreateFontAtDPI(font, wxRealPoint(), col); } wxGraphicsFont @@ -2756,6 +2758,22 @@ wxGDIPlusRenderer::CreateFont(double sizeInPixels, return f; } +wxGraphicsFont +wxGDIPlusRenderer::CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) +{ + ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); + if ( font.IsOk() ) + { + wxGraphicsFont p; + p.SetRefData(new wxGDIPlusFontData( this, font, dpi, col )); + return p; + } + else + return wxNullGraphicsFont; +} + wxGraphicsBitmap wxGDIPlusRenderer::CreateBitmap( const wxBitmap &bitmap ) { ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); diff --git a/src/msw/graphicsd2d.cpp b/src/msw/graphicsd2d.cpp index 912c5116ab..ce6aaeeedc 100644 --- a/src/msw/graphicsd2d.cpp +++ b/src/msw/graphicsd2d.cpp @@ -2792,7 +2792,7 @@ wxD2DPenData* wxGetD2DPenData(const wxGraphicsPen& pen) class wxD2DFontData : public wxGraphicsObjectRefData { public: - wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxColor& color); + wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxRealPoint& dpi, const wxColor& color); wxCOMPtr CreateTextLayout(const wxString& text) const; @@ -2817,7 +2817,7 @@ private: bool m_strikethrough; }; -wxD2DFontData::wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxColor& color) : +wxD2DFontData::wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxRealPoint& dpi, const wxColor& color) : wxGraphicsObjectRefData(renderer), m_brushData(renderer, wxBrush(color)), m_underlined(font.GetUnderlined()), m_strikethrough(font.GetStrikethrough()) { @@ -2870,13 +2870,17 @@ wxD2DFontData::wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, c hr = familyNames->GetString(0, name, length+1); wxCHECK_HRESULT_RET(hr); + FLOAT fontSize = (FLOAT)(!dpi.y + ? font.GetPixelSize().GetHeight() + : (font.GetFractionalPointSize() * dpi.y / 72.0f)); + hr = wxDWriteFactory()->CreateTextFormat( name, NULL, m_font->GetWeight(), m_font->GetStyle(), m_font->GetStretch(), - (FLOAT)(font.GetPixelSize().GetHeight()), + fontSize, L"en-us", &m_textFormat); @@ -3644,7 +3648,7 @@ public: void Flush() wxOVERRIDE; - void GetDPI(wxDouble* dpiX, wxDouble* dpiY) wxOVERRIDE; + void GetDPI(wxDouble* dpiX, wxDouble* dpiY) const wxOVERRIDE; wxD2DContextSupplier::ContextType GetContext() wxOVERRIDE { @@ -4570,7 +4574,7 @@ void wxD2DContext::Flush() GetRenderTarget()->SetTransform(&currTransform); } -void wxD2DContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) +void wxD2DContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) const { FLOAT x, y; GetRenderTarget()->GetDpi(&x, &y); @@ -4653,6 +4657,10 @@ public : int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) wxOVERRIDE; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) wxOVERRIDE; + // create a graphics bitmap from a native bitmap wxGraphicsBitmap CreateBitmapFromNativeBitmap(void* bitmap) wxOVERRIDE; @@ -4886,7 +4894,30 @@ wxImage wxD2DRenderer::CreateImageFromBitmap(const wxGraphicsBitmap& bmp) wxGraphicsFont wxD2DRenderer::CreateFont(const wxFont& font, const wxColour& col) { - wxD2DFontData* fontData = new wxD2DFontData(this, font, col); + return CreateFontAtDPI(font, wxRealPoint(), col); +} + +wxGraphicsFont wxD2DRenderer::CreateFont( + double sizeInPixels, const wxString& facename, + int flags, + const wxColour& col) +{ + // Use the same DPI as wxFont will use in SetPixelSize, so these cancel + // each other out and we are left with the actual pixel size. + ScreenHDC hdc; + wxRealPoint dpi(::GetDeviceCaps(hdc, LOGPIXELSX), + ::GetDeviceCaps(hdc, LOGPIXELSY)); + + return CreateFontAtDPI( + wxFontInfo(wxSize(sizeInPixels, sizeInPixels)).AllFlags(flags).FaceName(facename), + dpi, col); +} + +wxGraphicsFont wxD2DRenderer::CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) +{ + wxD2DFontData* fontData = new wxD2DFontData(this, font, dpi, col); if ( !fontData->GetFont() ) { // Apparently a non-TrueType font is given and hence @@ -4901,16 +4932,6 @@ wxGraphicsFont wxD2DRenderer::CreateFont(const wxFont& font, const wxColour& col return graphicsFont; } -wxGraphicsFont wxD2DRenderer::CreateFont( - double sizeInPixels, const wxString& facename, - int flags, - const wxColour& col) -{ - return CreateFont( - wxFontInfo(wxSize(sizeInPixels, sizeInPixels)).AllFlags(flags).FaceName(facename), - col); -} - // create a sub-image from a native image representation wxGraphicsBitmap wxD2DRenderer::CreateSubBitmap(const wxGraphicsBitmap& bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h) { diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index 2ded6cf21f..1b3012d5d9 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -2778,6 +2778,9 @@ public : const wxString& facename, int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) wxOVERRIDE; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) wxOVERRIDE; // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE ; @@ -3073,6 +3076,14 @@ wxMacCoreGraphicsRenderer::CreateFont(double sizeInPixels, return f; } +wxGraphicsFont +wxMacCoreGraphicsRenderer::CreateFontAtDPI(const wxFont& font, + const wxRealPoint& WXUNUSED(dpi), + const wxColour& col) +{ + return CreateFont(font, col); +} + // // CoreGraphics Helper Methods // diff --git a/src/qt/graphics.cpp b/src/qt/graphics.cpp index c427099b08..9e0614807d 100644 --- a/src/qt/graphics.cpp +++ b/src/qt/graphics.cpp @@ -1154,6 +1154,9 @@ public: const wxString& facename, int flags = wxFONTFLAG_DEFAULT, const wxColour& col = *wxBLACK) wxOVERRIDE; + virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font, + const wxRealPoint& dpi, + const wxColour& col) wxOVERRIDE; // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap(const wxBitmap& bitmap) wxOVERRIDE; @@ -1321,6 +1324,14 @@ wxGraphicsFont wxQtGraphicsRenderer::CreateFont( return font; } +wxGraphicsFont +wxQtGraphicsRenderer::CreateFontAtDPI(const wxFont& font, + const wxRealPoint& WXUNUSED(dpi), + const wxColour& col) +{ + return CreateFont(font, col); +} + wxGraphicsBitmap wxQtGraphicsRenderer::CreateBitmap(const wxBitmap& bmp) { wxGraphicsBitmap p;