vcl/skia/gdiimpl.cxx        |   15 ++++++++-------
 vcl/skia/win/gdiimpl.cxx    |   31 +++++++++++++------------------
 vcl/skia/x11/textrender.cxx |   10 +++++-----
 3 files changed, 26 insertions(+), 30 deletions(-)

New commits:
commit 2b427f319a7a95c48beda13913a067d24bd82cf8
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sun Mar 31 10:57:43 2024 +0100
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sun Mar 31 15:38:56 2024 +0200

    Simplify a bit
    
    And make font size calculations consistent between SkiaTextRender (x11)
    and WinSkiaSalGraphicsImpl (win). They already did ~the same, the win
    case just used an intermediate 'getHScale' coefficient.
    
    Change-Id: I90ad4d9c49427465ef3263843b34bd9bc0d762eb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165488
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index 651f294add0e..0451307b7bdf 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -217,19 +217,21 @@ catch (const sal::systools::ComError& e)
 bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout)
 {
     assert(dynamic_cast<SkiaWinFontInstance*>(&rLayout.GetFont()));
-    SkiaWinFontInstance* pWinFont = 
static_cast<SkiaWinFontInstance*>(&rLayout.GetFont());
-    const HFONT hLayoutFont = pWinFont->GetHFONT();
-    double hScale = pWinFont->getHScale();
+    SkiaWinFontInstance& rWinFont = 
static_cast<SkiaWinFontInstance&>(rLayout.GetFont());
+    const vcl::font::FontSelectPattern& rFSD = rWinFont.GetFontSelectPattern();
+    if (rFSD.mnHeight == 0)
+        return false;
+    const HFONT hLayoutFont = rWinFont.GetHFONT();
     LOGFONTW logFont;
     if (GetObjectW(hLayoutFont, sizeof(logFont), &logFont) == 0)
     {
         assert(false);
         return false;
     }
-    sk_sp<SkTypeface> typeface = pWinFont->GetSkiaTypeface();
+    sk_sp<SkTypeface> typeface = rWinFont.GetSkiaTypeface();
     if (!typeface)
     {
-        typeface = createDirectWriteTypeface(pWinFont);
+        typeface = createDirectWriteTypeface(&rWinFont);
         bool dwrite = true;
         if (!typeface) // fall back to GDI text rendering
         {
@@ -250,7 +252,7 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const 
GenericSalLayout& rLayout)
                 return false;
         }
         // Cache the typeface.
-        pWinFont->SetSkiaTypeface(typeface, dwrite);
+        rWinFont.SetSkiaTypeface(typeface, dwrite);
     }
 
     SkFont font(typeface);
@@ -267,21 +269,14 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const 
GenericSalLayout& rLayout)
     font.setEdging(logFont.lfQuality == NONANTIALIASED_QUALITY ? 
SkFont::Edging::kAlias
                                                                : 
ePreferredAliasing);
 
-    const vcl::font::FontSelectPattern& rFSD = 
pWinFont->GetFontSelectPattern();
-    int nHeight = rFSD.mnHeight;
-    int nWidth = rFSD.mnWidth ? rFSD.mnWidth : nHeight;
-    if (nWidth == 0 || nHeight == 0)
-        return false;
+    double nHeight = rFSD.mnHeight;
+    double nWidth = rFSD.mnWidth ? rFSD.mnWidth * 
rWinFont.GetAverageWidthFactor() : nHeight;
     font.setSize(nHeight);
-    font.setScaleX(hScale);
+    font.setScaleX(nWidth / nHeight);
 
-    // Unlike with Freetype-based font handling, use height even in vertical 
mode,
-    // additionally multiply it by horizontal scale to get the proper
-    // size and then scale the width back, otherwise the height would
-    // not be correct. I don't know why this is inconsistent.
     SkFont verticalFont(font);
-    verticalFont.setSize(nHeight * hScale);
-    verticalFont.setScaleX(1.0 / hScale);
+    verticalFont.setSize(nWidth);
+    verticalFont.setScaleX(nHeight / nWidth);
 
     assert(dynamic_cast<SkiaSalGraphicsImpl*>(mWinParent.GetImpl()));
     SkiaSalGraphicsImpl* impl = 
static_cast<SkiaSalGraphicsImpl*>(mWinParent.GetImpl());
diff --git a/vcl/skia/x11/textrender.cxx b/vcl/skia/x11/textrender.cxx
index acc930e070e5..425710626fb5 100644
--- a/vcl/skia/x11/textrender.cxx
+++ b/vcl/skia/x11/textrender.cxx
@@ -51,10 +51,10 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& 
rLayout, const SalGr
     const FreetypeFontInstance& rInstance = 
