Evas textblock+font: Fixed the font fallbacks support.
authortasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 1 Aug 2011 08:21:09 +0000 (08:21 +0000)
committertasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 1 Aug 2011 08:21:09 +0000 (08:21 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@61940 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_font_dir.c
src/lib/canvas/evas_object_textblock.c
src/lib/include/evas_private.h

index e07dc9d..fa8e122 100644 (file)
@@ -405,6 +405,7 @@ evas_font_desc_unref(Evas_Font_Description *fdesc)
    if (--(fdesc->ref) == 0)
      {
         eina_stringshare_del(fdesc->name);
+        eina_stringshare_del(fdesc->fallbacks);
         free(fdesc);
      }
 }
@@ -707,9 +708,31 @@ evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Eva
               FC_WIDTH,  FcTypeInteger, _fc_width_map[fdesc->width],
 #endif
               NULL);
-        /* FIXME: Handle font fallbacks!!! */
         FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) fdesc->name);
 
+        /* Handle font fallbacks */
+        if (fdesc->fallbacks)
+          {
+             while (1)
+               {
+                  const char *start, *end;
+                  start = fdesc->fallbacks;
+                  end = strchr(start, ',');
+                  if (end)
+                    {
+                       char *tmp;
+                       tmp = strndup(start, end - start);
+                       FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) start);
+                       free(tmp);
+                    }
+                  else
+                    {
+                       FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) start);
+                       break;
+                    }
+               }
+          }
+
        FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
        FcDefaultSubstitute(p_nm);
 
index ec3122a..9ef444f 100644 (file)
@@ -350,7 +350,6 @@ struct _Evas_Object_Textblock_Format
    struct {
       Evas_Font_Description *fdesc;
       const char       *source;
-      const char       *fallbacks;
       Evas_Font_Set    *font;
       Evas_Font_Size    size;
    } font;
@@ -621,7 +620,6 @@ _format_unref_free(const Evas_Object *obj, Evas_Object_Textblock_Format *fmt)
    fmt->ref--;
    if (fmt->ref > 0) return;
    if (fmt->font.fdesc) evas_font_desc_unref(fmt->font.fdesc);
-   if (fmt->font.fallbacks) eina_stringshare_del(fmt->font.fallbacks);
    if (fmt->font.source) eina_stringshare_del(fmt->font.source);
    evas_font_free(obj->layer->evas, fmt->font.font);
    free(fmt);
@@ -1156,7 +1154,8 @@ _format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char
 
    /* If we are changing the font, create the fdesc. */
    if ((cmd == font_weightstr) || (cmd == font_widthstr) ||
-         (cmd == font_stylestr) || (cmd == fontstr))
+         (cmd == font_stylestr) ||
+         (cmd == fontstr) || (cmd == font_fallbacksstr))
      {
         if (!fmt->font.fdesc)
           {
@@ -1177,15 +1176,7 @@ _format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char
      }
    else if (cmd == font_fallbacksstr)
      {
-        if ((!fmt->font.fallbacks) ||
-              ((fmt->font.fallbacks) && (strcmp(fmt->font.fallbacks, tmp_param))))
-          {
-             /* policy - when we say "fallbacks" do we prepend and use prior
-              * fallbacks... or should we replace. for now we replace
-              */
-             if (fmt->font.fallbacks) eina_stringshare_del(fmt->font.fallbacks);
-             fmt->font.fallbacks = eina_stringshare_add(tmp_param);
-          }
+        eina_stringshare_replace(&(fmt->font.fdesc->fallbacks), tmp_param);
      }
    else if (cmd == font_sizestr)
      {
@@ -1693,20 +1684,17 @@ static Evas_Object_Textblock_Format *
 _format_dup(Evas_Object *obj, const Evas_Object_Textblock_Format *fmt)
 {
    Evas_Object_Textblock_Format *fmt2;
-   char *buf = NULL;
 
    fmt2 = calloc(1, sizeof(Evas_Object_Textblock_Format));
    memcpy(fmt2, fmt, sizeof(Evas_Object_Textblock_Format));
    fmt2->ref = 1;
    fmt2->font.fdesc = evas_font_desc_ref(fmt->font.fdesc);
 
-   if (fmt->font.fallbacks) fmt2->font.fallbacks = eina_stringshare_add(fmt->font.fallbacks);
    if (fmt->font.source) fmt2->font.source = eina_stringshare_add(fmt->font.source);
 
    /* FIXME: just ref the font here... */
    fmt2->font.font = evas_font_load(obj->layer->evas, fmt2->font.fdesc,
          fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur.scale));
-   if (buf) free(buf);
    return fmt2;
 }
 
index 77b41fd..507f4ed 100644 (file)
@@ -637,6 +637,7 @@ struct _Evas_Font_Description
    int ref;
    /* We assume everywhere this is stringshared */
    const char *name;
+   const char *fallbacks;
 
    Evas_Font_Slant slant;
    Evas_Font_Weight weight;