[Libreoffice-commits] core.git: vcl/inc vcl/skia

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Wed Mar 18 09:49:00 UTC 2020


 vcl/inc/skia/gdiimpl.hxx    |   10 ++++++++--
 vcl/skia/gdiimpl.cxx        |   13 ++++++++-----
 vcl/skia/win/gdiimpl.cxx    |    3 ++-
 vcl/skia/x11/textrender.cxx |    3 ++-
 4 files changed, 20 insertions(+), 9 deletions(-)

New commits:
commit 11847cc5fd22c9b98fd9c2cf1389eee6e404a4fb
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Tue Mar 17 11:53:26 2020 +0100
Commit:     Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Mar 18 10:48:35 2020 +0100

    fix glyph rotation for Skia text rendering on Windows
    
    The makes the chart descriptions in tdf#114209 and e.g. Japanese
    from the document from tdf#126169 be rotated correctly,
    
    Change-Id: I09a739fea7629000f3f49e417531bc47ba99c68f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90610
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>

diff --git a/vcl/inc/skia/gdiimpl.hxx b/vcl/inc/skia/gdiimpl.hxx
index a7de1cfc4872..630b7a138844 100644
--- a/vcl/inc/skia/gdiimpl.hxx
+++ b/vcl/inc/skia/gdiimpl.hxx
@@ -203,14 +203,20 @@ public:
     void drawBitmap(const SalTwoRect& rPosAry, const SkBitmap& aBitmap,
                     SkBlendMode eBlendMode = SkBlendMode::kSrcOver);
 
-    void drawGenericLayout(const GenericSalLayout& layout, Color textColor, const SkFont& font);
+    enum class GlyphOrientation
+    {
+        Apply,
+        Ignore
+    };
+    void drawGenericLayout(const GenericSalLayout& layout, Color textColor, const SkFont& font,
+                           GlyphOrientation glyphOrientation);
 
 protected:
     // To be called before any drawing.
     void preDraw();
     // To be called after any drawing.
     void postDraw();
-    // The canvas to drawn to. Will be diverted to a temporary for Xor mode.
+    // The canvas to draw to. Will be diverted to a temporary for Xor mode.
     SkCanvas* getDrawCanvas() { return mXorMode ? getXorCanvas() : mSurface->getCanvas(); }
 
     virtual void createSurface();
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 3bf0724de354..8ce3bf838872 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1265,7 +1265,7 @@ static double toCos(int degree10th) { return SkScalarCos(toRadian(degree10th));
 static double toSin(int degree10th) { return SkScalarSin(toRadian(degree10th)); }
 
 void SkiaSalGraphicsImpl::drawGenericLayout(const GenericSalLayout& layout, Color textColor,
-                                            const SkFont& font)
+                                            const SkFont& font, GlyphOrientation glyphOrientation)
 {
     std::vector<SkGlyphID> glyphIds;
     std::vector<SkRSXform> glyphForms;
@@ -1274,13 +1274,16 @@ void SkiaSalGraphicsImpl::drawGenericLayout(const GenericSalLayout& layout, Colo
     Point aPos;
     const GlyphItem* pGlyph;
     int nStart = 0;
-    double orientationAngle = layout.GetOrientation(); // 10th of degree
     while (layout.GetNextGlyph(&pGlyph, aPos, nStart))
     {
         glyphIds.push_back(pGlyph->glyphId());
-        double angle = orientationAngle;
-        if (pGlyph->IsVertical())
-            angle += 900; // 90 degree
+        int angle = 0; // 10th of degree
+        if (glyphOrientation == GlyphOrientation::Apply)
+        {
+            angle = layout.GetOrientation();
+            if (pGlyph->IsVertical())
+                angle += 900; // 90 degree
+        }
         SkRSXform form = SkRSXform::Make(toCos(angle), toSin(angle), aPos.X(), aPos.Y());
         glyphForms.emplace_back(std::move(form));
     }
diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index b7014ed33b48..0708c8ea633f 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -155,7 +155,8 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout)
     SkiaSalGraphicsImpl* impl = static_cast<SkiaSalGraphicsImpl*>(mWinParent.GetImpl());
     COLORREF color = ::GetTextColor(mWinParent.getHDC());
     Color salColor(GetRValue(color), GetGValue(color), GetBValue(color));
-    impl->drawGenericLayout(rLayout, salColor, font);
+    // The font already is set up to have glyphs rotated as needed.
+    impl->drawGenericLayout(rLayout, salColor, font, SkiaSalGraphicsImpl::GlyphOrientation::Ignore);
     return true;
 }
 
diff --git a/vcl/skia/x11/textrender.cxx b/vcl/skia/x11/textrender.cxx
index 02911fcf5154..a980523476b3 100644
--- a/vcl/skia/x11/textrender.cxx
+++ b/vcl/skia/x11/textrender.cxx
@@ -59,7 +59,8 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalGr
 
     assert(dynamic_cast<SkiaSalGraphicsImpl*>(rGraphics.GetImpl()));
     SkiaSalGraphicsImpl* impl = static_cast<SkiaSalGraphicsImpl*>(rGraphics.GetImpl());
-    impl->drawGenericLayout(rLayout, mnTextColor, font);
+    impl->drawGenericLayout(rLayout, mnTextColor, font,
+                            SkiaSalGraphicsImpl::GlyphOrientation::Apply);
 }
 
 void SkiaTextRender::ClearDevFontCache() { fontManager.reset(); }


More information about the Libreoffice-commits mailing list