[gs-commits] ghostpdl branch, master, updated. ghostpdl-9.02-654-g056c8a6

Chris Liddell chrisl at ghostscript.com
Fri Oct 14 09:26:57 UTC 2011


The ghostpdl branch, master has been updated
       via  056c8a6dc2409db6ac06ead1fc1b58b277400b04 (commit)
      from  b49fc2b7fbd16c81a3480660d27d36ebe94ab6d2 (commit)

----------------------------------------------------------------------
commit 056c8a6dc2409db6ac06ead1fc1b58b277400b04
Author: Chris Liddell <chris.liddell at artifex.com>
Date:   Fri Oct 14 10:19:15 2011 +0100

    Bug 692578: improve FAPI/FT handling of non-square resolutions
    
    The previous code only worked correctly for glyphs rotated by a multiple
    of 90 degrees, any interim rotation would show a shearing effect.
    
    We'll now apply the "non-squareness" scaling in the matrix, rather in the
    resution which we pass to Freetype. We have to do this because Freetype
    treats the resolution as being in "glyph space", which means it is "incorrect"
    for any rotated/sheared glyph.
    
    No cluster differences.

diff --git a/gs/psi/fapi_ft.c b/gs/psi/fapi_ft.c
index a494ca7..88c6351 100644
--- a/gs/psi/fapi_ft.c
+++ b/gs/psi/fapi_ft.c
@@ -720,26 +720,25 @@ transform_decompose(FT_Matrix *a_transform, FT_UInt *xresp, FT_UInt *yresp,
     scaley = hypot ((double)a_transform->yx, (double)a_transform->yy);
 
     if (*xresp != *yresp) {
-        /* We need to give the resolution in "glyph space", taking account
-         * of rotation and shearing, so that makes life a little complicated
-         * when non-square resolutions are used.
+        /* To get good results, we have to pull the implicit scaling from
+         * non-square resolutions, and apply it in the matrix. This means
+         * we get the correct "shearing" effect for rotated glyphs.
+         * The previous solution was only effective for for glyphs whose
+         * axes were coincident with the axes of the page.
          */
-        ftscale_mat.xx = scalex;
+        bool use_x = true;
+                
+        if (*xresp < *yresp) {
+            use_x = false;
+        }
+
+        ftscale_mat.xx = (((double)(*xresp) / ((double)(use_x ? (*xresp) : (*yresp)))) * 65536);
         ftscale_mat.xy = ftscale_mat.yx = 0;
-        ftscale_mat.yy = scaley;
+        ftscale_mat.yy = (((double)(*yresp) / ((double)(use_x ? (*xresp) : (*yresp)))) * 65536);
 
-        FT_Matrix_Invert(&ftscale_mat);
+        FT_Matrix_Multiply (&ftscale_mat, a_transform);
 
-        FT_Matrix_Multiply (a_transform, &ftscale_mat);
-
-        vectx.x = *xresp << 16;
-        vecty.y = *yresp << 16;
-        vectx.y = vecty.x = 0;
-
-        FT_Vector_Transform (&vectx, &ftscale_mat);
-        FT_Vector_Transform (&vecty, &ftscale_mat);
-        xres = (FT_UInt)((hypot ((double)vectx.x, (double)vecty.x) * (1.0/65536.0)) + 0.5);
-        yres = (FT_UInt)((hypot ((double)vectx.y, (double)vecty.y) * (1.0/65536.0)) + 0.5);
+        xres = yres = (use_x ? (*xresp) : (*yresp));
     }
     else {
         /* Life is considerably easier when square resolutions are in use! */


Summary of changes:
 gs/psi/fapi_ft.c |   31 +++++++++++++++----------------
 1 files changed, 15 insertions(+), 16 deletions(-)



More information about the gs-commits mailing list