Alexandre Julliard : gdi32: Fix font orientation when mirroring in compatible mode.

Alexandre Julliard julliard at winehq.org
Thu Feb 16 13:10:46 CST 2012


Module: wine
Branch: master
Commit: 691c37ca9f910a80f32cc3bff78ae7920cfce411
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=691c37ca9f910a80f32cc3bff78ae7920cfce411

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Feb 16 13:22:02 2012 +0100

gdi32: Fix font orientation when mirroring in compatible mode.

Inspired by a patch from Alexander Kochetkov.

---

 dlls/gdi32/freetype.c      |   26 +++++++++++++++++---------
 dlls/winex11.drv/xrender.c |    3 +++
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 8d99d64..ea0da85 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -3946,21 +3946,29 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
 	  lf.lfEscapement);
 
     if(dc->GraphicsMode == GM_ADVANCED)
+    {
         memcpy(&dcmat, &dc->xformWorld2Vport, sizeof(FMAT2));
+        /* Try to avoid not necessary glyph transformations */
+        if (dcmat.eM21 == 0.0 && dcmat.eM12 == 0.0 && dcmat.eM11 == dcmat.eM22)
+        {
+            lf.lfHeight *= fabs(dcmat.eM11);
+            lf.lfWidth *= fabs(dcmat.eM11);
+            dcmat.eM11 = dcmat.eM22 = 1.0;
+        }
+    }
     else
     {
         /* Windows 3.1 compatibility mode GM_COMPATIBLE has only limited
            font scaling abilities. */
-        dcmat.eM11 = dcmat.eM22 = dc->vport2WorldValid ? fabs(dc->xformWorld2Vport.eM22) : 1.0;
-        dcmat.eM21 = dcmat.eM12 = 0;
-    }
-
-    /* Try to avoid not necessary glyph transformations */
-    if (dcmat.eM21 == 0.0 && dcmat.eM12 == 0.0 && dcmat.eM11 == dcmat.eM22)
-    {
-        lf.lfHeight *= fabs(dcmat.eM11);
-        lf.lfWidth *= fabs(dcmat.eM11);
         dcmat.eM11 = dcmat.eM22 = 1.0;
+        dcmat.eM21 = dcmat.eM12 = 0;
+        if (dc->vport2WorldValid)
+        {
+            if (dc->xformWorld2Vport.eM11 * dc->xformWorld2Vport.eM22 < 0)
+                lf.lfOrientation = -lf.lfOrientation;
+            lf.lfHeight *= fabs(dc->xformWorld2Vport.eM22);
+            lf.lfWidth *= fabs(dc->xformWorld2Vport.eM22);
+        }
     }
 
     TRACE("DC transform %f %f %f %f\n", dcmat.eM11, dcmat.eM12,
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index ca76770..7c763fc 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1132,6 +1132,9 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont )
         TRACE("font transform %f %f %f %f\n", lfsz.xform.eM11, lfsz.xform.eM12,
               lfsz.xform.eM21, lfsz.xform.eM22);
 
+        if (GetGraphicsMode( dev->hdc ) == GM_COMPATIBLE && lfsz.xform.eM11 * lfsz.xform.eM22 < 0)
+            lfsz.lf.lfOrientation = -lfsz.lf.lfOrientation;
+
         /* Not used fields, would break hashing */
         lfsz.xform.eDx = lfsz.xform.eDy = 0;
 




More information about the wine-cvs mailing list