evas textblock: remove white space after line-break by a next item
authorYoungbok Shin <youngb.shin@samsung.com>
Wed, 14 Nov 2018 07:19:30 +0000 (09:19 +0200)
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>
Tue, 20 Nov 2018 07:01:29 +0000 (16:01 +0900)
Summary:
In some cases, white space at end of line is remained after line-break.
This issue is happened when Textblock do word wrap at the next item. Without
spliting a previous text item. Then, Textblock just skipped calling
_layout_item_text_split_strip_white() function.

This patch also fixed a wrong test case based on wrong logic.
The range rectangles shouldn't be overlapped. Because of remained white space,
a meaningless rectangle was added. And it overlapped by next rectangle.
@fix

Test Plan:
Fixed an exising test case for range renctangles.
Run test case.

Reviewers: herdsman, woohyun, raster, cedric, subodh, subodh6129

Subscribers: #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7204

src/lib/evas/canvas/evas_object_textblock.c
src/tests/evas/evas_test_textblock.c

index 66b4d76..39ba77d 100644 (file)
@@ -5685,7 +5685,7 @@ _layout_item_obstacle_get(Ctxt *c, Evas_Object_Textblock_Item *it);
 static int
 _layout_par(Ctxt *c)
 {
-   Evas_Object_Textblock_Item *it;
+   Evas_Object_Textblock_Item *it, *prev_it;
    Eina_List *i;
    int ret = 0;
    int wrap = -1;
@@ -5815,6 +5815,7 @@ _layout_par(Ctxt *c)
    Eina_Bool item_preadv = EINA_FALSE;
    Evas_Textblock_Obstacle *obs = NULL;
    c->par->last_fw = 0;
+   it = NULL;
    for (i = c->par->logical_items ; i ; )
      {
         Evas_Coord prevdescent = 0, prevascent = 0;
@@ -5826,6 +5827,7 @@ _layout_par(Ctxt *c)
         Evas_Coord needed_w = 0;
         /* END */
 
+        prev_it = it;
         it = _ITEM(eina_list_data_get(i));
         /* Skip visually deleted items */
         if (it->visually_deleted ||
@@ -6194,6 +6196,12 @@ _layout_par(Ctxt *c)
                   else if (wrap == 0)
                     {
                        /* Should wrap before the item */
+                       if (prev_it && (prev_it->type == EVAS_TEXTBLOCK_ITEM_TEXT))
+                         {
+                            _layout_item_text_split_strip_white(c,
+                                  _ITEM_TEXT(prev_it), eina_list_prev(i),
+                                  _ITEM_TEXT(prev_it)->text_props.text_len);
+                         }
 
                        /* We didn't end up using the item, so revert the ascent
                         * and descent changes. */
index 9246f77..29ab711 100644 (file)
@@ -2717,23 +2717,26 @@ EFL_START_TEST(evas_textblock_geometries)
    fail_if(!it);
    rects = eina_iterator_container_get(it);
    fail_if(!rects);
-   ck_assert_int_eq(eina_list_count(rects), 3);
+   ck_assert_int_eq(eina_list_count(rects), 2);
 
      {
-        Evas_Coord y1, y2;
+        Evas_Coord x1, y1, x2, y2;
         void *tmp = tr;
-        /* We have 3 rectangles */
+        /* We have 2 rectangles */
         Eina_Iterator *itr = it;
         fail_if (!eina_iterator_next(itr, &tmp));
         tr = tmp;
+        x1 = tr->x;
         y1 = tr->y;
         fail_if (!eina_iterator_next(itr, &tmp));
         tr = tmp;
+        x2 = tr->x;
         y2 = tr->y;
 
-        /* Basically it means that the "extending" rectangle should not somehow
-         * reach the second line in this example. */
-        ck_assert_int_eq(y1, y2);
+        /* These rectangles must be placed without overlapping.
+         * In this test case, we expect to see a rect for each line. */
+        fail_if((x1 == x2) && (y1 == y2));
+        ck_assert_int_ne(y1, y2);
         eina_iterator_free(it);
      }