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 pre_paint_clip_cb (void) { /* Generate a clip path that clips out the top left division */ cogl_path_move_to (DIVISION_WIDTH, 0); cogl_path_line_to (SOURCE_SIZE, 0); cogl_path_line_to (SOURCE_SIZE, SOURCE_SIZE); cogl_path_line_to (0, SOURCE_SIZE); cogl_path_line_to (0, DIVISION_HEIGHT); cogl_path_line_to (DIVISION_WIDTH, DIVISION_HEIGHT); cogl_path_close (); cogl_clip_push_from_path (); }
static void empathy_rounded_actor_paint (ClutterActor *actor) { EmpathyRoundedActor *self = EMPATHY_ROUNDED_ACTOR (actor); ClutterActorBox allocation = { 0, }; gfloat width, height; 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 */ cogl_path_round_rectangle (0, 0, width, height, height / self->priv->round_factor, 0.1); cogl_clip_push_from_path (); CLUTTER_ACTOR_CLASS (empathy_rounded_actor_parent_class)->paint (actor); cogl_clip_pop (); }
static void on_paint (ClutterActor *actor, CallbackData *data) { int i; ClutterGeometry stage_size; gint hand_width, hand_height; GSList *node; clutter_actor_get_allocation_geometry (data->stage, &stage_size); hand_width = cogl_texture_get_width (data->hand); hand_height = cogl_texture_get_height (data->hand); /* Setup the clipping */ for (node = data->clips; node; node = node->next) { Clip *clip = (Clip *) node->data; if (clip->type == CLIP_RECTANGLE) cogl_clip_push_rectangle (clip->x1, clip->y1, clip->x2, clip->y2); else if (clip->type == CLIP_ROTATED_RECTANGLE) { float size = MIN (ABS (clip->x2 - clip->x1), ABS (clip->y2 - clip->y1)); int cx = (clip->x1 + clip->x2) / 2; int cy = (clip->y1 + clip->y2) / 2; size = sqrtf ((size / 2) * (size / 2) * 2); cogl_push_matrix (); /* Rotate 45° about the centre point */ cogl_translate (cx, cy, 0.0f); cogl_rotate (45.0f, 0.0f, 0.0f, 1.0f); cogl_clip_push_rectangle (-size / 2, -size / 2, size / 2, size / 2); cogl_pop_matrix (); } else { make_clip_path (clip); cogl_clip_push_from_path (); } } /* Draw a rectangle filling the entire stage */ cogl_set_source_color4ub (0x80, 0x80, 0xff, 0xff); cogl_rectangle (0, 0, stage_size.width, stage_size.height); draw_shapes (10, 10); /* Draw the hand at different rotations */ for (i = -2; i <= 2; i++) { cogl_push_matrix (); cogl_translate (stage_size.width / 2 + stage_size.width / 6 * i, stage_size.height / 2, 0); cogl_rotate (i * 40, 0, 1, 0); cogl_set_source_color4ub (0xff, 0xff, 0xff, 0xff); cogl_set_source_texture (data->hand); cogl_rectangle_with_texture_coords ((-hand_width / 2), (-hand_height / 2), (hand_width / 2), (hand_height / 2), 0, 0, 1, 1); cogl_pop_matrix (); } draw_shapes (stage_size.width - 310, stage_size.height - 110); /* Remove all of the clipping */ g_slist_foreach (data->clips, (GFunc) cogl_clip_pop, NULL); /* Draw the bounding box for each of the clips */ for (node = data->clips; node; node = node->next) { Clip *clip = (Clip *) node->data; make_clip_path (clip); cogl_set_source_color4ub (0x00, 0x00, 0xff, 0xff); cogl_path_stroke (); } /* Draw the bounding box for the pending new clip */ if (data->current_clip.type != CLIP_NONE) { make_clip_path (&data->current_clip); cogl_set_source_color4ub (0xff, 0x00, 0x00, 0xff); cogl_path_stroke (); } }
static void mnb_fancy_bin_paint (ClutterActor *actor) { MnbFancyBin *self = MNB_FANCY_BIN (actor); MnbFancyBinPrivate *priv = self->priv; /* Draw the clipped child if necessary */ if (priv->fanciness > 0.0) { MxPadding padding; gfloat width, height; clutter_actor_get_size (actor, &width, &height); mx_widget_get_padding (MX_WIDGET (actor), &padding); /* Create a clip path so that the clone won't poke out * from underneath the background. */ cogl_path_new (); cogl_path_move_to (padding.left + priv->curve_radius, padding.top); cogl_path_arc (width - padding.right - priv->curve_radius, priv->curve_radius + padding.top, priv->curve_radius, priv->curve_radius, 270, 360); cogl_path_arc (width - padding.right - priv->curve_radius, height - padding.bottom - priv->curve_radius, priv->curve_radius, priv->curve_radius, 0, 90); cogl_path_arc (padding.left + priv->curve_radius, height - padding.bottom - priv->curve_radius, priv->curve_radius, priv->curve_radius, 90, 180); cogl_path_arc (padding.left + priv->curve_radius, padding.top + priv->curve_radius, priv->curve_radius, priv->curve_radius, 180, 270); cogl_path_close (); cogl_clip_push_from_path (); /* Paint child */ if (priv->child) clutter_actor_paint (priv->child); cogl_clip_pop (); /* Chain up for background */ CLUTTER_ACTOR_CLASS (mnb_fancy_bin_parent_class)->paint (actor); } /* Draw the un-fancy child */ if ((priv->fanciness < 1.0) && priv->clone) clutter_actor_paint (priv->clone); }