1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/dwrite-glyph-extents.patch Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,44 @@ 1.4 +diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp 1.5 +--- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp 1.6 ++++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp 1.7 +@@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met 1.8 + DWRITE_FONT_METRICS fontMetrics; 1.9 + font_face->dwriteface->GetMetrics(&fontMetrics); 1.10 + HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics); 1.11 + if (FAILED(hr)) { 1.12 + return CAIRO_INT_STATUS_UNSUPPORTED; 1.13 + } 1.14 + 1.15 + // TODO: Treat swap_xy. 1.16 +- extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm; 1.17 +- extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm; 1.18 ++ extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / 1.19 ++ fontMetrics.designUnitsPerEm; 1.20 ++ extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / 1.21 ++ fontMetrics.designUnitsPerEm; 1.22 + extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm; 1.23 + extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm; 1.24 + extents.y_advance = 0.0; 1.25 +- extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm; 1.26 ++ extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / 1.27 ++ fontMetrics.designUnitsPerEm; 1.28 ++ 1.29 ++ // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics 1.30 ++ // for the glyph outline, without accounting for hinting/gridfitting/antialiasing, 1.31 ++ // and therefore it does not always cover all pixels that will actually be touched. 1.32 ++ if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE && 1.33 ++ extents.width > 0 && extents.height > 0) { 1.34 ++ extents.width += scaled_font->mat_inverse.xx * 2; 1.35 ++ extents.x_bearing -= scaled_font->mat_inverse.xx; 1.36 ++ extents.height += scaled_font->mat_inverse.yy * 2; 1.37 ++ extents.y_bearing -= scaled_font->mat_inverse.yy; 1.38 ++ } 1.39 ++ 1.40 + _cairo_scaled_glyph_set_metrics (scaled_glyph, 1.41 + &scaled_font->base, 1.42 + &extents); 1.43 + return CAIRO_INT_STATUS_SUCCESS; 1.44 + } 1.45 + 1.46 + /** 1.47 + * Stack-based helper implementing IDWriteGeometrySink.