From c65de04789ee8c5bf1f6c9d869ac53087af0fcee Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 24 Feb 2012 15:55:00 +0100 Subject: [PATCH] gdi32: Use 64-bit values when computing ellipses to avoid overflows. --- dlls/gdi32/dibdrv/graphics.c | 12 ++++++------ dlls/gdi32/region.c | 13 +++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index 3251f3612d8..2f67efe555e 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -78,11 +78,11 @@ static int ellipse_first_quadrant( int width, int height, POINT *data ) { const int a = width - 1; const int b = height - 1; - const int asq = 8 * a * a; - const int bsq = 8 * b * b; - int dx = 4 * b * b * (1 - a); - int dy = 4 * a * a * (1 + (b % 2)); - int err = dx + dy + a * a * (b % 2); + const INT64 asq = (INT64)8 * a * a; + const INT64 bsq = (INT64)8 * b * b; + INT64 dx = (INT64)4 * b * b * (1 - a); + INT64 dy = (INT64)4 * a * a * (1 + (b % 2)); + INT64 err = dx + dy + a * a * (b % 2); int pos = 0; POINT pt; @@ -93,7 +93,7 @@ static int ellipse_first_quadrant( int width, int height, POINT *data ) while (pt.x >= width / 2) { - int e2 = 2 * err; + INT64 e2 = 2 * err; data[pos++] = pt; if (e2 >= dx) { diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c index 336e56e621b..231a7cff0a4 100644 --- a/dlls/gdi32/region.c +++ b/dlls/gdi32/region.c @@ -754,7 +754,8 @@ HRGN WINAPI CreateRoundRectRgn( INT left, INT top, { RGNOBJ * obj; HRGN hrgn = 0; - int a, b, i, x, y, asq, bsq, dx, dy, err; + int a, b, i, x, y; + INT64 asq, bsq, dx, dy, err; RECT *rects; /* Make the dimensions sensible */ @@ -788,10 +789,10 @@ HRGN WINAPI CreateRoundRectRgn( INT left, INT top, a = ellipse_width - 1; b = ellipse_height - 1; - asq = 8 * a * a; - bsq = 8 * b * b; - dx = 4 * b * b * (1 - a); - dy = 4 * a * a * (1 + (b % 2)); + asq = (INT64)8 * a * a; + bsq = (INT64)8 * b * b; + dx = (INT64)4 * b * b * (1 - a); + dy = (INT64)4 * a * a * (1 + (b % 2)); err = dx + dy + a * a * (b % 2); x = 0; @@ -802,7 +803,7 @@ HRGN WINAPI CreateRoundRectRgn( INT left, INT top, while (x <= ellipse_width / 2) { - int e2 = 2 * err; + INT64 e2 = 2 * err; if (e2 >= dx) { x++; -- 2.11.4.GIT