Index: src/lib/canvas/evas_object_textblock.c
===================================================================
--- src/lib/canvas/evas_object_textblock.c	(revision 63478)
+++ src/lib/canvas/evas_object_textblock.c	(working copy)
@@ -354,7 +354,7 @@ struct _Evas_Object_Textblock_Format
    struct {
       struct {
 	 unsigned char  r, g, b, a;
-      } normal, underline, underline2, outline, shadow, glow, glow2, backing,
+      } normal, underline, underline2, dashed_line, outline, shadow, glow, glow2, backing,
 	strikethrough;
    } color;
    struct {
@@ -364,6 +364,8 @@ struct _Evas_Object_Textblock_Format
    int                  tabstops;
    int                  linesize;
    int                  linegap;
+   int                  dashwidth;
+   int                  dashgap;
    double               linerelsize;
    double               linerelgap;
    double               linefill;
@@ -374,6 +376,7 @@ struct _Evas_Object_Textblock_Format
    Eina_Bool            wrap_mixed : 1;
    Eina_Bool            underline : 1;
    Eina_Bool            underline2 : 1;
+   Eina_Bool            dashed_line : 1;
    Eina_Bool            strikethrough : 1;
    Eina_Bool            backing : 1;
    Eina_Bool            password : 1;
@@ -997,6 +1000,7 @@ static const char *langstr = NULL;
 static const char *colorstr = NULL;
 static const char *underline_colorstr = NULL;
 static const char *underline2_colorstr = NULL;
+static const char *dashed_line_colorstr = NULL;
 static const char *outline_colorstr = NULL;
 static const char *shadow_colorstr = NULL;
 static const char *glow_colorstr = NULL;
@@ -1021,6 +1025,8 @@ static const char *itemstr = NULL;
 static const char *linefillstr = NULL;
 static const char *ellipsisstr = NULL;
 static const char *passwordstr = NULL;
+static const char *dashwidthstr = NULL;
+static const char *dashgapstr = NULL;
 
 /**
  * @internal
@@ -1042,6 +1048,7 @@ _format_command_init(void)
         colorstr = eina_stringshare_add("color");
         underline_colorstr = eina_stringshare_add("underline_color");
         underline2_colorstr = eina_stringshare_add("underline2_color");
+        dashed_line_colorstr = eina_stringshare_add("dashed_line_color");
         outline_colorstr = eina_stringshare_add("outline_color");
         shadow_colorstr = eina_stringshare_add("shadow_color");
         glow_colorstr = eina_stringshare_add("glow_color");
@@ -1066,6 +1073,8 @@ _format_command_init(void)
         linefillstr = eina_stringshare_add("linefill");
         ellipsisstr = eina_stringshare_add("ellipsis");
         passwordstr = eina_stringshare_add("password");
+        dashwidthstr = eina_stringshare_add("dashwidth");
+        dashgapstr = eina_stringshare_add("dashgap");
      }
    format_refcount++;
 }
@@ -1090,6 +1099,7 @@ _format_command_shutdown(void)
    eina_stringshare_del(colorstr);
    eina_stringshare_del(underline_colorstr);
    eina_stringshare_del(underline2_colorstr);
+   eina_stringshare_del(dashed_line_colorstr);
    eina_stringshare_del(outline_colorstr);
    eina_stringshare_del(shadow_colorstr);
    eina_stringshare_del(glow_colorstr);
@@ -1114,6 +1124,8 @@ _format_command_shutdown(void)
    eina_stringshare_del(linefillstr);
    eina_stringshare_del(ellipsisstr);
    eina_stringshare_del(passwordstr);
+   eina_stringshare_del(dashwidthstr);
+   eina_stringshare_del(dashgapstr);
 }
 
 /**
@@ -1234,6 +1246,10 @@ _format_command(Evas_Object *obj, Evas_Object_Text
      _format_color_parse(tmp_param,
            &(fmt->color.underline2.r), &(fmt->color.underline2.g),
            &(fmt->color.underline2.b), &(fmt->color.underline2.a));
+   else if (cmd == dashed_line_colorstr)
+     _format_color_parse(tmp_param,
+           &(fmt->color.dashed_line.r), &(fmt->color.dashed_line.g),
+           &(fmt->color.dashed_line.b), &(fmt->color.dashed_line.a));
    else if (cmd == outline_colorstr)
      _format_color_parse(tmp_param,
            &(fmt->color.outline.r), &(fmt->color.outline.g),
@@ -1382,6 +1398,8 @@ _format_command(Evas_Object *obj, Evas_Object_Text
              fmt->underline = 1;
              fmt->underline2 = 1;
           }
+        else if (!strcmp(tmp_param, "dashed"))
+          fmt->dashed_line = 1;
      }
    else if (cmd == strikethroughstr)
      {
@@ -1542,6 +1560,16 @@ _format_command(Evas_Object *obj, Evas_Object_Text
         else if (!strcmp(tmp_param, "on"))
           fmt->password = 1;
      }
+   else if (cmd == dashwidthstr)
+     {
+        fmt->dashwidth = atoi(tmp_param);
+        if (fmt->dashwidth <= 0) fmt->dashwidth = 1;
+     }
+   else if (cmd == dashgapstr)
+     {
+        fmt->dashgap = atoi(tmp_param);
+        if (fmt->dashgap <= 0) fmt->dashgap = 1;
+     }
 }
 
 /**
@@ -2077,6 +2105,8 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock
         fmt->linesize = 0;
         fmt->linerelsize = 0.0;
         fmt->linegap = 0;
+        fmt->dashwidth = 4;
+        fmt->dashgap = 4;
         fmt->linerelgap = 0.0;
         fmt->password = 1;
      }
@@ -3161,7 +3191,7 @@ _layout_do_format(const Evas_Object *obj __UNUSED_
 
    if (fmt->underline2)
      c->have_underline2 = 1;
-   else if (fmt->underline)
+   else if (fmt->underline || fmt->dashed_line)
      c->have_underline = 1;
    *_fmt = fmt;
 }
@@ -8959,6 +8989,39 @@ evas_object_textblock_render(Evas_Object *obj, voi
      } \
    while (0)
 
+#define DRAW_FORMAT_SPEC(oname, oy, oh, or, og, ob, oa, dw, dp) \
+   do \
+     { \
+        if (itr->format->oname) \
+          { \
+             int i,j,dx,dn; \
+             or = itr->format->color.oname.r; \
+             og = itr->format->color.oname.g; \
+             ob = itr->format->color.oname.b; \
+             oa = itr->format->color.oname.a; \
+             dn = itr->w/(dw + dp); \
+             j = itr->w/dn; \
+             dx = 0; \
+             if (!EINA_INLIST_GET(itr)->next) \
+               { \
+                  for (i = 0; i < dn; i++) \
+                    { \
+                       DRAW_RECT(itr->x+dx, oy, (j-dp), oh, or, og, ob, oa); \
+                       dx = dx+j; \
+                    } \
+               } \
+             else \
+               { \
+                for (i = 0; i < dn; i++) \
+                  { \
+                     DRAW_RECT(itr->x+dx, oy, (j-dp), oh, or, og, ob, oa); \
+                     dx = dx+j; \
+                  } \
+               } \
+          } \
+     } \
+   while (0)
+
 #define DRAW_FORMAT(oname, oy, oh, or, og, ob, oa) \
    do \
      { \
@@ -9191,6 +9254,9 @@ evas_object_textblock_render(Evas_Object *obj, voi
         /* UNDERLINE */
         DRAW_FORMAT(underline, ln->baseline + 1, 1, r2, g2, b2, a2);
 
+        /* UNDERLINE DASHED*/
+        DRAW_FORMAT_SPEC(dashed_line, ln->baseline + 2, 1, r2, g2, b2, a2, ti->parent.format->dashwidth, ti->parent.format->dashgap);
+
         /* UNDERLINE2 */
         DRAW_FORMAT(underline2, ln->baseline + 3, 1, r3, g3, b3, a3);
      }
