mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-15 14:50:06 +00:00
render: Make gtk_render_icon() use the snapshot API
This removes a lot of duplicated code.
This commit is contained in:
parent
9675c99043
commit
95a4eff6ba
@ -629,17 +629,21 @@ gtk_render_icon (GtkStyleContext *context,
|
|||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
cairo_surface_t *surface;
|
GtkSnapshot *snapshot;
|
||||||
|
GskRenderNode *node;
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
snapshot = gtk_snapshot_new ();
|
||||||
g_return_if_fail (cr != NULL);
|
gtk_css_style_snapshot_icon_paintable (gtk_style_context_lookup_style (context),
|
||||||
|
snapshot,
|
||||||
|
GDK_PAINTABLE (texture),
|
||||||
|
x, y,
|
||||||
|
FALSE);
|
||||||
|
node = gtk_snapshot_free_to_node (snapshot);
|
||||||
|
if (node == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
surface = gdk_texture_download_surface (texture);
|
cairo_save (cr);
|
||||||
|
cairo_translate (cr, x, y);
|
||||||
gtk_css_style_render_icon_surface (gtk_style_context_lookup_style (context),
|
gsk_render_node_draw (node, cr);
|
||||||
cr,
|
cairo_restore (cr);
|
||||||
surface,
|
|
||||||
x, y);
|
|
||||||
|
|
||||||
cairo_surface_destroy (surface);
|
|
||||||
}
|
}
|
||||||
|
@ -96,81 +96,6 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
|
|||||||
gtk_snapshot_pop (snapshot);
|
gtk_snapshot_pop (snapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
get_surface_extents (cairo_surface_t *surface,
|
|
||||||
GdkRectangle *out_extents)
|
|
||||||
{
|
|
||||||
cairo_t *cr;
|
|
||||||
gboolean result;
|
|
||||||
|
|
||||||
cr = cairo_create (surface);
|
|
||||||
result = gdk_cairo_get_clip_rectangle (cr, out_extents);
|
|
||||||
cairo_destroy (cr);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gtk_css_style_render_icon_surface (GtkCssStyle *style,
|
|
||||||
cairo_t *cr,
|
|
||||||
cairo_surface_t *surface,
|
|
||||||
double x,
|
|
||||||
double y)
|
|
||||||
{
|
|
||||||
const GtkCssValue *shadows;
|
|
||||||
graphene_matrix_t graphene_matrix;
|
|
||||||
cairo_matrix_t matrix, transform_matrix, saved_matrix;
|
|
||||||
GdkRectangle extents;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_CSS_STYLE (style));
|
|
||||||
g_return_if_fail (cr != NULL);
|
|
||||||
g_return_if_fail (surface != NULL);
|
|
||||||
|
|
||||||
shadows = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SHADOW);
|
|
||||||
|
|
||||||
if (!get_surface_extents (surface, &extents))
|
|
||||||
{
|
|
||||||
/* weird infinite surface, no special magic for you */
|
|
||||||
cairo_set_source_surface (cr, surface, x, y);
|
|
||||||
_gtk_css_shadows_value_paint_icon (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SHADOW), cr);
|
|
||||||
cairo_paint (cr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_get_matrix (cr, &saved_matrix);
|
|
||||||
cairo_translate (cr, x + extents.x, y + extents.y);
|
|
||||||
|
|
||||||
if (gtk_css_transform_value_get_matrix (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_TRANSFORM), &graphene_matrix) &&
|
|
||||||
graphene_matrix_is_2d (&graphene_matrix))
|
|
||||||
{
|
|
||||||
cairo_pattern_t *pattern;
|
|
||||||
|
|
||||||
graphene_matrix_to_2d (&graphene_matrix,
|
|
||||||
&transform_matrix.xx, &transform_matrix.yx,
|
|
||||||
&transform_matrix.xy, &transform_matrix.yy,
|
|
||||||
&transform_matrix.x0, &transform_matrix.y0);
|
|
||||||
/* XXX: Implement -gtk-icon-transform-origin instead of hardcoding "50% 50%" here */
|
|
||||||
cairo_matrix_init_translate (&matrix, extents.width / 2, extents.height / 2);
|
|
||||||
cairo_matrix_multiply (&matrix, &transform_matrix, &matrix);
|
|
||||||
cairo_matrix_translate (&matrix, - extents.width / 2, - extents.height / 2);
|
|
||||||
if (cairo_matrix_invert (&matrix) != CAIRO_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
cairo_matrix_translate (&matrix, extents.x, extents.y);
|
|
||||||
|
|
||||||
pattern = cairo_pattern_create_for_surface (surface);
|
|
||||||
cairo_pattern_set_matrix (pattern, &matrix);
|
|
||||||
cairo_set_source (cr, pattern);
|
|
||||||
cairo_pattern_destroy (pattern);
|
|
||||||
|
|
||||||
_gtk_css_shadows_value_paint_icon (shadows, cr);
|
|
||||||
cairo_paint (cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_set_matrix (cr, &saved_matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style,
|
gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style,
|
||||||
GtkSnapshot *snapshot,
|
GtkSnapshot *snapshot,
|
||||||
|
@ -35,11 +35,6 @@ void gtk_css_style_snapshot_icon (GtkCssStyle *style,
|
|||||||
double height,
|
double height,
|
||||||
GtkCssImageBuiltinType builtin_type);
|
GtkCssImageBuiltinType builtin_type);
|
||||||
|
|
||||||
void gtk_css_style_render_icon_surface (GtkCssStyle *style,
|
|
||||||
cairo_t *cr,
|
|
||||||
cairo_surface_t *surface,
|
|
||||||
double x,
|
|
||||||
double y);
|
|
||||||
void gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style,
|
void gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style,
|
||||||
GtkSnapshot *snapshot,
|
GtkSnapshot *snapshot,
|
||||||
GdkPaintable *paintable,
|
GdkPaintable *paintable,
|
||||||
|
Loading…
Reference in New Issue
Block a user