From 7afac9670bc5c0295070edc7f357ccafc2e7beec Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 1 Oct 2014 06:04:19 +0200 Subject: [PATCH] image: Implement clipping support for icon-shadow Testcase is attached. --- gtk/gtkimage.c | 26 +++++++++++++++ testsuite/reftests/Makefile.am | 3 ++ .../reftests/image-icon-shadow-clipping.css | 5 +++ .../image-icon-shadow-clipping.ref.ui | 18 +++++++++++ .../reftests/image-icon-shadow-clipping.ui | 32 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 testsuite/reftests/image-icon-shadow-clipping.css create mode 100644 testsuite/reftests/image-icon-shadow-clipping.ref.ui create mode 100644 testsuite/reftests/image-icon-shadow-clipping.ui diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index 80b514d98f..a50298cad2 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -38,6 +38,9 @@ #include "gtkintl.h" #include "gtkprivate.h" #include "gtktypebuiltins.h" +#include "gtkcssshadowsvalueprivate.h" +#include "gtkstylecontextprivate.h" +#include "gtkwidgetprivate.h" #include "a11y/gtkimageaccessible.h" @@ -146,6 +149,8 @@ struct _GtkImagePrivate #define DEFAULT_ICON_SIZE GTK_ICON_SIZE_BUTTON static gint gtk_image_draw (GtkWidget *widget, cairo_t *cr); +static void gtk_image_size_allocate (GtkWidget *widget, + GtkAllocation*allocation); static void gtk_image_unmap (GtkWidget *widget); static void gtk_image_realize (GtkWidget *widget); static void gtk_image_unrealize (GtkWidget *widget); @@ -218,6 +223,7 @@ gtk_image_class_init (GtkImageClass *class) widget_class->get_preferred_width = gtk_image_get_preferred_width; widget_class->get_preferred_height = gtk_image_get_preferred_height; widget_class->get_preferred_height_and_baseline_for_width = gtk_image_get_preferred_height_and_baseline_for_width; + widget_class->size_allocate = gtk_image_size_allocate; widget_class->unmap = gtk_image_unmap; widget_class->realize = gtk_image_realize; widget_class->unrealize = gtk_image_unrealize; @@ -1522,6 +1528,26 @@ gtk_image_reset_anim_iter (GtkImage *image) } } +static void +gtk_image_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkBorder extents; + GtkAllocation clip; + + GTK_WIDGET_CLASS (gtk_image_parent_class)->size_allocate (widget, allocation); + + /* XXX: This is not strictly correct, we could compute the area + * actually occupied by the image, but I'm lazy... + */ + _gtk_css_shadows_value_get_extents (_gtk_style_context_peek_property (gtk_widget_get_style_context (widget), GTK_CSS_PROPERTY_ICON_SHADOW), &extents); + clip.x = allocation->x - extents.left; + clip.width = allocation->width + extents.left + extents.right; + clip.y = allocation->y - extents.top; + clip.height = allocation->height + extents.top + extents.bottom; + _gtk_widget_set_simple_clip (widget, &clip); +} + static void gtk_image_unmap (GtkWidget *widget) { diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am index 39cd5f146c..47c4864c97 100644 --- a/testsuite/reftests/Makefile.am +++ b/testsuite/reftests/Makefile.am @@ -268,6 +268,9 @@ testdata = \ iconview-empty.css \ iconview-empty.ui \ iconview-empty.ref.ui \ + image-icon-shadow-clipping.css \ + image-icon-shadow-clipping.ref.ui \ + image-icon-shadow-clipping.ui \ image-load-from-file.css \ image-load-from-file.ref.ui \ image-load-from-file.ui \ diff --git a/testsuite/reftests/image-icon-shadow-clipping.css b/testsuite/reftests/image-icon-shadow-clipping.css new file mode 100644 index 0000000000..4770cc1034 --- /dev/null +++ b/testsuite/reftests/image-icon-shadow-clipping.css @@ -0,0 +1,5 @@ +@import "reset-to-defaults.css"; + +GtkImage { + icon-shadow: 20px 20px tomato; +} diff --git a/testsuite/reftests/image-icon-shadow-clipping.ref.ui b/testsuite/reftests/image-icon-shadow-clipping.ref.ui new file mode 100644 index 0000000000..c670508230 --- /dev/null +++ b/testsuite/reftests/image-icon-shadow-clipping.ref.ui @@ -0,0 +1,18 @@ + + + + + + 100 + 100 + False + popup + + + True + False + edit-delete + + + + diff --git a/testsuite/reftests/image-icon-shadow-clipping.ui b/testsuite/reftests/image-icon-shadow-clipping.ui new file mode 100644 index 0000000000..1bddc5a4c0 --- /dev/null +++ b/testsuite/reftests/image-icon-shadow-clipping.ui @@ -0,0 +1,32 @@ + + + + + + 100 + 100 + False + popup + + + True + False + center + center + vertical + + + True + False + edit-delete + + + False + True + 0 + + + + + +