Bug 1400721 - Fix Skia's glyph LCD filter padding for FreeType 2.8.1. r=jrmuizel, a=lizzard
authorLee Salzman <lsalzman@mozilla.com>
Mon, 18 Sep 2017 15:28:37 -0400 (2017-09-18)
changeset 424159 8fe8227e5080a0f292453d6b5a703763949dfc2c
parent 424158 7502daea5167828b742c19f8a684e528a67147c3
child 424160 d57a23a8d5dcddc5d4e390ba73298cd9ae6c3785
push id1535
push userryanvm@gmail.com
push dateWed, 20 Sep 2017 22:48:24 +0000 (2017-09-20)
treeherdermozilla-release@d57a23a8d5dc [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjrmuizel, lizzard
bugs1400721
milestone56.0
Bug 1400721 - Fix Skia's glyph LCD filter padding for FreeType 2.8.1. r=jrmuizel, a=lizzard MozReview-Commit-ID: JFvnANsTS0r
gfx/skia/skia/src/ports/SkFontHost_cairo.cpp
--- a/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp
+++ b/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp
@@ -661,20 +661,25 @@ void SkScalerContext_CairoFT::generateMe
         bbox.yMin &= ~63;
         bbox.xMax = (bbox.xMax + 63) & ~63;
         bbox.yMax = (bbox.yMax + 63) & ~63;
         glyph->fWidth  = SkToU16(SkFDot6Floor(bbox.xMax - bbox.xMin));
         glyph->fHeight = SkToU16(SkFDot6Floor(bbox.yMax - bbox.yMin));
         glyph->fTop    = -SkToS16(SkFDot6Floor(bbox.yMax));
         glyph->fLeft   = SkToS16(SkFDot6Floor(bbox.xMin));
 
-        if (isLCD(fRec) &&
-            gSetLcdFilter &&
-            (fLcdFilter == FT_LCD_FILTER_DEFAULT ||
-             fLcdFilter == FT_LCD_FILTER_LIGHT)) {
+        if (isLCD(fRec)) {
+            // In FreeType < 2.8.1, LCD filtering, if explicitly used, may
+            // add padding to the glyph. When not used, there is no padding.
+            // As of 2.8.1, LCD filtering is now always supported and may
+            // add padding even if an LCD filter is not explicitly set.
+            // Regardless, if no LCD filtering is used, or if LCD filtering
+            // doesn't add padding, it is safe to modify the glyph's bounds
+            // here. generateGlyphImage will detect if the mask is smaller
+            // than the bounds and clip things appropriately.
             if (fRec.fFlags & kLCD_Vertical_Flag) {
                 glyph->fTop -= 1;
                 glyph->fHeight += 2;
             } else {
                 glyph->fLeft -= 1;
                 glyph->fWidth += 2;
             }
         }