roundedbox: Clamp border radius to box size

Note that clamping in rounded_box_grow() is not necessary as that
function cannot lead to overlap unless the rounded box was overlapping
previously.

https://bugzilla.gnome.org/show_bug.cgi?id=655009
This commit is contained in:
Andrea Cimitan
2011-07-20 23:37:26 +02:00
committed by Benjamin Otte
parent a02b82056a
commit b3f03d092f

View File

@ -48,6 +48,32 @@ _gtk_rounded_box_init_rect (GtkRoundedBox *box,
memset (&box->border_radius, 0, sizeof (GtkCssBorderRadius));
}
/* clamp border radius, following CSS specs */
static void
gtk_rounded_box_clamp_border_radius (GtkRoundedBox *box)
{
gdouble factor = 1.0;
/* note: division by zero leads to +INF, which is > factor, so will be ignored */
factor = MIN (factor, box->box.width / (box->border_radius.top_left.horizontal +
box->border_radius.top_right.horizontal));
factor = MIN (factor, box->box.height / (box->border_radius.top_right.vertical +
box->border_radius.bottom_right.vertical));
factor = MIN (factor, box->box.width / (box->border_radius.bottom_right.horizontal +
box->border_radius.bottom_left.horizontal));
factor = MIN (factor, box->box.height / (box->border_radius.top_left.vertical +
box->border_radius.bottom_left.vertical));
box->border_radius.top_left.horizontal *= factor;
box->border_radius.top_left.vertical *= factor;
box->border_radius.top_right.horizontal *= factor;
box->border_radius.top_right.vertical *= factor;
box->border_radius.bottom_right.horizontal *= factor;
box->border_radius.bottom_right.vertical *= factor;
box->border_radius.bottom_left.horizontal *= factor;
box->border_radius.bottom_left.vertical *= factor;
}
void
_gtk_rounded_box_apply_border_radius (GtkRoundedBox *box,
GtkThemingEngine *engine,
@ -75,6 +101,8 @@ _gtk_rounded_box_apply_border_radius (GtkRoundedBox *box,
if (bottom_left_radius && (junction & GTK_JUNCTION_CORNER_BOTTOMLEFT) == 0)
box->border_radius.bottom_left = *bottom_left_radius;
gtk_rounded_box_clamp_border_radius (box);
g_free (top_left_radius);
g_free (top_right_radius);
g_free (bottom_right_radius);