static gboolean draw_cb (ClutterCairoTexture *canvas, cairo_t *cr) { EmpathyRoundedRectangle *self = EMPATHY_ROUNDED_RECTANGLE (canvas); guint width, height; guint border_width; gdouble tmp_alpha; gdouble radius; width = self->priv->width; height = self->priv->height; radius = self->priv->height / self->priv->round_factor; border_width = self->priv->border_width; /* compute the composited opacity of the actor taking into * account the opacity of the color set by the user */ tmp_alpha = (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) * self->priv->border_color.alpha) / 255.; cairo_set_source_rgba (cr, self->priv->border_color.red / 255., self->priv->border_color.green / 255., self->priv->border_color.blue / 255., tmp_alpha); cairo_set_line_width (cr, border_width); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* make room for the portion of the border drawn on the outside */ cairo_translate (cr, border_width/2.0, border_width/2.0); cairo_new_sub_path (cr); cairo_arc (cr, width - radius, radius, radius, -M_PI/2.0, 0); cairo_arc (cr, width - radius, height - radius, radius, 0, M_PI/2.0); cairo_arc (cr, radius, height - radius, radius, M_PI/2.0, M_PI); cairo_arc (cr, radius, radius, radius, M_PI, -M_PI/2.0); cairo_close_path (cr); cairo_stroke (cr); return TRUE; }
ClutterActor * empathy_rounded_rectangle_new (guint width, guint height) { ClutterActor *self; self = CLUTTER_ACTOR (g_object_new (EMPATHY_TYPE_ROUNDED_RECTANGLE, NULL)); clutter_cairo_texture_set_surface_size (CLUTTER_CAIRO_TEXTURE (self), width, height); empathy_rounded_rectangle_paint (EMPATHY_ROUNDED_RECTANGLE (self)); return self; }
EmpathyRoundedRectangle * empathy_rounded_rectangle_new (guint width, guint height, guint round_factor) { EmpathyRoundedRectangle *self; self = EMPATHY_ROUNDED_RECTANGLE (g_object_new (EMPATHY_TYPE_ROUNDED_RECTANGLE, NULL)); self->priv->width = width; self->priv->height = height; self->priv->round_factor = round_factor; g_signal_connect (self, "draw", G_CALLBACK (draw_cb), NULL); empathy_rounded_rectangle_update_surface_size (self); clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (self)); return self; }