static_cast<FreetypeFontInstance&>(rLayout.GetFont());
     const FreetypeFont& rFont = rInstance.GetFreetypeFont();
     const vcl::font::FontSelectPattern& rFSD = 
rInstance.GetFontSelectPattern();
-    int nHeight = rFSD.mnHeight;
-    int nWidth = rFSD.mnWidth ? rFSD.mnWidth : nHeight;
-    if (nWidth == 0 || nHeight == 0)
+    if (rFSD.mnHeight == 0)
         return;
+    double nHeight = rFSD.mnHeight;
+    double nWidth = rFSD.mnWidth ? rFSD.mnWidth : nHeight;
 
     if (!fontManager)
     {
@@ -65,7 +65,7 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& 
rLayout, const SalGr
         = SkFontMgr_createTypefaceFromFcPattern(fontManager, 
rFont.GetFontOptions()->GetPattern());
     SkFont font(typeface);
     font.setSize(nHeight);
-    font.setScaleX(1.0 * nWidth / nHeight);
+    font.setScaleX(nWidth / nHeight);
     if (rInstance.NeedsArtificialItalic())
         font.setSkewX(-1.0 * ARTIFICIAL_ITALIC_SKEW);
     if (rInstance.NeedsArtificialBold())
@@ -94,7 +94,7 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& 
rLayout, const SalGr
     // Vertical font, use width as "height".
     SkFont verticalFont(font);
     verticalFont.setSize(nWidth);
-    verticalFont.setScaleX(1.0 * nHeight / nWidth);
+    verticalFont.setScaleX(nHeight / nWidth);
 
     assert(dynamic_cast<SkiaSalGraphicsImpl*>(rGraphics.GetImpl()));
     SkiaSalGraphicsImpl* impl = 
static_cast<SkiaSalGraphicsImpl*>(rGraphics.GetImpl());
commit e2717b81ff55f43a3953761b55b714ad0bf558ac
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sun Mar 31 07:49:23 2024 +0100
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sun Mar 31 15:38:51 2024 +0200

    Optimize trigonometry a bit
    
    Change-Id: I2b06c29f6090233325c7ca24fac6d76190d502ab
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165486
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index bc29920f1626..fd03e4fd2e68 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -2147,8 +2147,8 @@ bool SkiaSalGraphicsImpl::implDrawGradient(const 
basegfx::B2DPolyPolygon& rPolyP
 }
 
 static double toRadian(Degree10 degree10th) { return toRadians(3600_deg10 - 
degree10th); }
-static double toCos(Degree10 degree10th) { return 
SkScalarCos(toRadian(degree10th)); }
-static double toSin(Degree10 degree10th) { return 
SkScalarSin(toRadian(degree10th)); }
+static auto toCos(Degree10 degree10th) { return 
SkScalarCos(toRadian(degree10th)); }
+static auto toSin(Degree10 degree10th) { return 
SkScalarSin(toRadian(degree10th)); }
 
 void SkiaSalGraphicsImpl::drawGenericLayout(const GenericSalLayout& layout, 
Color textColor,
                                             const SkFont& font, const SkFont& 
verticalFont)
@@ -2163,15 +2163,16 @@ void SkiaSalGraphicsImpl::drawGenericLayout(const 
GenericSalLayout& layout, Colo
     basegfx::B2DPoint aPos;
     const GlyphItem* pGlyph;
     int nStart = 0;
+    auto cos = toCos(layout.GetOrientation());
+    auto sin = toSin(layout.GetOrientation());
     while (layout.GetNextGlyph(&pGlyph, aPos, nStart))
     {
         glyphIds.push_back(pGlyph->glyphId());
-        Degree10 angle = layout.GetOrientation();
-        if (pGlyph->IsVertical())
-            angle += 900_deg10;
-        SkRSXform form = SkRSXform::Make(toCos(angle), toSin(angle), 
aPos.getX(), aPos.getY());
-        glyphForms.emplace_back(std::move(form));
         verticals.emplace_back(pGlyph->IsVertical());
+        auto cos1 = pGlyph->IsVertical() ? sin : cos; // cos (x - 90) = sin (x)
+        auto sin1 = pGlyph->IsVertical() ? -cos : sin; // sin (x - 90) = -cos 
(x)
+        SkRSXform form = SkRSXform::Make(cos1, sin1, aPos.getX(), aPos.getY());
+        glyphForms.emplace_back(std::move(form));
     }
     if (glyphIds.empty())
         return;

Reply via email to