[gtk+] label: Don't clip text shadows



commit a3d1db608b1978a00862bdf4a785839fcf72dae4
Author: Benjamin Otte <otte redhat com>
Date:   Thu Jul 31 16:10:17 2014 +0200

    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 +
 .../reftests/label-text-shadow-clipping.ref.ui     |   18 +++++++++++
 testsuite/reftests/label-text-shadow-clipping.ui   |   32 ++++++++++++++++++++
 4 files changed, 62 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 17b4ca3..189a1ae 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 b0422ed..2607ecc 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 0000000..c8fa838
--- /dev/null
+++ b/testsuite/reftests/label-text-shadow-clipping.ref.ui
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">500</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Hello World</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/label-text-shadow-clipping.ui 
b/testsuite/reftests/label-text-shadow-clipping.ui
new file mode 100644
index 0000000..018caeb
--- /dev/null
+++ b/testsuite/reftests/label-text-shadow-clipping.ui
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">500</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkBox" id="box2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="halign">center</property>
+        <property name="valign">center</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Hello World</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]