static void st_polygon_pick (ClutterActor *self, const ClutterColor *pick_color) { CoglPath *selection_path; gfloat coords[8]; StPolygon *area = ST_POLYGON (self); StPolygonPrivate *priv = area->priv; if (!clutter_actor_should_pick_paint (self)) return; coords[0] = priv->ulc_x; coords[1] = priv->ulc_y; coords[2] = priv->llc_x; coords[3] = priv->llc_y; coords[4] = priv->lrc_x; coords[5] = priv->lrc_y; coords[6] = priv->urc_x; coords[7] = priv->urc_y; cogl_set_source_color4ub (pick_color->red, pick_color->green, pick_color->blue, pick_color->alpha); selection_path = cogl_path_new(); cogl_path_polygon (selection_path, (float *)coords, 4); cogl_path_fill (selection_path); cogl_object_unref (selection_path); }
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 st_polygon_paint (ClutterActor *self) { StPolygon *area = ST_POLYGON (self); StPolygonPrivate *priv = area->priv; if (priv->debug) { gfloat coords[8]; CoglPath *selection_path; cogl_set_source_color4f (.50, .50, .50, .50); coords[0] = priv->ulc_x; coords[1] = priv->ulc_y; coords[2] = priv->llc_x; coords[3] = priv->llc_y; coords[4] = priv->lrc_x; coords[5] = priv->lrc_y; coords[6] = priv->urc_x; coords[7] = priv->urc_y; selection_path = cogl_path_new(); cogl_path_polygon (selection_path, (float *)coords, 4); cogl_path_fill (selection_path); cogl_object_unref (selection_path); } }
void cogl_clip_push_from_path (void) { cogl_clip_push_from_path_preserve (); cogl_path_new (); }
void test_path_clip (void) { CoglPath *path; CoglPipeline *pipeline; int fb_width, fb_height; fb_width = cogl_framebuffer_get_width (test_fb); fb_height = cogl_framebuffer_get_height (test_fb); cogl_framebuffer_orthographic (test_fb, 0, 0, fb_width, fb_height, -1, 100); path = cogl_path_new (); cogl_framebuffer_clear4f (test_fb, COGL_BUFFER_BIT_COLOR, 1.0f, 0.0f, 0.0f, 1.0f); /* Make an L-shape with the top right corner left untouched */ cogl_path_move_to (path, 0, fb_height); cogl_path_line_to (path, fb_width, fb_height); cogl_path_line_to (path, fb_width, fb_height / 2); cogl_path_line_to (path, fb_width / 2, fb_height / 2); cogl_path_line_to (path, fb_width / 2, 0); cogl_path_line_to (path, 0, 0); cogl_path_close (path); cogl_framebuffer_push_path_clip (test_fb, path); /* Try to fill the framebuffer with a blue rectangle. This should be * clipped to leave the top right quadrant as is */ pipeline = cogl_pipeline_new (test_ctx); cogl_pipeline_set_color4ub (pipeline, 0, 0, 255, 255); cogl_framebuffer_draw_rectangle (test_fb, pipeline, 0, 0, fb_width, fb_height); cogl_framebuffer_pop_clip (test_fb); cogl_object_unref (pipeline); cogl_object_unref (path); /* Check each of the four quadrants */ test_utils_check_pixel (test_fb, fb_width / 4, fb_height / 4, 0x0000ffff); test_utils_check_pixel (test_fb, fb_width * 3 / 4, fb_height / 4, 0xff0000ff); test_utils_check_pixel (test_fb, fb_width / 4, fb_height * 3 / 4, 0x0000ffff); test_utils_check_pixel (test_fb, fb_width * 3 / 4, fb_height * 3 / 4, 0x0000ffff); if (cogl_test_verbose ()) g_print ("OK\n"); }
static void pick (ClutterActor *self, const ClutterColor *color) { ChamplainPointPrivate *priv = GET_PRIVATE (self); gdouble radius = priv->size / 2.0; cogl_path_new (); cogl_set_source_color4ub (color->red, color->green, color->blue, color->alpha); cogl_path_move_to (radius, radius); cogl_path_arc (radius, radius, radius, radius, 0, 360.0); cogl_path_close (); cogl_path_fill (); }
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 (); }
void _cogl_pango_display_list_render (CoglPangoDisplayList *dl, const CoglColor *color) { GSList *l; for (l = dl->nodes; l; l = l->next) { CoglPangoDisplayListNode *node = l->data; CoglColor draw_color; if (node->pipeline == NULL) { if (node->type == COGL_PANGO_DISPLAY_LIST_TEXTURE) node->pipeline = _cogl_pango_pipeline_cache_get (dl->pipeline_cache, node->d.texture.texture); else node->pipeline = _cogl_pango_pipeline_cache_get (dl->pipeline_cache, NULL); } if (node->color_override) /* Use the override color but preserve the alpha from the draw color */ cogl_color_init_from_4ub (&draw_color, cogl_color_get_red_byte (&node->color), cogl_color_get_green_byte (&node->color), cogl_color_get_blue_byte (&node->color), cogl_color_get_alpha_byte (color)); else draw_color = *color; cogl_color_premultiply (&draw_color); cogl_pipeline_set_color (node->pipeline, &draw_color); cogl_push_source (node->pipeline); switch (node->type) { case COGL_PANGO_DISPLAY_LIST_TEXTURE: _cogl_pango_display_list_render_texture (node); break; case COGL_PANGO_DISPLAY_LIST_RECTANGLE: cogl_rectangle (node->d.rectangle.x_1, node->d.rectangle.y_1, node->d.rectangle.x_2, node->d.rectangle.y_2); break; case COGL_PANGO_DISPLAY_LIST_TRAPEZOID: { float points[8]; CoglPath *path; points[0] = node->d.trapezoid.x_11; points[1] = node->d.trapezoid.y_1; points[2] = node->d.trapezoid.x_12; points[3] = node->d.trapezoid.y_2; points[4] = node->d.trapezoid.x_22; points[5] = node->d.trapezoid.y_2; points[6] = node->d.trapezoid.x_21; points[7] = node->d.trapezoid.y_1; path = cogl_path_new (); cogl_path_polygon (path, points, 4); cogl_path_fill (path); cogl_object_unref (path); } break; } cogl_pop_source (); } }
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); }