shithub: freetype+ttf2subf

Download patch

ref: 029c9b2391476285cb4b25b52360744c649305b0
parent: 55d6abea5d734c47243a854e867444652c1b7aa1
author: Werner Lemberg <[email protected]>
date: Wed Jan 3 14:05:20 EST 2018

[truetype] Round offsets of glyph components only if hinting is on.

* src/truetype/ttgload.c (TT_Process_Composite_Component): Implement
it.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2018-01-03  Werner Lemberg  <[email protected]>
 
+	[truetype] Round offsets of glyph components only if hinting is on.
+
+	* src/truetype/ttgload.c (TT_Process_Composite_Component): Implement
+	it.
+
+2018-01-03  Werner Lemberg  <[email protected]>
+
 	* src/truetype/ttgxvar.c (ft_var_to_design): Remove dead code.
 
 	This is a better fix than the previous commit, which is now
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -1206,8 +1206,28 @@
 
         if ( subglyph->flags & ROUND_XY_TO_GRID )
         {
-          x = FT_PIX_ROUND( x );
-          y = FT_PIX_ROUND( y );
+          TT_Face    face   = loader->face;
+          TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+
+          if ( IS_HINTED( loader->load_flags ) )
+          {
+            /*
+             * We round the horizontal offset only if there is hinting along
+             * the x axis; this corresponds to integer advance width values.
+             *
+             * Theoretically, a glyph's bytecode can toggle ClearType's
+             * `backward compatibility' mode, which would allow modification
+             * of the advance width.  In reality, however, applications
+             * neither allow nor expect modified advance widths if sub-pixel
+             * rendering is active.
+             *
+             */
+            if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 )
+              x = FT_PIX_ROUND( x );
+
+            y = FT_PIX_ROUND( y );
+          }
         }
       }
     }