diff options
author | Luboš Luňák <l.lunak@centrum.cz> | 2021-04-07 12:48:35 +0000 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2021-04-07 17:01:40 +0200 |
commit | 43bcc236d8253dff80b0911836fe73504b561f9a (patch) | |
tree | bc17ffa56e26032cbecde7a0e5ad56b34a81f7d1 /vcl/skia/win/gdiimpl.cxx | |
parent | f99b3119640385cae16b22716aa9d3b2b0240586 (diff) |
cache Skia font
The conversion costs a little bit and it was done for each drawing.
Change-Id: Ifaad42308213f15839d9277beb837d21535bfc25
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113735
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl/skia/win/gdiimpl.cxx')
-rw-r--r-- | vcl/skia/win/gdiimpl.cxx | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx index 6b09375c4138..94162bb55fbe 100644 --- a/vcl/skia/win/gdiimpl.cxx +++ b/vcl/skia/win/gdiimpl.cxx @@ -13,7 +13,7 @@ #include <vcl/skia/SkiaHelper.hxx> #include <skia/utils.hxx> #include <skia/zone.hxx> -#include <win/winlayout.hxx> +#include <skia/win/font.hxx> #include <comphelper/windowserrorstring.hxx> #include <SkCanvas.h> @@ -199,11 +199,9 @@ sk_sp<SkTypeface> WinSkiaSalGraphicsImpl::createDirectWriteTypeface(HDC hdc, HFO bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout) { - const WinFontInstance& rWinFont = static_cast<const WinFontInstance&>(rLayout.GetFont()); - float fHScale = rWinFont.getHScale(); - - assert(dynamic_cast<const WinFontInstance*>(&rLayout.GetFont())); - const WinFontInstance* pWinFont = static_cast<const WinFontInstance*>(&rLayout.GetFont()); + assert(dynamic_cast<const SkiaWinFontInstance*>(&rLayout.GetFont())); + const SkiaWinFontInstance* pWinFont + = static_cast<const SkiaWinFontInstance*>(&rLayout.GetFont()); const HFONT hLayoutFont = pWinFont->GetHFONT(); LOGFONTW logFont; if (GetObjectW(hLayoutFont, sizeof(logFont), &logFont) == 0) @@ -211,12 +209,18 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout) assert(false); return false; } - sk_sp<SkTypeface> typeface = createDirectWriteTypeface(mWinParent.getHDC(), hLayoutFont); - GlyphOrientation glyphOrientation = GlyphOrientation::Apply; - if (!typeface) // fall back to GDI text rendering + sk_sp<SkTypeface> typeface = pWinFont->GetSkiaTypeface(); + if (!typeface) { - typeface.reset(SkCreateTypefaceFromLOGFONT(logFont)); - glyphOrientation = GlyphOrientation::Ignore; + typeface = createDirectWriteTypeface(mWinParent.getHDC(), hLayoutFont); + bool dwrite = true; + if (!typeface) // fall back to GDI text rendering + { + typeface.reset(SkCreateTypefaceFromLOGFONT(logFont)); + dwrite = false; + } + // Cache the typeface. + const_cast<SkiaWinFontInstance*>(pWinFont)->SetSkiaTypeface(typeface, dwrite); } // lfHeight actually depends on DPI, so it's not really font height as such, // but for LOGFONT-based typefaces Skia simply sets lfHeight back to this value @@ -224,14 +228,15 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout) double fontHeight = logFont.lfHeight; if (fontHeight < 0) fontHeight = -fontHeight; - SkFont font(typeface, fontHeight, fHScale, 0); + SkFont font(typeface, fontHeight, pWinFont->getHScale(), 0); font.setEdging(fontEdging); assert(dynamic_cast<SkiaSalGraphicsImpl*>(mWinParent.GetImpl())); SkiaSalGraphicsImpl* impl = static_cast<SkiaSalGraphicsImpl*>(mWinParent.GetImpl()); COLORREF color = ::GetTextColor(mWinParent.getHDC()); Color salColor(GetRValue(color), GetGValue(color), GetBValue(color)); - // The font already is set up to have glyphs rotated as needed. - impl->drawGenericLayout(rLayout, salColor, font, glyphOrientation); + impl->drawGenericLayout(rLayout, salColor, font, + pWinFont->GetSkiaDWrite() ? GlyphOrientation::Apply + : GlyphOrientation::Ignore); return true; } |