Add wxGraphicsRenderer::CreateFontAtDPI to support font with fractional pixel-size

This commit is contained in:
Maarten Bent
2019-10-04 23:02:09 +02:00
parent 64f4963396
commit c538e8f9d6
8 changed files with 118 additions and 30 deletions

View File

@@ -727,7 +727,7 @@ public:
} }
// returns the resolution of the graphics context in device points per inch // 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 #if 0
// sets the current alpha on this context // sets the current alpha on this context
@@ -1038,6 +1038,9 @@ public:
const wxString& facename, const wxString& facename,
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) = 0; const wxColour& col = *wxBLACK) = 0;
virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font,
const wxRealPoint& dpi,
const wxColour& col = *wxBLACK) = 0;
// create a native bitmap representation // create a native bitmap representation
virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0;

View File

@@ -1116,7 +1116,7 @@ public:
/** /**
Returns the resolution of the graphics context in device points per inch. 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. Returns the associated window if any.
@@ -1459,6 +1459,17 @@ public:
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) = 0; 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. Creates a native brush with a linear gradient.

View File

@@ -619,7 +619,7 @@ wxDouble wxGraphicsContext::GetAlpha() const
} }
#endif #endif
void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY) void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY) const
{ {
if ( m_window ) if ( m_window )
{ {
@@ -944,7 +944,9 @@ wxGraphicsContext::CreateRadialGradientBrush(
wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColour &col ) const 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 wxGraphicsFont

View File

@@ -3009,6 +3009,9 @@ public :
const wxString& facename, const wxString& facename,
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) wxOVERRIDE; const wxColour& col = *wxBLACK) wxOVERRIDE;
virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font,
const wxRealPoint& dpi,
const wxColour& col) wxOVERRIDE;
// create a native bitmap representation // create a native bitmap representation
virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE; virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE;
@@ -3238,6 +3241,14 @@ wxCairoRenderer::CreateFont(double sizeInPixels,
return font; 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 wxCairoRenderer::CreateBitmap( const wxBitmap& bmp )
{ {
wxGraphicsBitmap p; wxGraphicsBitmap p;

View File

@@ -342,6 +342,7 @@ class wxGDIPlusFontData : public wxGraphicsObjectRefData
public: public:
wxGDIPlusFontData( wxGraphicsRenderer* renderer, wxGDIPlusFontData( wxGraphicsRenderer* renderer,
const wxFont &font, const wxFont &font,
const wxRealPoint& dpi,
const wxColour& col ); const wxColour& col );
wxGDIPlusFontData(wxGraphicsRenderer* renderer, wxGDIPlusFontData(wxGraphicsRenderer* renderer,
const wxString& name, const wxString& name,
@@ -661,6 +662,10 @@ public :
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) wxOVERRIDE; 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 // create a graphics bitmap from a native bitmap
virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ) wxOVERRIDE; virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ) wxOVERRIDE;
@@ -1144,6 +1149,7 @@ wxGDIPlusFontData::Init(const wxString& name,
wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer, wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer,
const wxFont &font, const wxFont &font,
const wxRealPoint& dpi,
const wxColour& col ) const wxColour& col )
: wxGraphicsObjectRefData( renderer ) : wxGraphicsObjectRefData( renderer )
{ {
@@ -1157,7 +1163,11 @@ wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer,
if ( font.GetWeight() == wxFONTWEIGHT_BOLD ) if ( font.GetWeight() == wxFONTWEIGHT_BOLD )
style |= FontStyleBold; 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, wxGDIPlusFontData::wxGDIPlusFontData(wxGraphicsRenderer* renderer,
@@ -2720,15 +2730,7 @@ wxGraphicsFont
wxGDIPlusRenderer::CreateFont( const wxFont &font, wxGDIPlusRenderer::CreateFont( const wxFont &font,
const wxColour &col ) const wxColour &col )
{ {
ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); return CreateFontAtDPI(font, wxRealPoint(), col);
if ( font.IsOk() )
{
wxGraphicsFont p;
p.SetRefData(new wxGDIPlusFontData( this, font, col ));
return p;
}
else
return wxNullGraphicsFont;
} }
wxGraphicsFont wxGraphicsFont
@@ -2756,6 +2758,22 @@ wxGDIPlusRenderer::CreateFont(double sizeInPixels,
return f; 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 ) wxGraphicsBitmap wxGDIPlusRenderer::CreateBitmap( const wxBitmap &bitmap )
{ {
ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap);

View File

@@ -2792,7 +2792,7 @@ wxD2DPenData* wxGetD2DPenData(const wxGraphicsPen& pen)
class wxD2DFontData : public wxGraphicsObjectRefData class wxD2DFontData : public wxGraphicsObjectRefData
{ {
public: public:
wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxColor& color); wxD2DFontData(wxGraphicsRenderer* renderer, const wxFont& font, const wxRealPoint& dpi, const wxColor& color);
wxCOMPtr<IDWriteTextLayout> CreateTextLayout(const wxString& text) const; wxCOMPtr<IDWriteTextLayout> CreateTextLayout(const wxString& text) const;
@@ -2817,7 +2817,7 @@ private:
bool m_strikethrough; 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)), wxGraphicsObjectRefData(renderer), m_brushData(renderer, wxBrush(color)),
m_underlined(font.GetUnderlined()), m_strikethrough(font.GetStrikethrough()) 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); hr = familyNames->GetString(0, name, length+1);
wxCHECK_HRESULT_RET(hr); wxCHECK_HRESULT_RET(hr);
FLOAT fontSize = (FLOAT)(!dpi.y
? font.GetPixelSize().GetHeight()
: (font.GetFractionalPointSize() * dpi.y / 72.0f));
hr = wxDWriteFactory()->CreateTextFormat( hr = wxDWriteFactory()->CreateTextFormat(
name, name,
NULL, NULL,
m_font->GetWeight(), m_font->GetWeight(),
m_font->GetStyle(), m_font->GetStyle(),
m_font->GetStretch(), m_font->GetStretch(),
(FLOAT)(font.GetPixelSize().GetHeight()), fontSize,
L"en-us", L"en-us",
&m_textFormat); &m_textFormat);
@@ -3644,7 +3648,7 @@ public:
void Flush() wxOVERRIDE; void Flush() wxOVERRIDE;
void GetDPI(wxDouble* dpiX, wxDouble* dpiY) wxOVERRIDE; void GetDPI(wxDouble* dpiX, wxDouble* dpiY) const wxOVERRIDE;
wxD2DContextSupplier::ContextType GetContext() wxOVERRIDE wxD2DContextSupplier::ContextType GetContext() wxOVERRIDE
{ {
@@ -4570,7 +4574,7 @@ void wxD2DContext::Flush()
GetRenderTarget()->SetTransform(&currTransform); GetRenderTarget()->SetTransform(&currTransform);
} }
void wxD2DContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) void wxD2DContext::GetDPI(wxDouble* dpiX, wxDouble* dpiY) const
{ {
FLOAT x, y; FLOAT x, y;
GetRenderTarget()->GetDpi(&x, &y); GetRenderTarget()->GetDpi(&x, &y);
@@ -4653,6 +4657,10 @@ public :
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) wxOVERRIDE; 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 // create a graphics bitmap from a native bitmap
wxGraphicsBitmap CreateBitmapFromNativeBitmap(void* bitmap) wxOVERRIDE; wxGraphicsBitmap CreateBitmapFromNativeBitmap(void* bitmap) wxOVERRIDE;
@@ -4886,7 +4894,30 @@ wxImage wxD2DRenderer::CreateImageFromBitmap(const wxGraphicsBitmap& bmp)
wxGraphicsFont wxD2DRenderer::CreateFont(const wxFont& font, const wxColour& col) 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() ) if ( !fontData->GetFont() )
{ {
// Apparently a non-TrueType font is given and hence // Apparently a non-TrueType font is given and hence
@@ -4901,16 +4932,6 @@ wxGraphicsFont wxD2DRenderer::CreateFont(const wxFont& font, const wxColour& col
return graphicsFont; 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 // create a sub-image from a native image representation
wxGraphicsBitmap wxD2DRenderer::CreateSubBitmap(const wxGraphicsBitmap& bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h) wxGraphicsBitmap wxD2DRenderer::CreateSubBitmap(const wxGraphicsBitmap& bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h)
{ {

View File

@@ -2778,6 +2778,9 @@ public :
const wxString& facename, const wxString& facename,
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) wxOVERRIDE; const wxColour& col = *wxBLACK) wxOVERRIDE;
virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font,
const wxRealPoint& dpi,
const wxColour& col) wxOVERRIDE;
// create a native bitmap representation // create a native bitmap representation
virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE ; virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) wxOVERRIDE ;
@@ -3073,6 +3076,14 @@ wxMacCoreGraphicsRenderer::CreateFont(double sizeInPixels,
return f; return f;
} }
wxGraphicsFont
wxMacCoreGraphicsRenderer::CreateFontAtDPI(const wxFont& font,
const wxRealPoint& WXUNUSED(dpi),
const wxColour& col)
{
return CreateFont(font, col);
}
// //
// CoreGraphics Helper Methods // CoreGraphics Helper Methods
// //

View File

@@ -1154,6 +1154,9 @@ public:
const wxString& facename, const wxString& facename,
int flags = wxFONTFLAG_DEFAULT, int flags = wxFONTFLAG_DEFAULT,
const wxColour& col = *wxBLACK) wxOVERRIDE; const wxColour& col = *wxBLACK) wxOVERRIDE;
virtual wxGraphicsFont CreateFontAtDPI(const wxFont& font,
const wxRealPoint& dpi,
const wxColour& col) wxOVERRIDE;
// create a native bitmap representation // create a native bitmap representation
virtual wxGraphicsBitmap CreateBitmap(const wxBitmap& bitmap) wxOVERRIDE; virtual wxGraphicsBitmap CreateBitmap(const wxBitmap& bitmap) wxOVERRIDE;
@@ -1321,6 +1324,14 @@ wxGraphicsFont wxQtGraphicsRenderer::CreateFont(
return font; 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 wxQtGraphicsRenderer::CreateBitmap(const wxBitmap& bmp)
{ {
wxGraphicsBitmap p; wxGraphicsBitmap p;