wineps.drv: Add support for TrueType composite glyph transforms.

Dmitry Timoshkov dmitry at baikal.ru
Mon Apr 1 05:47:01 CDT 2013


This patch fixes printing of Cyrillic capital letter Ya (0x042f) and other
cyrillic letters from arial.ttf font with dlls/wineps.drv/generic.ppd and
similar PPD files which specify '*TTRasterizer: None'.

For example, Cyrillic capital letter Ya (0x042f) is just a reference to
Latin capital letter R with a mirroring in x-axis transform applied.
---
 dlls/wineps.drv/type1.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/dlls/wineps.drv/type1.c b/dlls/wineps.drv/type1.c
index 01c9c7e..6855019 100644
--- a/dlls/wineps.drv/type1.c
+++ b/dlls/wineps.drv/type1.c
@@ -423,7 +423,7 @@ static BOOL append_complex_glyph(HDC hdc, const BYTE *data, glyph_outline *outli
     const BYTE *ptr = data;
     WORD flags, index;
     short arg1, arg2;
-    WORD scale_xx = 1 << 14, scale_xy = 0, scale_yx = 0, scale_yy = 1 << 14;
+    FLOAT scale_xx = 1, scale_xy = 0, scale_yx = 0, scale_yy = 1;
     WORD start_pt, end_pt;
 
     ptr += 10;
@@ -447,37 +447,44 @@ static BOOL append_complex_glyph(HDC hdc, const BYTE *data, glyph_outline *outli
         }
         if(flags & WE_HAVE_A_SCALE)
         {
-            scale_xx = scale_yy = get_be_word(ptr);
+            scale_xx = scale_yy = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
         }
         else if(flags & WE_HAVE_AN_X_AND_Y_SCALE)
         {
-            scale_xx = get_be_word(ptr);
+            scale_xx = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
-            scale_yy = get_be_word(ptr);
+            scale_yy = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
         }
         else if(flags & WE_HAVE_A_TWO_BY_TWO)
         {
-            scale_xx = get_be_word(ptr);
+            scale_xx = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
-            scale_xy = get_be_word(ptr);
+            scale_xy = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
-            scale_yx = get_be_word(ptr);
+            scale_yx = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
-            scale_yy = get_be_word(ptr);
+            scale_yy = (FLOAT)(short)get_be_word(ptr) / 0x4000;
             ptr += 2;
         }
 
-        if ((flags & (WE_HAVE_A_SCALE | WE_HAVE_AN_X_AND_Y_SCALE | WE_HAVE_A_TWO_BY_TWO)) &&
-            (scale_xx != 1 << 14 || scale_yy != 1 << 14 || scale_xy || scale_yx))
-            FIXME( "unhandled scaling %x,%x,%x,%x of glyph %x\n",
-                   scale_xx, scale_xy, scale_yx, scale_yy, index );
-
         start_pt = pts_in_outline(outline);
         append_glyph_outline(hdc, index, outline);
         end_pt = pts_in_outline(outline);
 
+        if (flags & (WE_HAVE_A_SCALE | WE_HAVE_AN_X_AND_Y_SCALE | WE_HAVE_A_TWO_BY_TWO))
+        {
+            WORD i;
+            TRACE("transform %f,%f,%f,%f of glyph %x\n", scale_xx, scale_xy, scale_yx, scale_yy, index);
+            for (i = start_pt; i < end_pt; i++)
+            {
+                LONG x = outline->pts[i].x, y = outline->pts[i].y;
+                outline->pts[i].x = x * scale_xx + y * scale_yx;
+                outline->pts[i].y = x * scale_xy + y * scale_yy;
+            }
+        }
+
         if((flags & ARGS_ARE_XY_VALUES) == 0)
         {
             WORD orig_pt = arg1, new_pt = arg2;
-- 
1.8.2




More information about the wine-patches mailing list