vcl/skia/osx/gdiimpl.cxx                |    4 ++++
 vcl/skia/win/gdiimpl.cxx                |    4 ++++
 vcl/skia/x11/textrender.cxx             |    2 ++
 vcl/unx/generic/gdi/cairotextrender.cxx |   21 +++++++++++++++------
 4 files changed, 25 insertions(+), 6 deletions(-)

New commits:
commit 4059cb5dbec67d17a636b03e6f6344ca313516fa
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Sun Sep 4 21:26:22 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Mon Sep 5 16:02:29 2022 +0200

    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 <caol...@redhat.com>

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)

Reply via email to