void gtk_theming_background_render (GtkStyleContext *context, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height, GtkJunctionSides junction) { GtkThemingBackground bg; gint idx; GtkCssValue *background_image; GtkCssValue *box_shadow; const GdkRGBA *bg_color; background_image = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_IMAGE); bg_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); box_shadow = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BOX_SHADOW); /* This is the common default case of no background */ if (gtk_rgba_is_clear (bg_color) && _gtk_css_array_value_get_n_values (background_image) == 1 && _gtk_css_image_value_get_image (_gtk_css_array_value_get_nth (background_image, 0)) == NULL && _gtk_css_shadows_value_is_none (box_shadow)) return; bg.context = context; _gtk_theming_background_init_context (&bg, width, height, junction); cairo_save (cr); cairo_translate (cr, x, y); /* Outset shadows */ _gtk_css_shadows_value_paint_box (box_shadow, cr, &bg.boxes[GTK_CSS_AREA_BORDER_BOX], FALSE); _gtk_theming_background_paint_color (&bg, cr, bg_color, background_image); for (idx = _gtk_css_array_value_get_n_values (background_image) - 1; idx >= 0; idx--) { _gtk_theming_background_paint_layer (&bg, idx, cr); } /* Inset shadows */ _gtk_css_shadows_value_paint_box (box_shadow, cr, &bg.boxes[GTK_CSS_AREA_PADDING_BOX], TRUE); cairo_restore (cr); }
void gtk_css_style_render_icon (GtkCssStyle *style, cairo_t *cr, double x, double y, double width, double height, GtkCssImageBuiltinType builtin_type) { const GtkCssValue *shadows; cairo_matrix_t matrix, transform_matrix, saved_matrix; GtkCssImage *image; g_return_if_fail (GTK_IS_CSS_STYLE (style)); g_return_if_fail (cr != NULL); image = _gtk_css_image_value_get_image (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SOURCE)); if (image == NULL) return; cairo_get_matrix (cr, &saved_matrix); shadows = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SHADOW); cairo_translate (cr, x, y); if (_gtk_css_transform_value_get_matrix (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_TRANSFORM), &transform_matrix)) { /* XXX: Implement -gtk-icon-transform-origin instead of hardcoding "50% 50%" here */ cairo_matrix_init_translate (&matrix, width / 2, height / 2); cairo_matrix_multiply (&matrix, &transform_matrix, &matrix); cairo_matrix_translate (&matrix, - width / 2, - height / 2); if (_gtk_css_shadows_value_is_none (shadows)) { cairo_transform (cr, &matrix); gtk_css_image_builtin_draw (image, cr, width, height, builtin_type); } else { cairo_push_group (cr); cairo_transform (cr, &matrix); gtk_css_image_builtin_draw (image, cr, width, height, builtin_type); cairo_pop_group_to_source (cr); _gtk_css_shadows_value_paint_icon (shadows, cr); cairo_paint (cr); } } cairo_set_matrix (cr, &saved_matrix); }