diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-09-04 21:26:22 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-09-05 16:02:29 +0200 |
commit | 4059cb5dbec67d17a636b03e6f6344ca313516fa (patch) | |
tree | 3df1bf4f6163c853724e94d0e5c45cc7d9c525f2 /vcl | |
parent | d2873a0510d620de06ac3d4d30aabc9ab73ffe21 (diff) |
tdf#150507 like skia, even when subpixel rendering snap to a pixel Baseline
Change-Id: Iaf064b483d65d25251f733cc6a67d9f1863bb64c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139380
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/skia/osx/gdiimpl.cxx | 4 | ||||
-rw-r--r-- | vcl/skia/win/gdiimpl.cxx | 4 | ||||
-rw-r--r-- | vcl/skia/x11/textrender.cxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/cairotextrender.cxx | 21 |
4 files changed, 25 insertions, 6 deletions
diff --git a/vcl/skia/osx/gdiimpl.cxx b/vcl/skia/osx/gdiimpl.cxx index f8bcdd68352e..ffc84ae89006 100644 --- a/vcl/skia/osx/gdiimpl.cxx +++ b/vcl/skia/osx/gdiimpl.cxx @@ -313,7 +313,11 @@ void AquaSkiaSalGraphicsImpl::drawTextLayout(const GenericSalLayout& rLayout, SkFont::Edging ePreferredAliasing = bSubpixelPositioning ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAntiAlias; if (bSubpixelPositioning) + { + // note that SkFont defaults to a BaselineSnap of true, so I think really only + // subpixel in text direction font.setSubpixel(true); + } font.setEdging(mrShared.mbNonAntialiasedText ? SkFont::Edging::kAlias : ePreferredAliasing); // Vertical font, use width as "height". diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx index 27a915db1f93..692ad36b9eb2 100644 --- a/vcl/skia/win/gdiimpl.cxx +++ b/vcl/skia/win/gdiimpl.cxx @@ -271,7 +271,11 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout) SkFont::Edging ePreferredAliasing = bSubpixelPositioning ? SkFont::Edging::kSubpixelAntiAlias : fontEdging; if (bSubpixelPositioning) + { + // note that SkFont defaults to a BaselineSnap of true, so I think really only + // subpixel in text direction font.setSubpixel(true); + } font.setEdging(logFont.lfQuality == NONANTIALIASED_QUALITY ? SkFont::Edging::kAlias : ePreferredAliasing); diff --git a/vcl/skia/x11/textrender.cxx b/vcl/skia/x11/textrender.cxx index 7be518e96c92..153551e12ddd 100644 --- a/vcl/skia/x11/textrender.cxx +++ b/vcl/skia/x11/textrender.cxx @@ -60,6 +60,8 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalGr = bSubpixelPositioning ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAntiAlias; if (bSubpixelPositioning) { + // note that SkFont defaults to a BaselineSnap of true, so I think really only + // subpixel in text direction font.setSubpixel(true); SkFontHinting eHinting = font.getHinting(); diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx index 3f43591b97a3..1e971bf37efe 100644 --- a/vcl/unx/generic/gdi/cairotextrender.cxx +++ b/vcl/unx/generic/gdi/cairotextrender.cxx @@ -165,6 +165,8 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG const FreetypeFontInstance& rInstance = static_cast<FreetypeFontInstance&>(rLayout.GetFont()); const FreetypeFont& rFont = rInstance.GetFreetypeFont(); + const bool bResolutionIndependentLayoutEnabled = rLayout.GetTextRenderModeForResolutionIndependentLayout(); + std::vector<cairo_glyph_t> cairo_glyphs; std::vector<int> glyph_extrarotation; cairo_glyphs.reserve( 256 ); @@ -178,12 +180,20 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG aGlyph.index = pGlyph->glyphId(); aGlyph.x = aPos.getX(); aGlyph.y = aPos.getY(); - cairo_glyphs.push_back(aGlyph); - if (pGlyph->IsVertical()) - glyph_extrarotation.push_back(1); - else - glyph_extrarotation.push_back(0); + const bool bVertical = pGlyph->IsVertical(); + glyph_extrarotation.push_back(bVertical ? 1 : 0); + + // tdf#150507 like skia even when subpixel rendering snap to a pixel Baseline + if (bResolutionIndependentLayoutEnabled) + { + if (!bVertical) + aGlyph.y = std::floor(aGlyph.y + 0.5); + else + aGlyph.x = std::floor(aGlyph.x + 0.5); + } + + cairo_glyphs.push_back(aGlyph); } if (cairo_glyphs.empty()) @@ -226,7 +236,6 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); const bool bDisableAA = !rStyleSettings.GetUseFontAAFromSystem() && !rGraphics.getAntiAlias(); - const bool bResolutionIndependentLayoutEnabled = rLayout.GetTextRenderModeForResolutionIndependentLayout(); const cairo_font_options_t* pFontOptions = GetSalInstance()->GetCairoFontOptions(); if (pFontOptions || bDisableAA || bResolutionIndependentLayoutEnabled) |