many more shadow options (8 shadow directions now)
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 11 Apr 2011 12:05:59 +0000 (12:05 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 11 Apr 2011 12:05:59 +0000 (12:05 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@58546 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Evas.h
src/lib/canvas/evas_object_text.c
src/lib/canvas/evas_object_textblock.c

index dd2da6c..56cd6de 100644 (file)
@@ -5234,6 +5234,10 @@ EAPI Eina_Bool                evas_object_image_source_unset           (Evas_Obj
  */
    typedef enum _Evas_Text_Style_Type
      {
+        /* basic styles (4 bits allocatedm use 0->10 now, 5 left) */
+#define EVAS_TEXT_STYLE_MASK_BASIC 0xf
+#define EVAS_TEXT_STYLE_BASIC_SET(x, s) \
+   do { x = ((x) & ~EVAS_TEXT_STYLE_MASK_BASIC) | (s); } while (0)
        EVAS_TEXT_STYLE_PLAIN,
        EVAS_TEXT_STYLE_SHADOW,
        EVAS_TEXT_STYLE_OUTLINE,
@@ -5243,9 +5247,21 @@ EAPI Eina_Bool                evas_object_image_source_unset           (Evas_Obj
        EVAS_TEXT_STYLE_FAR_SHADOW,
        EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW,
        EVAS_TEXT_STYLE_SOFT_SHADOW,
-       EVAS_TEXT_STYLE_FAR_SOFT_SHADOW
+       EVAS_TEXT_STYLE_FAR_SOFT_SHADOW,
+           
+#define EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION (0x7 << 4)
+#define EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(x, s) \
+   do { x = ((x) & ~EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION) | (s); } while (0)
+        /* OR these to modify shadow direction (3 bits needed) */
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT = (0x0 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM       = (0x1 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT  = (0x2 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT         = (0x3 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT     = (0x4 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP          = (0x5 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT    = (0x6 << 4),
+       EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT        = (0x7 << 4)
      } Evas_Text_Style_Type;
-
    
 /**
  * Creates a new text @c Evas_Object on the provided @c Evas canvas.
@@ -5259,6 +5275,7 @@ EAPI Eina_Bool                evas_object_image_source_unset           (Evas_Obj
  * @returns NULL on error, A pointer to a new @c Evas_Object on success.
  */
 EAPI Evas_Object      *evas_object_text_add              (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
+   
    EAPI void              evas_object_text_font_source_set  (Evas_Object *obj, const char *font) EINA_ARG_NONNULL(1);
    EAPI const char       *evas_object_text_font_source_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
    EAPI void              evas_object_text_font_set         (Evas_Object *obj, const char *font, Evas_Font_Size size) EINA_ARG_NONNULL(1);
index 81bda1f..1a6a433 100644 (file)
@@ -25,7 +25,7 @@ struct _Evas_Object_Text
         unsigned char  r, g, b, a;
       } outline, shadow, glow, glow2;
 
-      unsigned char               style;
+      unsigned char        style;
    } cur, prev;
 
    float                       ascent, descent;
@@ -1367,77 +1367,107 @@ evas_string_char_len_get(const char *str)
 void
 evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b)
 {
-   int sl, sr, st, sb;
+   int shad_sz = 0, shad_dst = 0, out_sz = 0;
+   int dx = 0, minx = 0, maxx = 0, shx1, shx2;
+   int dy = 0, miny = 0, maxy = 0, shy1, shy2;
+   int sl = 0, sr = 0, st = 0, sb = 0;
 
-   if (l) sl = *l;
-   else sl = 0;
+   switch (style & EVAS_TEXT_STYLE_MASK_BASIC)
+     {
+      case EVAS_TEXT_STYLE_SHADOW:
+        shad_dst = 1;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+      case EVAS_TEXT_STYLE_FAR_SHADOW:
+        shad_dst = 2;
+        out_sz = 1;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+        shad_dst = 1;
+        shad_sz = 2;
+        out_sz = 1;
+        break;
+      case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+        shad_dst = 2;
+        shad_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_SOFT_SHADOW:
+        shad_dst = 1;
+        shad_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_GLOW:
+      case EVAS_TEXT_STYLE_SOFT_OUTLINE:
+        out_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE:
+        out_sz = 1;
+        break;
+      default:
+        break;
+     }
+   switch (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;
+     }
+   minx = -out_sz;
+   maxx = out_sz;
+   shx1 = dx * shad_dst;
+   shx1 -= shad_sz;
+   shx2 = dx * shad_dst;
+   shx2 += shad_sz;
+   if (shx1 < minx) minx = shx1;
+   if (shx2 > maxx) maxx = shx2;
+   
+   miny = -out_sz;
+   maxy = out_sz;
+   shy1 = dy * shad_dst;
+   shy1 -= shad_sz;
+   shy2 = dy * shad_dst;
+   shy2 += shad_sz;
+   if (shy1 < miny) miny = shy1;
+   if (shy2 > maxy) maxy = shy2;
 
+   if (l) sl = *l;
    if (r) sr = *r;
-   else sr = 0;
-
    if (t) st = *t;
-   else st = 0;
-
    if (b) sb = *b;
-   else sb = 0;
 
-   if (style == EVAS_TEXT_STYLE_SHADOW)
-     {
-       if (sr < 1) sr = 1;
-       if (sb < 1) sb = 1;
-     }
-   else if (style == EVAS_TEXT_STYLE_OUTLINE)
-     {
-       if (sl < 1) sl = 1;
-       if (sr < 1) sr = 1;
-       if (st < 1) st = 1;
-       if (sb < 1) sb = 1;
-     }
-   else if (style == EVAS_TEXT_STYLE_SOFT_OUTLINE)
-     {
-       if (sl < 2) sl = 2;
-       if (sr < 2) sr = 2;
-       if (st < 2) st = 2;
-       if (sb < 2) sb = 2;
-     }
-   else if (style == EVAS_TEXT_STYLE_GLOW)
-     {
-       if (sl < 2) sl = 2;
-       if (sr < 2) sr = 2;
-       if (st < 2) st = 2;
-       if (sb < 2) sb = 2;
-     }
-   else if (style == EVAS_TEXT_STYLE_OUTLINE_SHADOW)
-     {
-       if (sl < 1) sl = 1;
-       if (sr < 2) sr = 2;
-       if (st < 1) st = 1;
-       if (sb < 2) sb = 2;
-     }
-   else if (style == EVAS_TEXT_STYLE_FAR_SHADOW)
-     {
-       if (sr < 2) sr = 2;
-       if (sb < 2) sb = 2;
-     }
-   else if (style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)
-     {
-       if (sl < 1) sl = 1;
-       if (sr < 3) sr = 3;
-       if (st < 1) st = 1;
-       if (sb < 3) sb = 3;
-     }
-   else if (style == EVAS_TEXT_STYLE_SOFT_SHADOW)
-     {
-       if (sl < 1) sl = 1;
-       if (sr < 3) sr = 3;
-       if (st < 1) st = 1;
-       if (sb < 3) sb = 3;
-     }
-   else if (style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW)
-     {
-       if (sr < 4) sr = 4;
-       if (sb < 4) sb = 4;
-     }
+   if (sr < maxx) sr = maxx;
+   if (sl < -minx) sl = -minx;
+   if (sb < maxy) sb = maxy;
+   if (st < -miny) st = -miny;
 
    if (l) *l = sl;
    if (r) *r = sr;
@@ -1600,35 +1630,79 @@ evas_object_text_render(Evas_Object *obj, void *output, void *context, void *sur
                     it->text, &it->text_props);
    EINA_INLIST_FOREACH(EINA_INLIST_GET(o->items), it)
      {
+        int shad_dst, shad_sz, dx, dy;
+
         /* shadows */
-        if (o->cur.style == EVAS_TEXT_STYLE_SHADOW)
+        shad_dst = shad_sz = dx = dy = 0;
+        switch (o->cur.style & EVAS_TEXT_STYLE_MASK_BASIC)
           {
-             COLOR_SET(o, cur, shadow);
-             DRAW_TEXT(1, 1);
-          }
-        else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
-              (o->cur.style == EVAS_TEXT_STYLE_FAR_SHADOW))
-          {
-             COLOR_SET(o, cur, shadow);
-             DRAW_TEXT(2, 2);
+           case EVAS_TEXT_STYLE_SHADOW:
+           case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+             shad_dst = 1;
+             break;
+           case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+           case EVAS_TEXT_STYLE_FAR_SHADOW:
+             shad_dst = 2;
+             break;
+           case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+             shad_dst = 2;
+             shad_sz = 2;
+             break;
+           case EVAS_TEXT_STYLE_SOFT_SHADOW:
+             shad_dst = 1;
+             shad_sz = 2;
+             break;
+           default:
+             break;
           }
-        else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) ||
-              (o->cur.style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW))
+        if (shad_dst > 0)
           {
-             for (j = 0; j < 5; j++)
+             switch (o->cur.style & EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION)
                {
-                  for (i = 0; i < 5; i++)
-                    {
-                       if (vals[i][j] != 0)
-                         {
-                            COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50);
-                            DRAW_TEXT(i, j);
-                         }
-                    }
+                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;
           }
-        else if (o->cur.style == EVAS_TEXT_STYLE_SOFT_SHADOW)
+        switch (shad_sz)
           {
+           case 0:
+             COLOR_SET(o, cur, shadow);
+             DRAW_TEXT(dx, dy);
+             break;
+           case 2:
              for (j = 0; j < 5; j++)
                {
                   for (i = 0; i < 5; i++)
@@ -1636,12 +1710,15 @@ evas_object_text_render(Evas_Object *obj, void *output, void *context, void *sur
                        if (vals[i][j] != 0)
                          {
                             COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50);
-                            DRAW_TEXT(i - 1, j - 1);
+                            DRAW_TEXT(i - 2 + dx, j - 2 + dy);
                          }
                     }
                }
+             break;
+           default:
+             break;
           }
-
+        
         /* glows */
         if (o->cur.style == EVAS_TEXT_STYLE_GLOW)
           {
index 2f5bee7..74b483b 100644 (file)
@@ -287,16 +287,14 @@ struct _Evas_Object_Textblock_Format_Item
 
 struct _Evas_Object_Textblock_Format
 {
-   int                  ref;
    double               halign;
-   Eina_Bool            halign_auto;
    double               valign;
    struct {
       const char       *name;
       const char       *source;
       const char       *fallbacks;
-      int               size;
       void             *font;
+      int               size;
    } font;
    struct {
       struct {
@@ -307,13 +305,15 @@ struct _Evas_Object_Textblock_Format
    struct {
       int               l, r;
    } margin;
+   int                  ref;
    int                  tabstops;
    int                  linesize;
-   double               linerelsize;
    int                  linegap;
+   double               linerelsize;
    double               linerelgap;
    double               linefill;
    double               ellipsis;
+   Eina_Bool            halign_auto;
    unsigned char        style;
    unsigned char        wrap_word : 1;
    unsigned char        wrap_char : 1;
@@ -1125,9 +1125,11 @@ static void
 _format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char *cmd, const char *param)
 {
    int new_font = 0;
+   int len;
    char *tmp_param;
 
-   tmp_param = alloca(strlen(param) + 1);
+   len = strlen(param);
+   tmp_param = alloca(len + 1);
 
    _format_clean_param(tmp_param, param);
    if (cmd == fontstr)
@@ -1351,19 +1353,60 @@ _format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char
      }
    else if (cmd == stylestr)
      {
-        if (!strcmp(tmp_param, "off")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
-        else if (!strcmp(tmp_param, "none")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
-        else if (!strcmp(tmp_param, "plain")) fmt->style = EVAS_TEXT_STYLE_PLAIN;
-        else if (!strcmp(tmp_param, "shadow")) fmt->style = EVAS_TEXT_STYLE_SHADOW;
-        else if (!strcmp(tmp_param, "outline")) fmt->style = EVAS_TEXT_STYLE_OUTLINE;
-        else if (!strcmp(tmp_param, "soft_outline")) fmt->style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
-        else if (!strcmp(tmp_param, "outline_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
-        else if (!strcmp(tmp_param, "outline_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
-        else if (!strcmp(tmp_param, "glow")) fmt->style = EVAS_TEXT_STYLE_GLOW;
-        else if (!strcmp(tmp_param, "far_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SHADOW;
-        else if (!strcmp(tmp_param, "soft_shadow")) fmt->style = EVAS_TEXT_STYLE_SOFT_SHADOW;
-        else if (!strcmp(tmp_param, "far_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
-        else fmt->style = EVAS_TEXT_STYLE_PLAIN;
+        char *p1, *p2, *p, *pp;
+        
+        p1 = alloca(len + 1);
+        *p1 = 0;
+        p2 = alloca(len + 1);
+        *p2 = 0;
+        /* no comma */
+        if (!strstr(tmp_param, ",")) p1 = tmp_param;
+        else
+          {
+             /* split string "str1,str2" into p1 and p2 (if we have more than
+              * 1 str2 eg "str1,str2,str3,str4" then we don't care. p2 just
+              * ends up being the last one as right now it's only valid to have
+              * 1 comma and 2 strings */
+             pp = p1;
+             for (p = tmp_param; *p; p++)
+               {
+                  if (*p == ',')
+                    {
+                       *pp = 0;
+                       pp = p2;
+                       continue;
+                    }
+                  *pp = *p;
+                  pp++;
+               }
+             *pp = 0;
+          }
+        if      (!strcmp(p1, "off"))                 fmt->style = EVAS_TEXT_STYLE_PLAIN;
+        else if (!strcmp(p1, "none"))                fmt->style = EVAS_TEXT_STYLE_PLAIN;
+        else if (!strcmp(p1, "plain"))               fmt->style = EVAS_TEXT_STYLE_PLAIN;
+        else if (!strcmp(p1, "shadow"))              fmt->style = EVAS_TEXT_STYLE_SHADOW;
+        else if (!strcmp(p1, "outline"))             fmt->style = EVAS_TEXT_STYLE_OUTLINE;
+        else if (!strcmp(p1, "soft_outline"))        fmt->style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
+        else if (!strcmp(p1, "outline_shadow"))      fmt->style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
+        else if (!strcmp(p1, "outline_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
+        else if (!strcmp(p1, "glow"))                fmt->style = EVAS_TEXT_STYLE_GLOW;
+        else if (!strcmp(p1, "far_shadow"))          fmt->style = EVAS_TEXT_STYLE_FAR_SHADOW;
+        else if (!strcmp(p1, "soft_shadow"))         fmt->style = EVAS_TEXT_STYLE_SOFT_SHADOW;
+        else if (!strcmp(p1, "far_soft_shadow"))     fmt->style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
+        else                                         fmt->style = EVAS_TEXT_STYLE_PLAIN;
+        
+        if (*p2)
+          {
+             if      (!strcmp(p2, "bottom_right")) EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT);
+             else if (!strcmp(p2, "bottom"))       EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM);
+             else if (!strcmp(p2, "bottom_left"))  EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT);
+             else if (!strcmp(p2, "left"))         EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT);
+             else if (!strcmp(p2, "top_left"))     EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT);
+             else if (!strcmp(p2, "top"))          EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP);
+             else if (!strcmp(p2, "top_right"))    EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT);
+             else if (!strcmp(p2, "right"))        EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT);
+             else                                  EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT);
+          }
      }
    else if (cmd == tabstopsstr)
      {
@@ -2517,6 +2560,8 @@ _text_item_update_sizes(Ctxt *c, Evas_Object_Textblock_Text_Item *ti)
 {
    int tw, th, inset, right_inset;
    const Evas_Object_Textblock_Format *fmt = ti->parent.format;
+   int shad_sz = 0, shad_dst = 0, out_sz = 0;
+   int dx = 0, minx = 0, maxx = 0, shx1, shx2;
 
    tw = th = 0;
    if (fmt->font.font)
@@ -2533,35 +2578,69 @@ _text_item_update_sizes(Ctxt *c, Evas_Object_Textblock_Text_Item *ti)
 
    /* These adjustments are calculated and thus heavily linked to those in
     * textblock_render!!! Don't change one without the other. */
-   switch (ti->parent.format->style)
-     {
-        case EVAS_TEXT_STYLE_SHADOW:
-           ti->x_adjustment = 1;
-           break;
-        case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
-        case EVAS_TEXT_STYLE_FAR_SHADOW:
-           ti->x_adjustment = 2;
-           break;
-        case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
-        case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
-           ti->x_adjustment = 4;
-           break;
-        case EVAS_TEXT_STYLE_SOFT_SHADOW:
-           inset += 1;
-           ti->x_adjustment = 4;
-           break;
-        case EVAS_TEXT_STYLE_GLOW:
-        case EVAS_TEXT_STYLE_SOFT_OUTLINE:
-           inset += 2;
-           ti->x_adjustment = 4;
-           break;
-        case EVAS_TEXT_STYLE_OUTLINE:
-           inset += 1;
-           ti->x_adjustment = 1;
-           break;
-        default:
-           break;
-     }
+   
+   // XXX: YYY: handle EVAS_TEXT_STYLE_SHADOW_DIRECTION*
+   switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC)
+     {
+      case EVAS_TEXT_STYLE_SHADOW:
+        shad_dst = 1;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+      case EVAS_TEXT_STYLE_FAR_SHADOW:
+        shad_dst = 2;
+        out_sz = 1;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+        shad_dst = 1;
+        shad_sz = 2;
+        out_sz = 1;
+        break;
+      case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+        shad_dst = 2;
+        shad_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_SOFT_SHADOW:
+        shad_dst = 1;
+        shad_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_GLOW:
+      case EVAS_TEXT_STYLE_SOFT_OUTLINE:
+        out_sz = 2;
+        break;
+      case EVAS_TEXT_STYLE_OUTLINE:
+        out_sz = 1;
+        break;
+      default:
+        break;
+     }
+   switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION)
+     {
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT:
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT:
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT:
+        dx = -1;
+        break;
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT:
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT:
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT:
+        dx = 1;
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP:
+      case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM:
+      default:
+        dx = 0;
+        break;
+     }
+   minx = -out_sz;
+   maxx = out_sz;
+   shx1 = dx * shad_dst;
+   shx1 -= shad_sz;
+   shx2 = dx * shad_dst;
+   shx2 += shad_sz;
+   if (shx1 < minx) minx = shx1;
+   if (shx2 > maxx) maxx = shx2;
+   inset += -minx;
+   ti->x_adjustment = maxx - minx;
+   
    ti->inset = inset;
    ti->parent.w = tw + ti->x_adjustment;
    ti->parent.h = th;
@@ -7913,39 +7992,82 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
    /* shadows */
    ITEM_WALK()
      {
+        int shad_dst, shad_sz, dx, dy;
         Evas_Object_Textblock_Text_Item *ti;
         ITEM_WALK_LINE_SKIP_DROP();
         ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL;
         if (!ti) continue;
 
-        if (ti->parent.format->style == EVAS_TEXT_STYLE_SHADOW)
-          {
-             COLOR_SET(shadow);
-             DRAW_TEXT(1, 1);
-          }
-        else if ((ti->parent.format->style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) ||
-              (ti->parent.format->style == EVAS_TEXT_STYLE_FAR_SHADOW))
+        shad_dst = shad_sz = dx = dy = 0;
+        switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC)
           {
-             COLOR_SET(shadow);
-             DRAW_TEXT(2, 2);
+           case EVAS_TEXT_STYLE_SHADOW:
+           case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+             shad_dst = 1;
+             break;
+           case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+           case EVAS_TEXT_STYLE_FAR_SHADOW:
+             shad_dst = 2;
+             break;
+           case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+             shad_dst = 2;
+             shad_sz = 2;
+             break;
+           case EVAS_TEXT_STYLE_SOFT_SHADOW:
+             shad_dst = 1;
+             shad_sz = 2;
+             break;
+           default:
+             break;
           }
-        else if ((ti->parent.format->style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) ||
-              (ti->parent.format->style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW))
+        if (shad_dst > 0)
           {
-             for (j = 0; j < 5; j++)
+             switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION)
                {
-                  for (i = 0; i < 5; i++)
-                    {
-                       if (vals[i][j] != 0)
-                         {
-                            COLOR_SET_AMUL(shadow, vals[i][j] * 50);
-                            DRAW_TEXT(i, j);
-                         }
-                    }
+                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;
           }
-        else if (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_SHADOW)
+        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++)
@@ -7953,10 +8075,13 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
                        if (vals[i][j] != 0)
                          {
                             COLOR_SET_AMUL(shadow, vals[i][j] * 50);
-                            DRAW_TEXT(i - 1, j - 1);
+                            DRAW_TEXT(i - 2 + dx, j - 2 + dy);
                          }
                     }
                }
+             break;
+           default:
+             break;
           }
      }
    ITEM_WALK_END();