rectangle: Do not draw the border if bigger than the allocation

If the rectangle is allocate a size smaller than the border, drawing the
border will end up with negative coordinates, and will mess up the whole
thing. Since rectangles don't have a minimum preferred size, we cannot
rely on the allocation being big enough to contain the border and the
background color.

If the rectangle is smaller than the border width value, we just paint
the border color as well.
This commit is contained in:
Emmanuele Bassi 2015-03-14 23:15:01 +00:00
parent 56baa51b1a
commit 6de3413921

View File

@ -92,10 +92,10 @@ clutter_rectangle_paint (ClutterActor *self)
: "unknown"); : "unknown");
clutter_actor_get_allocation_geometry (self, &geom); clutter_actor_get_allocation_geometry (self, &geom);
/* parent paint call will have translated us into position so /* We paint the border if the rectangle is big enough to show it */
* paint from 0, 0 if (priv->has_border &&
*/ priv->border_width < geom.width &&
if (priv->has_border) priv->border_width < geom.height)
{ {
/* compute the composited opacity of the actor taking into /* compute the composited opacity of the actor taking into
* account the opacity of the color set by the user * account the opacity of the color set by the user
@ -151,10 +151,24 @@ clutter_rectangle_paint (ClutterActor *self)
* priv->color.alpha * priv->color.alpha
/ 255; / 255;
if (priv->border_width < geom.width &&
priv->border_width < geom.height)
{
cogl_set_source_color4ub (priv->color.red, cogl_set_source_color4ub (priv->color.red,
priv->color.green, priv->color.green,
priv->color.blue, priv->color.blue,
tmp_alpha); tmp_alpha);
}
else
{
/* If the rectangle is as big as the border, we
* use the border color to draw
*/
cogl_set_source_color4ub (priv->border_color.red,
priv->border_color.green,
priv->border_color.blue,
tmp_alpha);
}
cogl_rectangle (0, 0, geom.width, geom.height); cogl_rectangle (0, 0, geom.width, geom.height);
} }