cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=766bd426396e4771d2e22b83bf4110c466ad53d4

commit 766bd426396e4771d2e22b83bf4110c466ad53d4
Author: Cedric BAIL <[email protected]>
Date:   Thu Dec 26 11:27:09 2013 +0900

    evas: limit how many times we walk over items.
    
    This does help for some textblock benchmark with a speed increase of 12% and
    the one that don't get better don't get slower either, so let's put that in.
---
 src/lib/evas/canvas/evas_object_textblock.c | 309 ++++++++++++++++------------
 1 file changed, 177 insertions(+), 132 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_textblock.c 
b/src/lib/evas/canvas/evas_object_textblock.c
index 2b832c7..1fe0f16 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -10718,6 +10718,9 @@ evas_object_textblock_render(Evas_Object *eo_obj 
EINA_UNUSED,
          {1, 3, 4, 3, 1},
          {0, 1, 2, 1, 0}
      };
+   Eina_Bool have_shadow = EINA_FALSE;
+   Eina_Bool have_glow = EINA_FALSE;
+   Eina_Bool have_outline = EINA_FALSE;
 
    /* render object to surface with context, and offxet by x,y */
    obj->layer->evas->engine.func->context_multiplier_unset(output,
@@ -10889,6 +10892,39 @@ evas_object_textblock_render(Evas_Object *eo_obj 
EINA_UNUSED,
 
    ITEM_WALK()
      {
+        /* Check which other pass are necessary to avoid useless WALK */
+        if (!have_shadow && !have_glow && !have_outline)
+          {
+             Evas_Object_Textblock_Text_Item *ti;
+
+             ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : 
NULL;
+             if (ti)
+               {
+                  if (ti->parent.format->style & (EVAS_TEXT_STYLE_SHADOW |
+                                                  
EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW |
+                                                  
EVAS_TEXT_STYLE_OUTLINE_SHADOW |
+                                                  EVAS_TEXT_STYLE_FAR_SHADOW |
+                                                  
EVAS_TEXT_STYLE_FAR_SOFT_SHADOW |
+                                                  EVAS_TEXT_STYLE_SOFT_SHADOW))
+                    {
+                       have_shadow = EINA_TRUE;
+                    }
+                  if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) 
==
+                      EVAS_TEXT_STYLE_GLOW)
+                    {
+                       have_glow = EINA_TRUE;
+                    }
+                  if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) 
== EVAS_TEXT_STYLE_OUTLINE) ||
+                      ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) 
== EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+                      ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) 
== EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) ||
+                      (ti->parent.format->style == 
EVAS_TEXT_STYLE_SOFT_OUTLINE))
+                    {
+                       have_outline = EINA_TRUE;
+                    }
+               }
+
+          }
+
         DRAW_FORMAT(backing, 0, ln->h);
      }
    ITEM_WALK_END();
@@ -10899,174 +10935,183 @@ evas_object_textblock_render(Evas_Object *eo_obj 
EINA_UNUSED,
    /* prepare everything for text draw */
 
    /* shadows */
-   ITEM_WALK()
+   if (have_shadow)
      {
-        int shad_dst, shad_sz, dx, dy, haveshad;
-        Evas_Object_Textblock_Text_Item *ti;
-        ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL;
-        if (!ti) continue;
-
-        shad_dst = shad_sz = dx = dy = haveshad = 0;
-        switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC)
-          {
-           case EVAS_TEXT_STYLE_SHADOW:
-             shad_dst = 1;
-             haveshad = 1;
-             break;
-           case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
-             shad_dst = 1;
-             shad_sz = 2;
-             haveshad = 1;
-             break;
-           case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
-           case EVAS_TEXT_STYLE_FAR_SHADOW:
-             shad_dst = 2;
-             haveshad = 1;
-             break;
-           case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
-             shad_dst = 2;
-             shad_sz = 2;
-             haveshad = 1;
-             break;
-           case EVAS_TEXT_STYLE_SOFT_SHADOW:
-             shad_dst = 1;
-             shad_sz = 2;
-             haveshad = 1;
-             break;
-           default:
-             break;
-          }
-        if (haveshad)
+        ITEM_WALK()
           {
-             if (shad_dst > 0)
+             int shad_dst, shad_sz, dx, dy, haveshad;
+             Evas_Object_Textblock_Text_Item *ti;
+             ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : 
NULL;
+             if (!ti) continue;
+
+             shad_dst = shad_sz = dx = dy = haveshad = 0;
+             switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC)
                {
-                  switch (ti->parent.format->style & 
EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION)
-                    {
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT:
-                       dx = 1;
-                       dy = 1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM:
-                       dx = 0;
-                       dy = 1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT:
-                       dx = -1;
-                       dy = 1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT:
-                       dx = -1;
-                       dy = 0;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT:
-                       dx = -1;
-                       dy = -1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP:
-                       dx = 0;
-                       dy = -1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT:
-                       dx = 1;
-                       dy = -1;
-                       break;
-                     case EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT:
-                       dx = 1;
-                       dy = 0;
-                     default:
-                       break;
-                    }
-                  dx *= shad_dst;
-                  dy *= shad_dst;
+                case EVAS_TEXT_STYLE_SHADOW:
+                   shad_dst = 1;
+                   haveshad = 1;
+                   break;
+                case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+                   shad_dst = 1;
+                   shad_sz = 2;
+                   haveshad = 1;
+                   break;
+                case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+                case EVAS_TEXT_STYLE_FAR_SHADOW:
+                   shad_dst = 2;
+                   haveshad = 1;
+                   break;
+                case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+                   shad_dst = 2;
+                   shad_sz = 2;
+                   haveshad = 1;
+                   break;
+                case EVAS_TEXT_STYLE_SOFT_SHADOW:
+                   shad_dst = 1;
+                   shad_sz = 2;
+                   haveshad = 1;
+                   break;
+                default:
+                   break;
                }
-             switch (shad_sz)
+             if (haveshad)
                {
-                case 0:
-                  COLOR_SET(shadow);
-                  DRAW_TEXT(dx, dy);
-                  break;
-                case 2:
-                  for (j = 0; j < 5; j++)
+                  if (shad_dst > 0)
                     {
-                       for (i = 0; i < 5; i++)
+                       switch (ti->parent.format->style & 
EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION)
                          {
-                            if (vals[i][j] != 0)
-                              {
-                                 COLOR_SET_AMUL(shadow, vals[i][j] * 50);
-                                 DRAW_TEXT(i - 2 + dx, j - 2 + dy);
-                              }
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT:
+                             dx = 1;
+                             dy = 1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM:
+                             dx = 0;
+                             dy = 1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT:
+                             dx = -1;
+                             dy = 1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT:
+                             dx = -1;
+                             dy = 0;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT:
+                             dx = -1;
+                             dy = -1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP:
+                             dx = 0;
+                             dy = -1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT:
+                             dx = 1;
+                             dy = -1;
+                             break;
+                          case EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT:
+                             dx = 1;
+                             dy = 0;
+                          default:
+                             break;
                          }
+                       dx *= shad_dst;
+                       dy *= shad_dst;
+                    }
+                  switch (shad_sz)
+                    {
+                     case 0:
+                        COLOR_SET(shadow);
+                        DRAW_TEXT(dx, dy);
+                        break;
+                     case 2:
+                        for (j = 0; j < 5; j++)
+                          {
+                             for (i = 0; i < 5; i++)
+                               {
+                                  if (vals[i][j] != 0)
+                                    {
+                                       COLOR_SET_AMUL(shadow, vals[i][j] * 50);
+                                       DRAW_TEXT(i - 2 + dx, j - 2 + dy);
+                                    }
+                               }
+                          }
+                        break;
+                     default:
+                        break;
                     }
-                  break;
-                default:
-                  break;
                }
           }
