[gtk+] Be more careful with floating point divisions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Be more careful with floating point divisions
- Date: Fri, 8 Jan 2016 18:20:29 +0000 (UTC)
commit 3f56c530b3b5c77f2b9194c479afd1cdd25e9a42
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jan 8 13:17:58 2016 -0500
Be more careful with floating point divisions
The assumption that MIN() takes care of all infinities here
turns out to be wrong. We were getting inf and -nan for some
combinations of 0 width/height and corners, leading to invalid
matrices and cairo errors.
https://bugzilla.gnome.org/show_bug.cgi?id=759668
gtk/gtkroundedbox.c | 25 ++++++++++++++++---------
1 files changed, 16 insertions(+), 9 deletions(-)
---
diff --git a/gtk/gtkroundedbox.c b/gtk/gtkroundedbox.c
index 3d2befe..b63b7d5 100644
--- a/gtk/gtkroundedbox.c
+++ b/gtk/gtkroundedbox.c
@@ -56,16 +56,23 @@ static void
gtk_rounded_box_clamp_border_radius (GtkRoundedBox *box)
{
gdouble factor = 1.0;
+ gdouble corners;
- /* note: division by zero leads to +INF, which is > factor, so will be ignored */
- factor = MIN (factor, box->box.width / (box->corner[GTK_CSS_TOP_LEFT].horizontal +
- box->corner[GTK_CSS_TOP_RIGHT].horizontal));
- factor = MIN (factor, box->box.height / (box->corner[GTK_CSS_TOP_RIGHT].vertical +
- box->corner[GTK_CSS_BOTTOM_RIGHT].vertical));
- factor = MIN (factor, box->box.width / (box->corner[GTK_CSS_BOTTOM_RIGHT].horizontal +
- box->corner[GTK_CSS_BOTTOM_LEFT].horizontal));
- factor = MIN (factor, box->box.height / (box->corner[GTK_CSS_TOP_LEFT].vertical +
- box->corner[GTK_CSS_BOTTOM_LEFT].vertical));
+ corners = box->corner[GTK_CSS_TOP_LEFT].horizontal + box->corner[GTK_CSS_TOP_RIGHT].horizontal;
+ if (corners != 0)
+ factor = MIN (factor, box->box.width / corners);
+
+ corners = box->corner[GTK_CSS_TOP_RIGHT].vertical + box->corner[GTK_CSS_BOTTOM_RIGHT].vertical;
+ if (corners != 0)
+ factor = MIN (factor, box->box.height / corners);
+
+ corners = box->corner[GTK_CSS_BOTTOM_RIGHT].horizontal + box->corner[GTK_CSS_BOTTOM_LEFT].horizontal;
+ if (corners != 0)
+ factor = MIN (factor, box->box.width / corners);
+
+ corners = box->corner[GTK_CSS_TOP_LEFT].vertical + box->corner[GTK_CSS_BOTTOM_LEFT].vertical;
+ if (corners != 0)
+ factor = MIN (factor, box->box.height / corners);
box->corner[GTK_CSS_TOP_LEFT].horizontal *= factor;
box->corner[GTK_CSS_TOP_LEFT].vertical *= factor;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]