shithub: freetype+ttf2subf

Download patch

ref: 8d22746c9e5af80ff4304aef440986403a5072e2
parent: 3624110cc25c1da42a151fcca6fe501854dd23ef
author: Werner Lemberg <[email protected]>
date: Fri Jun 11 21:32:20 EDT 2010

Fix Savannah bug #30106.

Point numbers for FreeType's implementation of hinting masks are
collected before the final number of points of a glyph has been
determined; in particular, the code for handling the `endchar'
opcode can reduce the number of points.

* src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that
`end_point' is not larger than `glyph->num_points'.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2010-06-11  Werner Lemberg  <[email protected]>
 
+	Fix Savannah bug #30106.
+
+	Point numbers for FreeType's implementation of hinting masks are
+	collected before the final number of points of a glyph has been
+	determined; in particular, the code for handling the `endchar'
+	opcode can reduce the number of points.
+
+	* src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that
+	`end_point' is not larger than `glyph->num_points'.
+
+2010-06-11  Werner Lemberg  <[email protected]>
+
 	[cff]: Improve debugging output.
 
 	* src/cff/cffgload.c (cff_decoder_parse_charstrings)
--- a/src/pshinter/pshalgo.c
+++ b/src/pshinter/pshalgo.c
@@ -4,7 +4,8 @@
 /*                                                                         */
 /*    PostScript hinting algorithm (body).                                 */
 /*                                                                         */
-/*  Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by      */
+/*  Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010   */
+/*            by                                                           */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -1690,7 +1691,10 @@
     /* process secondary hints to `selected' points */
     if ( num_masks > 1 && glyph->num_points > 0 )
     {
-      first = mask->end_point;
+      /* the `endchar' op can reduce the number of points */
+      first = mask->end_point > glyph->num_points
+                ? glyph->num_points
+                : mask->end_point;
       mask++;
       for ( ; num_masks > 1; num_masks--, mask++ )
       {
@@ -1698,7 +1702,9 @@
         FT_Int   count;
 
 
-        next  = mask->end_point;
+        next  = mask->end_point > glyph->num_points
+                  ? glyph->num_points
+                  : mask->end_point;
         count = next - first;
         if ( count > 0 )
         {