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