DWrite: Fix incorrect glyph metrics for negative glyph height

GetGdiCompatibleMetrics may return a glyph metrics that yields a small
nagative glyph height. But, it was calculated in unsigned integer.
And, it resulted in a very large glyph metrics.

Calculate glyph width and height in signed integer and let them
non-negative.
This commit is contained in:
Fujii Hironori 2023-01-25 05:42:32 +09:00
parent bbc6cdb4ef
commit 44e11a96a6

View file

@ -698,11 +698,15 @@ _cairo_dwrite_scaled_font_init_glyph_metrics(cairo_dwrite_scaled_font_t *scaled_
return CAIRO_INT_STATUS_UNSUPPORTED;
}
// GetGdiCompatibleMetrics may return a glyph metrics that yields a small nagative glyph height.
INT32 glyph_width = metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing;
INT32 glyph_height = metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing;
glyph_width = MAX(glyph_width, 0);
glyph_height = MAX(glyph_height, 0);
// 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)glyph_width / fontMetrics.designUnitsPerEm;
extents.height = (FLOAT)glyph_height / fontMetrics.designUnitsPerEm;
extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm;
extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm;
extents.y_advance = 0.0;