summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFujii Hironori <Hironori.Fujii@sony.com>2023-01-25 05:42:32 +0900
committerFujii Hironori <Hironori.Fujii@sony.com>2023-02-02 05:27:18 +0900
commit44e11a96a645b2defaab57f6e40219857a45db69 (patch)
treea749dd34ca799efb304d7bf7f4bb777f42b85478 /src
parentbbc6cdb4ef7ea4ead8da919be558793036f3b8a1 (diff)
downloadcairo-44e11a96a645b2defaab57f6e40219857a45db69.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/win32/cairo-dwrite-font.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/win32/cairo-dwrite-font.cpp b/src/win32/cairo-dwrite-font.cpp
index d3998fed0..1d84fc047 100644
--- a/src/win32/cairo-dwrite-font.cpp
+++ b/src/win32/cairo-dwrite-font.cpp
@@ -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;