diff options
-rw-r--r-- | gtk/gtkcssimagebuiltin.c | 27 | ||||
-rw-r--r-- | gtk/gtkcssimagebuiltinprivate.h | 5 | ||||
-rw-r--r-- | gtk/gtkrender.c | 30 |
3 files changed, 55 insertions, 7 deletions
diff --git a/gtk/gtkcssimagebuiltin.c b/gtk/gtkcssimagebuiltin.c index 1ce28e2117..b80f5686fe 100644 --- a/gtk/gtkcssimagebuiltin.c +++ b/gtk/gtkcssimagebuiltin.c @@ -219,6 +219,7 @@ gtk_css_image_builtin_draw_arrow (GtkCssImage *image, cairo_t *cr, double width, double height, + GtkCssImageBuiltinType image_type, const GdkRGBA * color) { double line_width; @@ -226,7 +227,25 @@ gtk_css_image_builtin_draw_arrow (GtkCssImage *image, size = MIN (width, height); - cairo_translate (cr, width / 2.0 + size / 4.0, height / 2.0); + cairo_translate (cr, width / 2.0, height / 2.0); + switch (image_type) + { + case GTK_CSS_IMAGE_BUILTIN_ARROW_UP: + break; + case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN: + cairo_rotate (cr, G_PI); + break; + case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT: + cairo_rotate (cr, 3 * G_PI / 2); + break; + case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT: + cairo_rotate (cr, G_PI / 2); + break; + default: + g_assert_not_reached (); + break; + } + cairo_translate (cr, size / 4.0, 0); line_width = size / 3.0 / sqrt (2); cairo_set_line_width (cr, line_width); @@ -867,9 +886,13 @@ gtk_css_image_builtin_draw (GtkCssImage *image, fg_color, bg_color, border_color, border_width); break; - case GTK_CSS_IMAGE_BUILTIN_ARROW: + case GTK_CSS_IMAGE_BUILTIN_ARROW_UP: + case GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN: + case GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT: + case GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT: gtk_css_image_builtin_draw_arrow (image, cr, width, height, + image_type, fg_color); break; case GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT: diff --git a/gtk/gtkcssimagebuiltinprivate.h b/gtk/gtkcssimagebuiltinprivate.h index 3f11a79915..082a6e3111 100644 --- a/gtk/gtkcssimagebuiltinprivate.h +++ b/gtk/gtkcssimagebuiltinprivate.h @@ -33,7 +33,10 @@ typedef enum { GTK_CSS_IMAGE_BUILTIN_OPTION, GTK_CSS_IMAGE_BUILTIN_OPTION_CHECKED, GTK_CSS_IMAGE_BUILTIN_OPTION_INCONSISTENT, - GTK_CSS_IMAGE_BUILTIN_ARROW, + GTK_CSS_IMAGE_BUILTIN_ARROW_UP, + GTK_CSS_IMAGE_BUILTIN_ARROW_DOWN, + GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT, + GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT, GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_LEFT, GTK_CSS_IMAGE_BUILTIN_EXPANDER_VERTICAL_LEFT, GTK_CSS_IMAGE_BUILTIN_EXPANDER_HORIZONTAL_RIGHT, diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c index 542c4670e2..54bc410036 100644 --- a/gtk/gtkrender.c +++ b/gtk/gtkrender.c @@ -287,8 +287,32 @@ gtk_do_render_arrow (GtkStyleContext *context, gdouble size) { GtkBorderStyle border_style; + GtkCssImageBuiltinType image_type; gint border_width; + /* 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; + } + if (render_icon_image (context, cr, x, y, size, size)) return; @@ -310,14 +334,12 @@ gtk_do_render_arrow (GtkStyleContext *context, border_width = 0; } - cairo_translate (cr, x + size / 2.0, y + size / 2.0); - cairo_rotate (cr, angle - G_PI_2); - cairo_translate (cr, - size / 2.0, - size / 2.0); + cairo_translate (cr, x, y); gtk_css_image_builtin_draw (_gtk_css_image_value_get_image (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_ICON_SOURCE)), cr, size, size, - GTK_CSS_IMAGE_BUILTIN_ARROW, + image_type, _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)), _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)), _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_COLOR)), |