From a3d1db608b1978a00862bdf4a785839fcf72dae4 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 31 Jul 2014 16:10:17 +0200 Subject: [PATCH] label: Don't clip text shadows The previous code for computing the clip rectangle forgot to respect the text-shadow CSS property. This is usually not very visible because text shadows usually don't extend the ink rectangle by very much. See attached testcase for an example. --- gtk/gtklabel.c | 14 +++++--- testsuite/reftests/Makefile.am | 2 ++ .../label-text-shadow-clipping.ref.ui | 18 +++++++++++ .../reftests/label-text-shadow-clipping.ui | 32 +++++++++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 testsuite/reftests/label-text-shadow-clipping.ref.ui create mode 100644 testsuite/reftests/label-text-shadow-clipping.ui diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 17b4ca31a3..189a1ae999 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -30,6 +30,7 @@ #include "gtklabel.h" #include "gtklabelprivate.h" #include "gtkaccellabel.h" +#include "gtkcssshadowsvalueprivate.h" #include "gtkdnd.h" #include "gtkmarshalers.h" #include "gtkpango.h" @@ -46,6 +47,7 @@ #include "gtkbuildable.h" #include "gtkimage.h" #include "gtkshow.h" +#include "gtkstylecontextprivate.h" #include "gtktooltip.h" #include "gtkprivate.h" #include "gtktypebuiltins.h" @@ -3960,17 +3962,21 @@ gtk_label_get_ink_rect (GtkLabel *label, GdkRectangle *rect) { GtkLabelPrivate *priv = label->priv; + GtkStyleContext *context; PangoRectangle ink_rect; + GtkBorder extents; int x, y; gtk_label_ensure_layout (label); get_layout_location (label, &x, &y); pango_layout_get_pixel_extents (priv->layout, &ink_rect, NULL); + context = gtk_widget_get_style_context (GTK_WIDGET (label)); + _gtk_css_shadows_value_get_extents (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_SHADOW), &extents); - rect->x = x + ink_rect.x; - rect->width = ink_rect.width; - rect->y = y + ink_rect.y; - rect->height = ink_rect.height; + rect->x = x + ink_rect.x - extents.left; + rect->width = ink_rect.width + extents.left + extents.right; + rect->y = y + ink_rect.y - extents.top; + rect->height = ink_rect.height + extents.top + extents.bottom; } static void diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am index b0422ed4b1..2607ecc8c7 100644 --- a/testsuite/reftests/Makefile.am +++ b/testsuite/reftests/Makefile.am @@ -266,6 +266,8 @@ testdata = \ label-sizing.ui \ label-small-ellipsized.ref.ui \ label-small-ellipsized.ui \ + label-text-shadow-clipping.ref.ui \ + label-text-shadow-clipping.ui \ label-width-chars-dont-shrink.ref.ui \ label-width-chars-dont-shrink.ui \ label-wrap-justify.ref.ui \ diff --git a/testsuite/reftests/label-text-shadow-clipping.ref.ui b/testsuite/reftests/label-text-shadow-clipping.ref.ui new file mode 100644 index 0000000000..c8fa838299 --- /dev/null +++ b/testsuite/reftests/label-text-shadow-clipping.ref.ui @@ -0,0 +1,18 @@ + + + + + + 500 + 100 + False + popup + + + True + False + Hello World + + + + diff --git a/testsuite/reftests/label-text-shadow-clipping.ui b/testsuite/reftests/label-text-shadow-clipping.ui new file mode 100644 index 0000000000..018caeb3fa --- /dev/null +++ b/testsuite/reftests/label-text-shadow-clipping.ui @@ -0,0 +1,32 @@ + + + + + + 500 + 100 + False + popup + + + True + False + center + center + vertical + + + True + False + Hello World + + + False + True + 0 + + + + + +