michael@0: diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp michael@0: --- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp michael@0: +++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp michael@0: @@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met michael@0: DWRITE_FONT_METRICS fontMetrics; michael@0: font_face->dwriteface->GetMetrics(&fontMetrics); michael@0: HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics); michael@0: if (FAILED(hr)) { michael@0: return CAIRO_INT_STATUS_UNSUPPORTED; michael@0: } michael@0: michael@0: // TODO: Treat swap_xy. michael@0: - extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm; michael@0: - extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm; michael@0: + extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / michael@0: + fontMetrics.designUnitsPerEm; michael@0: + extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / michael@0: + fontMetrics.designUnitsPerEm; michael@0: extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm; michael@0: extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm; michael@0: extents.y_advance = 0.0; michael@0: - extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm; michael@0: + extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / michael@0: + fontMetrics.designUnitsPerEm; michael@0: + michael@0: + // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics michael@0: + // for the glyph outline, without accounting for hinting/gridfitting/antialiasing, michael@0: + // and therefore it does not always cover all pixels that will actually be touched. michael@0: + if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE && michael@0: + extents.width > 0 && extents.height > 0) { michael@0: + extents.width += scaled_font->mat_inverse.xx * 2; michael@0: + extents.x_bearing -= scaled_font->mat_inverse.xx; michael@0: + extents.height += scaled_font->mat_inverse.yy * 2; michael@0: + extents.y_bearing -= scaled_font->mat_inverse.yy; michael@0: + } michael@0: + michael@0: _cairo_scaled_glyph_set_metrics (scaled_glyph, michael@0: &scaled_font->base, michael@0: &extents); michael@0: return CAIRO_INT_STATUS_SUCCESS; michael@0: } michael@0: michael@0: /** michael@0: * Stack-based helper implementing IDWriteGeometrySink.