diff --git a/ChangeLog b/ChangeLog index 293bc9884..b590def26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2018-05-15 Alexei Podtelezhnikov + + [base] Fix mono bitmap presetting (#53896). + + It is rather fundamental to set monochrome bitmap based on rounded + CBox because the b/w rasterizer turns on pixels when their centers are + inside the glyph outline. The dropout control is unpredictable and can + distort narrow glyphs if the bitmap is too wide. + + Reported by Chris Liddell. + + * src/base/ftobjs.c (ft_glyphslot_preset_bitmap): If BBox boundaries + are too close, adjust them before rounding. + 2018-05-15 Werner Lemberg [psaux] Fix compiler warning (#53915). diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index c102bbea5..05e2a038a 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -374,32 +374,26 @@ /* unless the rounded box can collapse for a narrow glyph */ if ( cbox.xMax - cbox.xMin < 64 ) { - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax ); - } - else - { - cbox.xMin = FT_PIX_ROUND_LONG( cbox.xMin ); - cbox.xMax = FT_PIX_ROUND_LONG( cbox.xMax ); + cbox.xMin = ( cbox.xMin + cbox.xMax ) / 2 - 32; + cbox.xMax = cbox.xMin + 64; } + cbox.xMin = FT_PIX_ROUND_LONG( cbox.xMin ); + cbox.xMax = FT_PIX_ROUND_LONG( cbox.xMax ); + if ( cbox.yMax - cbox.yMin < 64 ) { - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax ); + cbox.yMin = ( cbox.yMin + cbox.yMax ) / 2 - 32; + cbox.yMax = cbox.yMin + 64; } - else - { - cbox.yMin = FT_PIX_ROUND_LONG( cbox.yMin ); - cbox.yMax = FT_PIX_ROUND_LONG( cbox.yMax ); - } -#else - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax ); -#endif + + cbox.yMin = FT_PIX_ROUND_LONG( cbox.yMin ); + cbox.yMax = FT_PIX_ROUND_LONG( cbox.yMax ); + break; +#else + goto Round; +#endif case FT_RENDER_MODE_LCD: pixel_mode = FT_PIXEL_MODE_LCD;