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.
--- 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 );
+ }
}
}
}