[pango/ellipsize-height] Pass the right attributes when shaping ellipses



commit e554a8646dc1e8a643ae8bc46011fb79c0967d7c
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Aug 6 19:33:29 2019 -0700

    Pass the right attributes when shaping ellipses
    
    Now that we are splitting attributes into those that
    are relevant for itemization and shaping, we need to
    make sure to pass the right ones along when ellipsizing,
    or we risk picking a wildly mismatching font for the
    ellipsis run, causing things to shift vertically.
    
    Test included.
    
    Closes: https://gitlab.gnome.org/GNOME/pango/issues/397
    
    Thanks to Jorge Luis Martinez Gomez for his help
    in tracking this down.

 pango/pango-layout.c   |  2 +-
 tests/meson.build      |  1 +
 tests/test-ellipsize.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+), 1 deletion(-)
---
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 725ef0e0..67db57bb 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -4275,7 +4275,7 @@ pango_layout_check_lines (PangoLayout *layout)
       g_assert (delim_len < 4);        /* PS is 3 bytes */
       g_assert (delim_len >= 0);
 
-      state.attrs = attrs;
+      state.attrs = itemize_attrs;
       state.items = pango_itemize_with_base_dir (layout->context,
                                                 base_dir,
                                                 layout->text,
diff --git a/tests/meson.build b/tests/meson.build
index c425665c..aa4b0c42 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -38,6 +38,7 @@ if cairo_dep.found()
   test_cflags += '-DHAVE_CAIRO'
   tests += [
     [ 'testiter', [ 'testiter.c' ], [ libpangocairo_dep ] ],
+    [ 'test-ellipsize', [ 'test-ellipsize.c' ], [ libpangocairo_dep ] ],
     [ 'markup-parse', [ 'markup-parse.c' , 'test-common.c' ], [ libpangocairo_dep ] ],
     [ 'test-layout', [ 'test-layout.c', 'test-common.c' ], [ libpangocairo_dep ] ],
     [ 'test-itemize', [ 'test-itemize.c', 'test-common.c' ], [ libpangocairo_dep ] ],
diff --git a/tests/test-ellipsize.c b/tests/test-ellipsize.c
new file mode 100644
index 00000000..1c262aa1
--- /dev/null
+++ b/tests/test-ellipsize.c
@@ -0,0 +1,73 @@
+/* Pango
+ * test-ellipsize.c: Test Pango harfbuzz apis
+ *
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <pango/pango.h>
+#include <pango/pangocairo.h>
+#include "test-common.h"
+
+static PangoContext *context;
+
+/* Test that ellipsization does not change the
+ * height of a layout.
+ */
+static void
+test_ellipsize (void)
+{
+  PangoLayout *layout;
+  int height1, height2;
+  PangoFontDescription *desc;
+
+  layout = pango_layout_new (context);
+
+  desc = pango_font_description_from_string ("Fixed 7");
+  pango_layout_set_font_description (layout, desc);
+  pango_font_description_free (desc);
+
+  pango_layout_set_text (layout, "some text that should be ellipsized", -1);
+  g_assert_cmpint (pango_layout_get_line_count (layout), ==, 1);
+  pango_layout_get_pixel_size (layout, NULL, &height1);
+
+  pango_layout_set_width (layout, 100 * PANGO_SCALE);
+  pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
+
+  g_assert_cmpint (pango_layout_get_line_count (layout), ==, 1);
+  g_assert_cmpint (pango_layout_is_ellipsized (layout), ==, 1);
+  pango_layout_get_pixel_size (layout, NULL, &height2);
+
+  g_assert_cmpint (height1, ==, height2);
+
+  g_object_unref (layout);
+}
+
+int
+main (int argc, char *argv[])
+{
+  PangoFontMap *fontmap;
+
+  fontmap = pango_cairo_font_map_get_default ();
+  context = pango_font_map_create_context (fontmap);
+
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add_func ("/layout/ellipsize", test_ellipsize);
+
+  return g_test_run ();
+}


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