Commit 8b76eaf092f2b100f9a111c429d2c71c0a76fe91

Werner Lemberg 2015-10-15T18:28:43

* src/tools/ftfuzzer/ftfuzzer.cc: Handle fixed sizes (#46211).

diff --git a/ChangeLog b/ChangeLog
index ef51026..0edd845 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-15  Bungeman  <bungeman@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Handle fixed sizes (#46211).
+
 2015-10-15  Werner Lemberg  <wl@gnu.org>
 
 	[base] Compute MD5 checksums only if explicitly requested.
diff --git a/src/tools/ftfuzzer/ftfuzzer.cc b/src/tools/ftfuzzer/ftfuzzer.cc
index c4f5977..e5ab293 100644
--- a/src/tools/ftfuzzer/ftfuzzer.cc
+++ b/src/tools/ftfuzzer/ftfuzzer.cc
@@ -131,42 +131,59 @@ using namespace std;
                                  &face ) )
           continue;
 
-        // set up 20pt at 72dpi as an arbitrary size
-        FT_Set_Char_Size( face, 20, 20, 72, 72 );
-
-        // test MM interface only for a face without a selected instance
-        if ( instance_index == 0 )
-          setIntermediateAxis( face );
-
-        // loop over all glyphs
-        for ( unsigned int  glyph_index = 0;
-              glyph_index < (unsigned int)face->num_glyphs;
-              glyph_index++ )
+        // loop over all bitmap stroke sizes
+        // and an arbitrary size for outlines
+        for ( long  fixed_sizes_index = 0;
+              fixed_sizes_index < face->num_fixed_sizes + 1;
+              fixed_sizes_index++ )
         {
-          if ( FT_Load_Glyph( face, glyph_index, load_flags ) )
-            continue;
-
-          // Rendering is the most expensive and the least interesting part.
-          //
-          // if ( FT_Render_Glyph( face->glyph, render_mode) )
-          //   continue;
-          // FT_GlyphSlot_Embolden( face->glyph );
+          FT_Int32  flags = load_flags;
+
+          if ( !fixed_sizes_index )
+          {
+            // set up 20pt at 72dpi as an arbitrary size
+            FT_Set_Char_Size( face, 20, 20, 72, 72 );
+            flags |= FT_LOAD_NO_BITMAP;
+          }
+          else
+          {
+            FT_Select_Size( face, fixed_sizes_index - 1 );
+            flags |= FT_LOAD_COLOR;
+          }
+
+          // test MM interface only for a face without a selected instance
+          if ( instance_index == 0 )
+            setIntermediateAxis( face );
+
+          // loop over all glyphs
+          for ( unsigned int  glyph_index = 0;
+                glyph_index < (unsigned int)face->num_glyphs;
+                glyph_index++ )
+          {
+            if ( FT_Load_Glyph( face, glyph_index, flags ) )
+              continue;
+
+            // Rendering is the most expensive and the least interesting part.
+            //
+            // if ( FT_Render_Glyph( face->glyph, render_mode) )
+            //   continue;
+            // FT_GlyphSlot_Embolden( face->glyph );
 
 #if 0
-          FT_Glyph  glyph;
-          if ( !FT_Get_Glyph( face->glyph, &glyph ) )
-            FT_Done_Glyph( glyph );
+            FT_Glyph  glyph;
+            if ( !FT_Get_Glyph( face->glyph, &glyph ) )
+              FT_Done_Glyph( glyph );
 
-          FT_Outline*  outline = &face->glyph->outline;
-          FT_Matrix    rot30   = { 0xDDB4, -0x8000, 0x8000, 0xDDB4 };
+            FT_Outline*  outline = &face->glyph->outline;
+            FT_Matrix    rot30   = { 0xDDB4, -0x8000, 0x8000, 0xDDB4 };
 
-          FT_Outline_Transform( outline, &rot30 );
+            FT_Outline_Transform( outline, &rot30 );
 
-          FT_BBox  bbox;
-          FT_Outline_Get_BBox( outline, &bbox );
+            FT_BBox  bbox;
+            FT_Outline_Get_BBox( outline, &bbox );
 #endif
+          }
         }
-
         FT_Done_Face( face );
       }
     }