vcl/win/gdi/DWriteTextRenderer.cxx |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

New commits:
commit 3f2d56d486da2006e24444cfa6f2f63700a14fae
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu May 2 14:23:53 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Fri May 3 03:51:45 2024 +0200

    tdf#160901: partially revert 8557ea84c9336ba8061246f1f46ddb6e02f413a1
    
    It turns out, that the horizontal scale is needed in the applied transform.
    
    Change-Id: Ic07e015f0ddeee3d66653b683d83435d04b9ab81
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167004
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/vcl/win/gdi/DWriteTextRenderer.cxx 
b/vcl/win/gdi/DWriteTextRenderer.cxx
index 37c8f2aa217b..8a62f2d73fd9 100644
--- a/vcl/win/gdi/DWriteTextRenderer.cxx
+++ b/vcl/win/gdi/DWriteTextRenderer.cxx
@@ -311,19 +311,32 @@ 
WinFontTransformGuard::WinFontTransformGuard(ID2D1RenderTarget* pRenderTarget,
                                              bool bIsVertical)
     : mpRenderTarget(pRenderTarget)
 {
+    const float hscale = [&font = rLayout.GetFont()]
+    {
+        const auto& rPattern = font.GetFontSelectPattern();
+        if (!rPattern.mnHeight || !rPattern.mnWidth)
+            return 1.0;
+        return rPattern.mnWidth * font.GetAverageWidthFactor() / 
rPattern.mnHeight;
+    }();
+
     Degree10 angle = rLayout.GetOrientation();
     if (bIsVertical)
         angle += 900_deg10;
 
-    if (angle)
+    if (hscale != 1.0f || angle)
     {
         D2D1::Matrix3x2F aTransform;
         pRenderTarget->GetTransform(&aTransform);
         moTransform = aTransform;
 
+        if (hscale != 1.0f) // basegfx::fTools::equal is useless with float
+            aTransform = aTransform * D2D1::Matrix3x2F::Scale(hscale, 1.0f, { 
0, 0 });
+
         // DWrite angle is in clockwise degrees, our orientation is in 
counter-clockwise 10th
         // degrees.
-        aTransform = aTransform * 
D2D1::Matrix3x2F::Rotation(-toDegrees(angle), rBaseline);
+        if (angle)
+            aTransform = aTransform * 
D2D1::Matrix3x2F::Rotation(-toDegrees(angle), rBaseline);
+
         mpRenderTarget->SetTransform(aTransform);
     }
 }

Reply via email to