Commit 15e8e237e6f4d2145237d2977d93a155a08d118d

James Cloos 2009-05-29T12:59:42

Enable autohinting for glyphs rotated by multiples of 90°. * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted matrices to allow rotations by multiples of 90°, not only unrotated, possibly slanted matrices.

diff --git a/ChangeLog b/ChangeLog
index f1eba38..47d0a4e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-05-29  James Cloos <cloos@jhcloos.com>
+
+	Enable autohinting for glyphs rotated by multiples of 90°.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted
+	matrices to allow rotations by multiples of 90°, not only unrotated,
+	possibly slanted matrices.
+
 2009-05-28  Werner Lemberg  <wl@gnu.org>
 
 	Remove compiler warning.
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 613deef..6e357bb 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -588,27 +588,29 @@
      * Determine whether we need to auto-hint or not.
      * The general rules are:
      *
-     * - Do only auto-hinting if we have a hinter module,
-     *   a scalable font format dealing with outlines,
-     *   and no transforms except simple slants.
+     * - Do only auto-hinting if we have a hinter module, a scalable font
+     *   format dealing with outlines, and no transforms except simple
+     *   slants and/or rotations by integer multiples of 90 degrees.
      *
-     * - Then, autohint if FT_LOAD_FORCE_AUTOHINT is set
-     *   or if we don't have a native font hinter.
+     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
+     *   have a native font hinter.
      *
      * - Otherwise, auto-hint for LIGHT hinting mode.
      *
-     * - Exception: The font is `tricky' and requires
-     *   the native hinter to load properly.
+     * - Exception: The font is `tricky' and requires the native hinter to
+     *   load properly.
      */
 
-    if ( hinter                                   &&
-         !( load_flags & FT_LOAD_NO_HINTING )     &&
-         !( load_flags & FT_LOAD_NO_AUTOHINT )    &&
-         FT_DRIVER_IS_SCALABLE( driver )          &&
-         FT_DRIVER_USES_OUTLINES( driver )        &&
-         !FT_IS_TRICKY( face )                    &&
-         face->internal->transform_matrix.yy > 0  &&
-         face->internal->transform_matrix.yx == 0 )
+    if ( hinter                                           &&
+         !( load_flags & FT_LOAD_NO_HINTING )             &&
+         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&
+         FT_DRIVER_IS_SCALABLE( driver )                  &&
+         FT_DRIVER_USES_OUTLINES( driver )                &&
+         !FT_IS_TRICKY( face )                            &&
+         ( ( face->internal->transform_matrix.yx == 0 &&
+             face->internal->transform_matrix.xx != 0 ) ||
+           ( face->internal->transform_matrix.xx == 0 &&
+             face->internal->transform_matrix.yx != 0 ) ) )
     {
       if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
            !FT_DRIVER_HAS_HINTER( driver )         )