|
1 diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp |
|
2 --- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp |
|
3 +++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp |
|
4 @@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met |
|
5 DWRITE_FONT_METRICS fontMetrics; |
|
6 font_face->dwriteface->GetMetrics(&fontMetrics); |
|
7 HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics); |
|
8 if (FAILED(hr)) { |
|
9 return CAIRO_INT_STATUS_UNSUPPORTED; |
|
10 } |
|
11 |
|
12 // TODO: Treat swap_xy. |
|
13 - extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm; |
|
14 - extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm; |
|
15 + extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / |
|
16 + fontMetrics.designUnitsPerEm; |
|
17 + extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / |
|
18 + fontMetrics.designUnitsPerEm; |
|
19 extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm; |
|
20 extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm; |
|
21 extents.y_advance = 0.0; |
|
22 - extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm; |
|
23 + extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / |
|
24 + fontMetrics.designUnitsPerEm; |
|
25 + |
|
26 + // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics |
|
27 + // for the glyph outline, without accounting for hinting/gridfitting/antialiasing, |
|
28 + // and therefore it does not always cover all pixels that will actually be touched. |
|
29 + if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE && |
|
30 + extents.width > 0 && extents.height > 0) { |
|
31 + extents.width += scaled_font->mat_inverse.xx * 2; |
|
32 + extents.x_bearing -= scaled_font->mat_inverse.xx; |
|
33 + extents.height += scaled_font->mat_inverse.yy * 2; |
|
34 + extents.y_bearing -= scaled_font->mat_inverse.yy; |
|
35 + } |
|
36 + |
|
37 _cairo_scaled_glyph_set_metrics (scaled_glyph, |
|
38 &scaled_font->base, |
|
39 &extents); |
|
40 return CAIRO_INT_STATUS_SUCCESS; |
|
41 } |
|
42 |
|
43 /** |
|
44 * Stack-based helper implementing IDWriteGeometrySink. |