+        ITEM_WALK_END();
      }
-   ITEM_WALK_END();
 
    /* glows */
-   ITEM_WALK()
+   if (have_glow)
      {
-        Evas_Object_Textblock_Text_Item *ti;
-        ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL;
-        if (!ti) continue;
-
-        if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_GLOW)
+        ITEM_WALK()
           {
-             for (j = 0; j < 5; j++)
+             Evas_Object_Textblock_Text_Item *ti;
+             ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : 
NULL;
+             if (!ti) continue;
+
+             if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_GLOW)
                {
-                  for (i = 0; i < 5; i++)
+                  for (j = 0; j < 5; j++)
                     {
-                       if (vals[i][j] != 0)
+                       for (i = 0; i < 5; i++)
                          {
-                            COLOR_SET_AMUL(glow, vals[i][j] * 50);
-                            DRAW_TEXT(i - 2, j - 2);
+                            if (vals[i][j] != 0)
+                              {
+                                 COLOR_SET_AMUL(glow, vals[i][j] * 50);
+                                 DRAW_TEXT(i - 2, j - 2);
+                              }
                          }
                     }
+                  COLOR_SET(glow2);
+                  DRAW_TEXT(-1, 0);
+                  DRAW_TEXT(1, 0);
+                  DRAW_TEXT(0, -1);
+                  DRAW_TEXT(0, 1);
                }
-             COLOR_SET(glow2);
-             DRAW_TEXT(-1, 0);
-             DRAW_TEXT(1, 0);
-             DRAW_TEXT(0, -1);
-             DRAW_TEXT(0, 1);
           }
+        ITEM_WALK_END();
      }
-   ITEM_WALK_END();
 
    /* outlines */
-   ITEM_WALK()
+   if (have_outline)
      {
-        Evas_Object_Textblock_Text_Item *ti;
-        ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL;
-        if (!ti) continue;
-
-        if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE) ||
-            ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
-            ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW))
-          {
-             COLOR_SET(outline);
-             DRAW_TEXT(-1, 0);
-             DRAW_TEXT(1, 0);
-             DRAW_TEXT(0, -1);
-             DRAW_TEXT(0, 1);
-          }
-        else if (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
+        ITEM_WALK()
           {
-             for (j = 0; j < 5; j++)
+             Evas_Object_Textblock_Text_Item *ti;
+             ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : 
NULL;
+             if (!ti) continue;
+
+             if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE) ||
+                 ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
+                 ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == 
EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW))
+               {
+                  COLOR_SET(outline);
+                  DRAW_TEXT(-1, 0);
+                  DRAW_TEXT(1, 0);
+                  DRAW_TEXT(0, -1);
+                  DRAW_TEXT(0, 1);
+               }
+             else if (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
                {
-                  for (i = 0; i < 5; i++)
+                  for (j = 0; j < 5; j++)
                     {
-                       if (((i != 2) || (j != 2)) && (vals[i][j] != 0))
+                       for (i = 0; i < 5; i++)
                          {
-                            COLOR_SET_AMUL(outline, vals[i][j] * 50);
-                            DRAW_TEXT(i - 2, j - 2);
+                            if (((i != 2) || (j != 2)) && (vals[i][j] != 0))
+                              {
+                                 COLOR_SET_AMUL(outline, vals[i][j] * 50);
+                                 DRAW_TEXT(i - 2, j - 2);
+                              }
                          }
                     }
                }
           }
+        ITEM_WALK_END();
      }
-   ITEM_WALK_END();
 
    /* normal text and lines */
    /* Get the thickness and position, and save them for non-text items. */

-- 


Reply via email to