static void empathy_rounded_effect_paint (ClutterEffect *effect, ClutterEffectPaintFlags flags) { EmpathyRoundedEffect *self = EMPATHY_ROUNDED_EFFECT (effect); ClutterActor *actor; ClutterActorBox allocation = { 0, }; gfloat width, height; actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (self)); clutter_actor_get_allocation_box (actor, &allocation); clutter_actor_box_get_size (&allocation, &width, &height); cogl_path_new (); /* Create and store a path describing a rounded rectangle. The small * size of the preview window makes the radius of the rounded corners * very small too, so we can safely use a very coarse angle step * without loosing rendering accuracy. It also significantly reduces * the time spent in the underlying internal cogl path functions */ cogl_path_round_rectangle (0, 0, width, height, height / 16., 15); cogl_clip_push_from_path (); /* Flip */ cogl_push_matrix (); cogl_translate (width, 0, 0); cogl_scale (-1, 1, 1); clutter_actor_continue_paint (actor); cogl_pop_matrix (); cogl_clip_pop (); }
static void mex_action_button_paint_background (MxWidget *widget, ClutterActor *background, const ClutterColor *color) { MexActionButtonPrivate *priv = MEX_ACTION_BUTTON (widget)->priv; gfloat width, height; gfloat factor_x, factor_y; cogl_push_matrix (); if (priv->has_focus) { clutter_actor_get_size (background, &width, &height); factor_x = (width + 4) / width; factor_y = (height + 4) / height; cogl_translate (width/2, height/2, 0); cogl_scale (factor_x, factor_y, 1); cogl_translate (-width/2, -height/2, 0); } MX_WIDGET_CLASS(mex_action_button_parent_class)->paint_background (widget, background, color); cogl_pop_matrix (); }
static void pp_super_aa_paint_child (MxOffscreen *offscreen) { PPSuperAAPrivate *priv = PP_SUPER_AA (offscreen)->priv; cogl_scale (priv->x_res, priv->y_res, 1.0); MX_OFFSCREEN_CLASS (pp_super_aa_parent_class)->paint_child (offscreen); }
static void clutter_clone_paint (ClutterActor *self) { ClutterClone *clone = CLUTTER_CLONE (self); ClutterClonePrivate *priv = clone->priv; ClutterGeometry geom, clone_geom; gfloat x_scale, y_scale; gboolean was_unmapped = FALSE; if (G_UNLIKELY (priv->clone_source == NULL)) return; CLUTTER_NOTE (PAINT, "painting clone actor '%s'", clutter_actor_get_name (self) ? clutter_actor_get_name (self) : "unknown"); /* get our allocated size */ clutter_actor_get_allocation_geometry (self, &geom); /* and get the allocated size of the source */ clutter_actor_get_allocation_geometry (priv->clone_source, &clone_geom); /* We need to scale what the clone-source actor paints to fill our own * allocation... */ x_scale = (gfloat) geom.width / clone_geom.width; y_scale = (gfloat) geom.height / clone_geom.height; cogl_scale (x_scale, y_scale, 1.0); /* The final bits of magic: * - We need to make sure that when the clone-source actor's paint * method calls clutter_actor_get_paint_opacity, it traverses to * us and our parent not it's real parent. * - We need to stop clutter_actor_paint applying the model view matrix of * the clone source actor. */ _clutter_actor_set_opacity_parent (priv->clone_source, self); _clutter_actor_set_enable_model_view_transform (priv->clone_source, FALSE); if (!CLUTTER_ACTOR_IS_MAPPED (priv->clone_source)) { _clutter_actor_set_enable_paint_unmapped (priv->clone_source, TRUE); was_unmapped = TRUE; } clutter_actor_paint (priv->clone_source); if (was_unmapped) _clutter_actor_set_enable_paint_unmapped (priv->clone_source, FALSE); _clutter_actor_set_enable_model_view_transform (priv->clone_source, TRUE); _clutter_actor_set_opacity_parent (priv->clone_source, NULL); }