diff options
author | Benjamin Otte <otte@redhat.com> | 2018-07-14 21:24:42 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2018-07-24 20:55:45 +0200 |
commit | 2a11baf6ea440fe81f90ba45373f9931dad6ce9d (patch) | |
tree | 1f9a4c5c97592ad3119f6724e9a535c99d819581 /gtk | |
parent | 51d40ca02372bcf242ed62f84a59d3b9152c4d8d (diff) | |
download | gtk+-2a11baf6ea440fe81f90ba45373f9931dad6ce9d.tar.gz |
render: Make gtk_render_check/arrow/handle() use the snapshot API
This removes a lot of duplicated code.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkrender.c | 243 | ||||
-rw-r--r-- | gtk/gtkrendericon.c | 58 | ||||
-rw-r--r-- | gtk/gtkrendericonprivate.h | 7 |
3 files changed, 107 insertions, 201 deletions
diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c index ae772a7f91..b42b402269 100644 --- a/gtk/gtkrender.c +++ b/gtk/gtkrender.c @@ -40,25 +40,29 @@ #include "fallback-c89.c" static void -gtk_do_render_check (GtkStyleContext *context, - cairo_t *cr, - gdouble x, - gdouble y, - gdouble width, - gdouble height) +gtk_do_render_icon (GtkStyleContext *context, + cairo_t *cr, + GtkCssImageBuiltinType image_type, + gdouble x, + gdouble y, + gdouble width, + gdouble height) { - GtkStateFlags state; - GtkCssImageBuiltinType image_type; + GtkSnapshot *snapshot; + GskRenderNode *node; - state = gtk_style_context_get_state (context); - if (state & GTK_STATE_FLAG_INCONSISTENT) - image_type = GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT; - else if (state & GTK_STATE_FLAG_CHECKED) - image_type = GTK_CSS_IMAGE_BUILTIN_CHECK; - else - image_type = GTK_CSS_IMAGE_BUILTIN_NONE; + snapshot = gtk_snapshot_new (); + gtk_css_style_snapshot_icon (gtk_style_context_lookup_style (context), snapshot, width, height, image_type); + node = gtk_snapshot_free_to_node (snapshot); + if (node == NULL) + return; - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, width, height, image_type); + cairo_save (cr); + cairo_translate (cr, x, y); + gsk_render_node_draw (node, cr); + cairo_restore (cr); + + gsk_render_node_unref (node); } /** @@ -88,35 +92,24 @@ gtk_render_check (GtkStyleContext *context, gdouble width, gdouble height) { + GtkStateFlags state; + GtkCssImageBuiltinType image_type; + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (cr != NULL); if (width <= 0 || height <= 0) return; - gtk_do_render_check (context, cr, x, y, width, height); -} - -static void -gtk_do_render_option (GtkStyleContext *context, - cairo_t *cr, - gdouble x, - gdouble y, - gdouble width, - gdouble height) -{ - GtkStateFlags state; - GtkCssImageBuiltinType image_type; - state = gtk_style_context_get_state (context); if (state & GTK_STATE_FLAG_INCONSISTENT) - image_type = GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT; + image_type = GTK_CSS_IMAGE_BUILTIN_CHECK_INCONSISTENT; else if (state & GTK_STATE_FLAG_CHECKED) - image_type = GTK_CSS_IMAGE_BUILTIN_OPTION; + image_type = GTK_CSS_IMAGE_BUILTIN_CHECK; else image_type = GTK_CSS_IMAGE_BUILTIN_NONE; - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, width, height, image_type); + gtk_do_render_icon (context, cr, image_type, x, y, width, height); } /** @@ -144,49 +137,24 @@ gtk_render_option (GtkStyleContext *context, gdouble width, gdouble height) { + GtkStateFlags state; + GtkCssImageBuiltinType image_type; + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (cr != NULL); if (width <= 0 || height <= 0) return; - gtk_do_render_option (context, cr, x, y, width, height); -} - -static void -gtk_do_render_arrow (GtkStyleContext *context, - cairo_t *cr, - gdouble angle, - gdouble x, - gdouble y, - gdouble size) -{ - GtkCssImageBuiltinType image_type; - - /* map [0, 2 * pi) to [0, 4) */ - angle = round (2 * angle / G_PI); - - switch (((int) angle) & 3) - { - case 0: - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP; - break; - case 1: - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT; - break; - case 2: - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN; - break; - case 3: - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT; - break; - default: - g_assert_not_reached (); - image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP; - break; - } + state = gtk_style_context_get_state (context); + if (state & GTK_STATE_FLAG_INCONSISTENT) + image_type = GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT; + else if (state & GTK_STATE_FLAG_CHECKED) + image_type = GTK_CSS_IMAGE_BUILTIN_OPTION; + else + image_type = GTK_CSS_IMAGE_BUILTIN_NONE; - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, size, size, image_type); + gtk_do_render_icon (context, cr, image_type, x, y, width, height); } /** @@ -212,13 +180,38 @@ gtk_render_arrow (GtkStyleContext *context, gdouble y, gdouble size) { + GtkCssImageBuiltinType image_type; + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (cr != NULL); if (size <= 0) return; - gtk_do_render_arrow (context, cr, angle, x, y, size); + /* map [0, 2 * pi) to [0, 4) */ + angle = round (2 * angle / G_PI); + + switch (((int) angle) & 3) + { + case 0: + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP; + break; + case 1: + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT; + break; + case 2: + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN; + break; + case 3: + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT; + break; + default: + g_assert_not_reached (); + image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_UP; + break; + } + + gtk_do_render_icon (context, cr, image_type, x, y, size, size); } /** @@ -321,44 +314,6 @@ gtk_render_frame (GtkStyleContext *context, x, y, width, height); } -static void -gtk_do_render_expander (GtkStyleContext *context, - cairo_t *cr, - gdouble x, - gdouble y, - gdouble width, - gdouble height) -{ - GtkCssImageBuiltinType image_type; - GtkStateFlags state; - - state = gtk_style_context_get_state (context); - if (gtk_style_context_has_class (context, "horizontal")) - { - if (state & GTK_STATE_FLAG_DIR_RTL) - image_type = (state & GTK_STATE_FLAG_CHECKED) - ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT_EXPANDED - : GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT; - else - image_type = (state & GTK_STATE_FLAG_CHECKED) - ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT_EXPANDED - : GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT; - } - else - { - if (state & GTK_STATE_FLAG_DIR_RTL) - image_type = (state & GTK_STATE_FLAG_CHECKED) - ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT_EXPANDED - : GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT; - else - image_type = (state & GTK_STATE_FLAG_CHECKED) - ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT_EXPANDED - : GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT; - } - - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, width, height, image_type); -} - /** * gtk_render_expander: * @context: a #GtkStyleContext @@ -384,13 +339,40 @@ gtk_render_expander (GtkStyleContext *context, gdouble width, gdouble height) { + GtkCssImageBuiltinType image_type; + GtkStateFlags state; + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (cr != NULL); if (width <= 0 || height <= 0) return; - gtk_do_render_expander (context, cr, x, y, width, height); + state = gtk_style_context_get_state (context); + if (gtk_style_context_has_class (context, "horizontal")) + { + if (state & GTK_STATE_FLAG_DIR_RTL) + image_type = (state & GTK_STATE_FLAG_CHECKED) + ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT_EXPANDED + : GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT; + else + image_type = (state & GTK_STATE_FLAG_CHECKED) + ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT_EXPANDED + : GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT; + } + else + { + if (state & GTK_STATE_FLAG_DIR_RTL) + image_type = (state & GTK_STATE_FLAG_CHECKED) + ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT_EXPANDED + : GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_RIGHT; + else + image_type = (state & GTK_STATE_FLAG_CHECKED) + ? GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT_EXPANDED + : GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT; + } + + gtk_do_render_icon (context, cr, image_type, x, y, width, height); } /** @@ -640,31 +622,6 @@ gtk_render_frame_gap (GtkStyleContext *context, xy0_gap, xy1_gap); } -static void -gtk_do_render_handle (GtkStyleContext *context, - cairo_t *cr, - gdouble x, - gdouble y, - gdouble width, - gdouble height) -{ - GtkCssImageBuiltinType type; - - gtk_render_background (context, cr, x, y, width, height); - gtk_render_frame (context, cr, x, y, width, height); - - if (gtk_style_context_has_class (context, GTK_STYLE_CLASS_PANE_SEPARATOR)) - { - type = GTK_CSS_IMAGE_BUILTIN_PANE_SEPARATOR; - } - else - { - type = GTK_CSS_IMAGE_BUILTIN_HANDLE; - } - - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, width, height, type); -} - /** * gtk_render_handle: * @context: a #GtkStyleContext @@ -690,13 +647,27 @@ gtk_render_handle (GtkStyleContext *context, gdouble width, gdouble height) { + GtkCssImageBuiltinType type; + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); g_return_if_fail (cr != NULL); if (width <= 0 || height <= 0) return; - gtk_do_render_handle (context, cr, x, y, width, height); + gtk_render_background (context, cr, x, y, width, height); + gtk_render_frame (context, cr, x, y, width, height); + + if (gtk_style_context_has_class (context, GTK_STYLE_CLASS_PANE_SEPARATOR)) + { + type = GTK_CSS_IMAGE_BUILTIN_PANE_SEPARATOR; + } + else + { + type = GTK_CSS_IMAGE_BUILTIN_HANDLE; + } + + gtk_do_render_icon (context, cr, x, y, width, height, type); } /** @@ -726,7 +697,7 @@ gtk_render_activity (GtkStyleContext *context, if (width <= 0 || height <= 0) return; - gtk_css_style_render_icon (gtk_style_context_lookup_style (context), cr, x, y, width, height, GTK_CSS_IMAGE_BUILTIN_SPINNER); + gtk_do_render_icon (context, cr, x, y, width, height, GTK_CSS_IMAGE_BUILTIN_SPINNER); } /** diff --git a/gtk/gtkrendericon.c b/gtk/gtkrendericon.c index afed8b613d..5a6be7510f 100644 --- a/gtk/gtkrendericon.c +++ b/gtk/gtkrendericon.c @@ -33,64 +33,6 @@ #include <math.h> 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; - graphene_matrix_t graphene_matrix; - 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), &graphene_matrix) && - graphene_matrix_is_2d (&graphene_matrix)) - { - 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, 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); -} - -void gtk_css_style_snapshot_icon (GtkCssStyle *style, GtkSnapshot *snapshot, double width, diff --git a/gtk/gtkrendericonprivate.h b/gtk/gtkrendericonprivate.h index c0dba208d0..4cb7628349 100644 --- a/gtk/gtkrendericonprivate.h +++ b/gtk/gtkrendericonprivate.h @@ -29,13 +29,6 @@ G_BEGIN_DECLS -void gtk_css_style_render_icon (GtkCssStyle *style, - cairo_t *cr, - double x, - double y, - double width, - double height, - GtkCssImageBuiltinType builtin_type); void gtk_css_style_snapshot_icon (GtkCssStyle *style, GtkSnapshot *snapshot, double width, |