summaryrefslogtreecommitdiff
path: root/vcl/skia/win/gdiimpl.cxx
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@centrum.cz>2021-04-07 12:48:35 +0000
committerLuboš Luňák <l.lunak@collabora.com>2021-04-07 17:01:40 +0200
commit43bcc236d8253dff80b0911836fe73504b561f9a (patch)
treebc17ffa56e26032cbecde7a0e5ad56b34a81f7d1 /vcl/skia/win/gdiimpl.cxx
parentf99b3119640385cae16b22716aa9d3b2b0240586 (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.cxx33
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;
}