Module: wine Branch: master Commit: 691c37ca9f910a80f32cc3bff78ae7920cfce411 URL: http://source.winehq.org/git/wine.git/?a=commit;h=691c37ca9f910a80f32cc3bff7...
Author: Alexandre Julliard julliard@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;