summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-09-04 21:26:22 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-09-05 16:02:29 +0200
commit4059cb5dbec67d17a636b03e6f6344ca313516fa (patch)
tree3df1bf4f6163c853724e94d0e5c45cc7d9c525f2 /vcl
parentd2873a0510d620de06ac3d4d30aabc9ab73ffe21 (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.cxx4
-rw-r--r--vcl/skia/win/gdiimpl.cxx4
-rw-r--r--vcl/skia/x11/textrender.cxx2
-rw-r--r--vcl/unx/generic/gdi/cairotextrender.cxx21
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)