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