evas: Add scale feature for embedded bitmap fonts.
authorYoungbok Shin <youngb.shin@samsung.com>
Mon, 25 Sep 2017 09:34:22 +0000 (18:34 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 26 Sep 2017 02:31:31 +0000 (11:31 +0900)
Summary:
When evas selects a strike of embedded bitmap font,
calculate ratio and use it for scaling embedded bitmap.
@feature

Reviewers: jpeg, tasn, woohyun, raster, herdsman

Reviewed By: raster

Subscribers: charlesmilette, Francesco149, cedric

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

20 files changed:
src/lib/efl/interfaces/efl_text_font.eo
src/lib/evas/canvas/efl_canvas_text.eo
src/lib/evas/canvas/evas_font_dir.c
src/lib/evas/canvas/evas_object_text.c
src/lib/evas/canvas/evas_object_textblock.c
src/lib/evas/canvas/evas_object_textgrid.c
src/lib/evas/canvas/evas_text.eo
src/lib/evas/canvas/evas_textgrid.eo
src/lib/evas/common/evas_draw.h
src/lib/evas/common/evas_draw_main.c
src/lib/evas/common/evas_font.h
src/lib/evas/common/evas_font_compress.c
src/lib/evas/common/evas_font_draw.c
src/lib/evas/common/evas_font_load.c
src/lib/evas/common/evas_font_main.c
src/lib/evas/include/evas_common_private.h
src/lib/evas/include/evas_private.h
src/modules/evas/engines/gl_common/evas_gl_common.h
src/modules/evas/engines/gl_common/evas_gl_font.c
src/modules/evas/engines/software_generic/evas_engine.c

index b43c522..b68e142 100644 (file)
@@ -37,6 +37,18 @@ enum Efl.Text.Font.Slant {
     italic, [[Italic font slant]]
 }
 
+/* FIXME: It needs to support "normal" option for non-color bitmap font.
+   For supporting "normal" option, S/W glyph drawing engine should be updated.
+ */
+enum Efl.Text.Font.Bitmap_Scalable {
+   [[Scalable of bitmap fonts
+
+     @since 1.21
+   ]]
+   none = 0,         [[Disable scalable feature for bitmap fonts.]]
+   color = (1 << 0), [[Enable scalable feature for color bitmap fonts.]]
+}
+
 interface Efl.Text.Font {
    [[Font settings of the text
 
@@ -114,5 +126,17 @@ interface Efl.Text.Font {
             lang: string; [[Language]]
          }
       }
+
+      @property font_bitmap_scalable {
+           [[The bitmap fonts have fixed size glyphs for several available sizes.
+             Basically, it is not scalable. But, it needs to be scalable for some use cases.
+             (ex. colorful emoji fonts)
+
+             Default is $Efl.Text.Font.Bitmap_Scalable.none\.
+           ]]
+           values {
+              scalable: Efl.Text.Font.Bitmap_Scalable; [[Scalable]]
+           }
+      }
    }
 }
index d18c9bf..22b8e9d 100644 (file)
@@ -282,6 +282,7 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format, Efl.Text.Cursor, Efl.Text.Annota
       Efl.Text.Font.font_weight { get; set; }
       Efl.Text.Font.font_slant { get; set; }
       Efl.Text.Font.font_width { get; set; }
+      Efl.Text.Font.font_bitmap_scalable { get; set; }
       Efl.Text.Style.normal_color { get; set; }
       Efl.Text.Style.backing_type { get; set; }
       Efl.Text.Style.backing_color { get; set; }
index 80e37fa..6514b0f 100644 (file)
@@ -32,6 +32,7 @@ struct _Fndat
    Evas_Font_Set   *font;
    int              ref;
    Font_Rend_Flags  wanted_rend;
+   Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
 
 #ifdef HAVE_FONTCONFIG
    FcFontSet *set;
@@ -235,7 +236,7 @@ evas_font_free(Evas *eo_evas, void *font)
 #ifdef HAVE_FONTCONFIG
 static Evas_Font_Set *
 _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int size,
-      Font_Rend_Flags wanted_rend)
+      Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
    int i;
@@ -248,9 +249,9 @@ _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int si
        FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
 
        if (font)
-         evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend);
+         evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend, bitmap_scalable);
        else
-         font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend);
+         font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend, bitmap_scalable);
      }
 
    return font;
@@ -550,7 +551,7 @@ evas_font_name_parse(Evas_Font_Description *fdesc, const char *name)
 }
 
 void *
-evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size)
+evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
 #ifdef HAVE_FONTCONFIG
@@ -585,8 +586,9 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
             if (((!source) && (!fd->source)) ||
                 ((source) && (fd->source) && (!strcmp(source, fd->source))))
               {
-                 if ((size == fd->size) &&
-                        (wanted_rend == fd->wanted_rend))
+                  if ((size == fd->size) &&
+                      (wanted_rend == fd->wanted_rend) &&
+                      (bitmap_scalable == fd->bitmap_scalable))
                    {
                       fonts_cache = eina_list_promote_list(fonts_cache, l);
                       fd->ref++;
@@ -605,7 +607,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
 #ifdef HAVE_FONTCONFIG
    if (found_fd)
      {
-        font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend);
+        font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable);
         goto on_find;
      }
 #endif
@@ -638,7 +640,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
 #ifdef HAVE_FONTCONFIG
    if (found_fd)
      {
-        font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend);
+        font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable);
         goto on_find;
      }
 #endif
@@ -656,7 +658,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                  fake_name = evas_file_path_join(source, nm);
                  if (fake_name)
                    {
-                      font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend);
+                      font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend, bitmap_scalable);
                       if (!font) /* Load from fake name failed, probably not cached */
                         {
                            /* read original!!! */
@@ -669,7 +671,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                                 fdata = eet_read(ef, nm, &fsize);
                                 if (fdata)
                                   {
-                                     font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend);
+                                     font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable);
                                      free(fdata);
                                   }
                                 eet_close(ef);
@@ -681,7 +683,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
             if (!font) /* Source load failed */
               {
                  if (evas_file_path_is_full_path((char *)nm)) /* Try filename */
-                   font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend);
+                   font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend, bitmap_scalable);
                  else /* search font path */
                    {
                       Eina_List *ll;
@@ -694,7 +696,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                            f_file = evas_font_dir_cache_find(dir, (char *)nm);
                            if (f_file)
                              {
-                                font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend);
+                                font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable);
                                 if (font) break;
                              }
                          }
@@ -708,7 +710,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                                  f_file = evas_font_dir_cache_find(dir, (char *)nm);
                                  if (f_file)
                                    {
-                                      font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend);
+                                      font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable);
                                       if (font) break;
                                    }
                               }
@@ -729,7 +731,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                  if (fake_name)
                    {
                       /* FIXME: make an engine func */
-                      if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend))
+                      if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend, bitmap_scalable))
                         {
                            /* read original!!! */
                            ef = eet_open(source, EET_FILE_MODE_READ);
@@ -741,7 +743,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                                 fdata = eet_read(ef, nm, &fsize);
                                 if ((fdata) && (fsize > 0))
                                   {
-                                     ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend);
+                                     ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable);
                                   }
                                 eet_close(ef);
                                  free(fdata);
@@ -755,7 +757,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
             if (!ok)
               {
                  if (evas_file_path_is_full_path((char *)nm))
-                   evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend);
+                   evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend, bitmap_scalable);
                  else
                    {
                       Eina_List *ll;
@@ -769,7 +771,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                            f_file = evas_font_dir_cache_find(dir, (char *)nm);
                            if (f_file)
                              {
-                                fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend);
+                                fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable);
                                 if (fn)
                                   break;
                              }
@@ -784,7 +786,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                                  f_file = evas_font_dir_cache_find(dir, (char *)nm);
                                  if (f_file)
                                    {
-                                      fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend);
+                                      fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable);
                                       if (fn)
                                          break;
                                    }
@@ -854,7 +856,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
          }
        else
           {
-             font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend);
+             font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable);
           }
      }
    else /* Add a fallback list from fontconfig according to the found font. */
@@ -881,7 +883,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
                }
              else
                {
-                  font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend);
+                  font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable);
                }
           }
 #endif
@@ -899,6 +901,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
         fd->font = font;
         fd->wanted_rend = wanted_rend;
         fd->size = size;
+        fd->bitmap_scalable = bitmap_scalable;
         fd->ref = 1;
         fonts_cache = eina_list_prepend(fonts_cache, fd);
 #ifdef HAVE_FONTCONFIG
index 6704bd3..5108aad 100644 (file)
@@ -48,6 +48,7 @@ struct _Evas_Text_Data
 
       Evas_Font_Size       size;
       Evas_Text_Style_Type style;
+      Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
    } cur, prev;
 
    struct {
@@ -417,44 +418,14 @@ _evas_text_efl_text_properties_font_source_get(Eo *eo_obj EINA_UNUSED, Evas_Text
    return o->cur.source;
 }
 
-EOLIAN static void
-_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size)
+static void
+_evas_text_font_reload(Eo *eo_obj, Evas_Text_Data *o)
 {
    Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
    Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
    Eina_Bool source_invisible = EINA_FALSE;
-   Evas_Font_Description *fdesc;
    Eina_List *was = NULL;
 
-   if ((!font) || (size <= 0)) return;
-
-   evas_object_async_block(obj);
-   if ((size == o->cur.size) &&
-       (o->cur.font && !strcmp(font, o->cur.font))) return;
-
-   /* We can't assume the given font is same with current fdesc by comparing string.
-      Since Evas starts to supporting "auto" for language,
-      the given font string should be parsed once before comparing it. */
-   fdesc = evas_font_desc_new();
-
-   /* Set default language according to locale. */
-   eina_stringshare_replace(&(fdesc->lang), evas_font_lang_normalize("auto"));
-   evas_font_name_parse(fdesc, font);
-
-   if (o->cur.fdesc && !evas_font_desc_cmp(fdesc, o->cur.fdesc) &&
-       (size == o->cur.size))
-     {
-        evas_font_desc_unref(fdesc);
-        return;
-     }
-
-   if (o->cur.fdesc) evas_font_desc_unref(o->cur.fdesc);
-   o->cur.fdesc = fdesc;
-
-   o->cur.size = size;
-   eina_stringshare_replace(&o->cur.font, font);
-   o->prev.font = NULL;
-
    if (!(obj->layer->evas->is_frozen))
      {
         pass = evas_event_passes_through(eo_obj, obj);
@@ -473,7 +444,7 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha
      }
 
    o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source,
-         (int)(((double) o->cur.size) * obj->cur->scale));
+         (int)(((double) o->cur.size) * obj->cur->scale), o->cur.bitmap_scalable);
      {
         o->ascent = 0;
         o->descent = 0;
@@ -495,6 +466,44 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha
 }
 
 EOLIAN static void
+_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size)
+{
+   Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+   Evas_Font_Description *fdesc;
+
+   if ((!font) || (size <= 0)) return;
+
+   evas_object_async_block(obj);
+   if ((size == o->cur.size) &&
+       (o->cur.font && !strcmp(font, o->cur.font))) return;
+
+   /* We can't assume the given font is same with current fdesc by comparing string.
+      Since Evas starts to supporting "auto" for language,
+      the given font string should be parsed once before comparing it. */
+   fdesc = evas_font_desc_new();
+
+   /* Set default language according to locale. */
+   eina_stringshare_replace(&(fdesc->lang), evas_font_lang_normalize("auto"));
+   evas_font_name_parse(fdesc, font);
+
+   if (o->cur.fdesc && !evas_font_desc_cmp(fdesc, o->cur.fdesc) &&
+       (size == o->cur.size))
+     {
+        evas_font_desc_unref(fdesc);
+        return;
+     }
+
+   if (o->cur.fdesc) evas_font_desc_unref(o->cur.fdesc);
+   o->cur.fdesc = fdesc;
+
+   o->cur.size = size;
+   eina_stringshare_replace(&o->cur.font, font);
+   o->prev.font = NULL;
+
+   _evas_text_font_reload(eo_obj, o);
+}
+
+EOLIAN static void
 _evas_text_efl_text_properties_font_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, const char **font, Evas_Font_Size *size)
 {
    if (font) *font = o->cur.font;
@@ -1618,6 +1627,7 @@ evas_object_text_init(Evas_Object *eo_obj)
    Evas_Text_Data *o = obj->private_data;
    /* alloc obj private data */
    o->prev.ellipsis = o->cur.ellipsis = -1.0;
+   o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
    o->prev = o->cur;
 #ifdef BIDI_SUPPORT
    o->bidi_par_props = evas_bidi_paragraph_props_new();
@@ -2442,6 +2452,21 @@ _evas_text_efl_canvas_object_paragraph_direction_get(Eo *eo_obj EINA_UNUSED,
    return o->paragraph_direction;
 }
 
+EOLIAN static void
+_evas_text_efl_text_font_font_bitmap_scalable_set(Eo *eo_obj, Evas_Text_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
+{
+   if (o->cur.bitmap_scalable == bitmap_scalable) return;
+   o->prev.bitmap_scalable = o->cur.bitmap_scalable;
+   o->cur.bitmap_scalable = bitmap_scalable;
+   _evas_text_font_reload(eo_obj, o);
+}
+
+EOLIAN static Efl_Text_Font_Bitmap_Scalable
+_evas_text_efl_text_font_font_bitmap_scalable_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o)
+{
+   return o->cur.bitmap_scalable;
+}
+
 #define EVAS_TEXT_EXTRA_OPS \
    EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_text_efl_object_dbg_info_get)
 
index ac39ea6..c804522 100644 (file)
@@ -512,6 +512,7 @@ struct _Evas_Object_Textblock_Format
       const char       *source;  /**< Pointer to object from which to search for the font. */
       Evas_Font_Set    *font;  /**< Pointer to font set. */
       Evas_Font_Size    size;  /**< Size of the font. */
+      Efl_Text_Font_Bitmap_Scalable bitmap_scalable;  /**< Scalable for bitmap font. */
    } font;
    struct {
       struct {
@@ -629,6 +630,7 @@ struct _Evas_Object_Textblock
          Efl_Text_Style_Effect_Type      effect;
          Efl_Text_Style_Shadow_Direction shadow_direction;
          Efl_Text_Format_Wrap            wrap;
+         Efl_Text_Font_Bitmap_Scalable   bitmap_scalable;
       } info;
    } default_format;
    double                              valign;
@@ -2826,7 +2828,7 @@ _format_dup(Evas_Object *eo_obj, const Evas_Object_Textblock_Format *fmt)
 
    /* FIXME: just ref the font here... */
    fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc,
-         fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale));
+         fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale), fmt2->font.bitmap_scalable);
 
    if (fmt->gfx_filter)
      {
@@ -3365,6 +3367,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt,
         c->format_stack  = eina_list_prepend(c->format_stack, fmt);
         *fmt = c->o->default_format.format;
         fmt->ref = 1;
+        fmt->font.bitmap_scalable = _FMT_INFO(bitmap_scalable);
 
         // Apply font if specified
         if (_FMT_INFO(font))
@@ -3389,7 +3392,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt,
              fmt->font.fdesc->width = _FMT_INFO(font_width);
              fmt->font.fdesc->lang = _FMT_INFO(font_lang);
              fmt->font.font = evas_font_load(evas_obj->layer->evas->evas, fmt->font.fdesc,
-                   fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale));
+                   fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale), fmt->font.bitmap_scalable);
           }
         if (_FMT_INFO(gfx_filter_name))
           {
@@ -4490,7 +4493,7 @@ _format_finalize(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt)
    of = fmt->font.font;
 
    fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc,
-         fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale));
+         fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale), fmt->font.bitmap_scalable);
    if (of) evas_font_free(obj->layer->evas->evas, of);
 }
 
@@ -6760,6 +6763,7 @@ _efl_canvas_text_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Text_Data *class_
    _FMT(linerelgap) = 0.0;
    _FMT(password) = 1;
    _FMT(ellipsis) = -1;
+   _FMT_INFO(bitmap_scalable) = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
 
    return eo_obj;
 }
@@ -15159,6 +15163,20 @@ _efl_canvas_text_efl_text_font_font_width_get(Eo *obj EINA_UNUSED, Efl_Canvas_Te
    return _FMT_INFO(font_width);
 }
 
+EOLIAN static void
+_efl_canvas_text_efl_text_font_font_bitmap_scalable_set(Eo *obj, Efl_Canvas_Text_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
+{
+   if (_FMT_INFO(bitmap_scalable) == bitmap_scalable) return;
+   _FMT_INFO(bitmap_scalable) = bitmap_scalable;
+   _canvas_text_format_changed(obj, o);
+}
+
+EOLIAN static Efl_Text_Font_Bitmap_Scalable
+_efl_canvas_text_efl_text_font_font_bitmap_scalable_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o)
+{
+   return _FMT_INFO(bitmap_scalable);
+}
+
 /* Efl.Text.Style interface implementation */
 
 /* Helper: sets color fields of style 'x' and informs if any are changed. */
index 1a24086..7f6dc76 100644 (file)
@@ -36,6 +36,7 @@ struct _Evas_Textgrid_Data
 
       Eina_Array                  palette_standard;
       Eina_Array                  palette_extended;
+      Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
    } cur, prev;
 
    int                            ascent;
@@ -156,6 +157,7 @@ evas_object_textgrid_init(Evas_Object *eo_obj)
 
    Evas_Textgrid_Data *o = obj->private_data;
    o->magic = MAGIC_OBJ_TEXTGRID;
+   o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
    o->prev = o->cur;
    eina_array_step_set(&o->cur.palette_standard, sizeof (Eina_Array), 16);
    eina_array_step_set(&o->cur.palette_extended, sizeof (Eina_Array), 16);
@@ -1005,7 +1007,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj,
                          fdesc,
                          o->cur.font_source,
                          (int)(((double) o->cur.font_size) *
-                               obj->cur->scale));
+                               obj->cur->scale),
+                         o->cur.bitmap_scalable);
    if (font)
      {
         Eina_Unicode W[2] = { 'O', 0 };
@@ -1054,11 +1057,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj,
    return ret;
 }
 
-EOLIAN static void
-_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
-                                            Evas_Textgrid_Data *o,
-                                            const char *font_name,
-                                            Evas_Font_Size font_size)
+static void
+_evas_textgrid_font_reload(Eo *eo_obj, Evas_Textgrid_Data *o)
 {
    Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
    Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
@@ -1066,30 +1066,7 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
    Evas_Font_Description *fdesc;
    Eina_List *was = NULL;
 
-   if ((!font_name) || (!*font_name) || (font_size <= 0))
-     return;
-
-   evas_object_async_block(obj);
-   fdesc = evas_font_desc_new();
-   /* Set default language according to locale. */
-   eina_stringshare_replace(&(fdesc->lang),
-                            evas_font_lang_normalize("auto"));
-   evas_font_name_parse(fdesc, font_name);
-   if (o->cur.font_description_normal &&
-       !evas_font_desc_cmp(fdesc, o->cur.font_description_normal) &&
-       (font_size == o->cur.font_size))
-     {
-        evas_font_desc_unref(fdesc);
-        return;
-     }
-
-   if (o->cur.font_description_normal)
-     evas_font_desc_unref(o->cur.font_description_normal);
-   o->cur.font_description_normal = fdesc;
-
-   o->cur.font_size = font_size;
-   eina_stringshare_replace(&o->cur.font_name, font_name);
-   o->prev.font_name = NULL;
+   fdesc = o->cur.font_description_normal;
 
    if (!(obj->layer->evas->is_frozen))
      {
@@ -1111,7 +1088,8 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
                             o->cur.font_description_normal,
                             o->cur.font_source,
                             (int)(((double) o->cur.font_size) *
-                                  obj->cur->scale));
+                                  obj->cur->scale),
+                            o->cur.bitmap_scalable);
    if (o->font_normal)
      {
         Eina_Unicode W[2] = { 'O', 0 };
@@ -1245,6 +1223,43 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
 }
 
 EOLIAN static void
+_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
+                                            Evas_Textgrid_Data *o,
+                                            const char *font_name,
+                                            Evas_Font_Size font_size)
+{
+   Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+   Evas_Font_Description *fdesc;
+
+   if ((!font_name) || (!*font_name) || (font_size <= 0))
+     return;
+
+   evas_object_async_block(obj);
+   fdesc = evas_font_desc_new();
+   /* Set default language according to locale. */
+   eina_stringshare_replace(&(fdesc->lang),
+                            evas_font_lang_normalize("auto"));
+   evas_font_name_parse(fdesc, font_name);
+   if (o->cur.font_description_normal &&
+       !evas_font_desc_cmp(fdesc, o->cur.font_description_normal) &&
+       (font_size == o->cur.font_size))
+     {
+        evas_font_desc_unref(fdesc);
+        return;
+     }
+
+   if (o->cur.font_description_normal)
+     evas_font_desc_unref(o->cur.font_description_normal);
+   o->cur.font_description_normal = fdesc;
+
+   o->cur.font_size = font_size;
+   eina_stringshare_replace(&o->cur.font_name, font_name);
+   o->prev.font_name = NULL;
+
+   _evas_textgrid_font_reload(eo_obj, o);
+}
+
+EOLIAN static void
 _evas_textgrid_efl_text_properties_font_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, const char **font_name, Evas_Font_Size *font_size)
 {
    if (font_name) *font_name = o->cur.font_name;
@@ -1500,6 +1515,21 @@ evas_object_textgrid_font_get(const Eo *obj, const char **font_name, Evas_Font_S
    efl_text_properties_font_get((Eo *) obj, font_name, font_size);
 }
 
+EOLIAN static void
+_evas_textgrid_efl_text_font_font_bitmap_scalable_set(Eo *eo_obj, Evas_Textgrid_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
+{
+   if (o->cur.bitmap_scalable == bitmap_scalable) return;
+   o->prev.bitmap_scalable = o->cur.bitmap_scalable;
+   o->cur.bitmap_scalable = bitmap_scalable;
+   _evas_textgrid_font_reload(eo_obj, o);
+}
+
+EOLIAN static Efl_Text_Font_Bitmap_Scalable
+_evas_textgrid_efl_text_font_font_bitmap_scalable_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o)
+{
+   return o->cur.bitmap_scalable;
+}
+
 #define EVAS_TEXTGRID_EXTRA_OPS \
    EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_textgrid_efl_object_dbg_info_get)
 
index 017d5b3..68623a6 100644 (file)
@@ -1,6 +1,6 @@
 type @extern Evas.Text_Style_Type : __undefined_type; [[External text style type]]
 
-class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Filter.Internal)
+class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Text.Font, Efl.Canvas.Filter.Internal)
 {
    [[Evas text class]]
    legacy_prefix: evas_object_text;
@@ -274,6 +274,7 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Fi
       Efl.Text.text { get; set; }
       Efl.Text.Properties.font { get; set; }
       Efl.Text.Properties.font_source { get; set; }
+      Efl.Text.Font.font_bitmap_scalable { get; set; }
       Efl.Gfx.Filter.filter_program { set; }
       Efl.Canvas.Filter.Internal.filter_dirty;
       Efl.Canvas.Filter.Internal.filter_input_alpha;
index 2dd3966..3690688 100644 (file)
@@ -20,7 +20,7 @@ enum Evas.Textgrid.Font_Style {
 /* XXX: Actual definition is in C. */
 struct Evas.Textgrid.Cell; [[Evas textgrid cell data structure]]
 
-class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties)
+class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties, Efl.Text.Font)
 {
    [[Evas textgrid class]]
    legacy_prefix: evas_object_textgrid;
@@ -200,5 +200,6 @@ class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties)
       Efl.Object.destructor;
       Efl.Text.Properties.font { get; set; }
       Efl.Text.Properties.font_source { get; set; }
+      Efl.Text.Font.font_bitmap_scalable { get; set; }
    }
 }
index 28b7c94..e045a18 100644 (file)
@@ -11,7 +11,7 @@ EAPI void               evas_common_draw_context_font_ext_set            (RGBA_D
                                                                           void *data,
                                                                           void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg),
                                                                           void  (*gl_free) (void *ext_dat),
-                                                                          void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y),
+                                                                          void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h),
                                                                           void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
                                                                           void  (*gl_image_free) (void *image),
                                                                           void  (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth));
index d6b0a89..2f3fa94 100644 (file)
@@ -215,7 +215,7 @@ evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc,
                                       void *data,
                                       void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg),
                                       void  (*gl_free) (void *ext_dat),
-                                      void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y),
+                                      void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h),
                                       void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
                                       void  (*gl_image_free) (void *image),
                                       void  (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth))
index f9f8026..b50b68d 100644 (file)
@@ -46,27 +46,27 @@ EAPI int               evas_common_font_source_load_complete (RGBA_Font_Source *
 EAPI RGBA_Font_Source *evas_common_font_source_find          (const char *name);
 EAPI void              evas_common_font_source_free          (RGBA_Font_Source *fs);
 EAPI void              evas_common_font_size_use             (RGBA_Font *fn);
-EAPI RGBA_Font_Int    *evas_common_font_int_load             (const char *name, int size, Font_Rend_Flags wanted_rend);
+EAPI RGBA_Font_Int    *evas_common_font_int_load             (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
 EAPI RGBA_Font_Int    *evas_common_font_int_load_init        (RGBA_Font_Int *fn);
 EAPI RGBA_Font_Int    *evas_common_font_int_load_complete    (RGBA_Font_Int *fi);
-EAPI RGBA_Font        *evas_common_font_memory_load          (const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_load                 (const char *name, int size, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_add                  (RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_memory_add           (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend);
+EAPI RGBA_Font        *evas_common_font_memory_load          (const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_load                 (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_add                  (RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_memory_add           (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
 EAPI void              evas_common_font_free                 (RGBA_Font *fn);
 EAPI void              evas_common_font_int_unref            (RGBA_Font_Int *fi);
 EAPI void              evas_common_font_hinting_set          (RGBA_Font *fn, Font_Hint_Flags hinting);
 EAPI Eina_Bool         evas_common_hinting_available         (Font_Hint_Flags hinting);
-EAPI RGBA_Font        *evas_common_font_memory_hinting_load  (const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_hinting_load         (const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_hinting_add          (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend);
-EAPI RGBA_Font        *evas_common_font_memory_hinting_add   (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend);
+EAPI RGBA_Font        *evas_common_font_memory_hinting_load  (const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_hinting_load         (const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_hinting_add          (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+EAPI RGBA_Font        *evas_common_font_memory_hinting_add   (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
 EAPI void              evas_common_font_int_modify_cache_by  (RGBA_Font_Int *fi, int dir);
 EAPI int               evas_common_font_cache_get            (void);
 EAPI void              evas_common_font_cache_set            (int size);
 EAPI void              evas_common_font_flush                (void);
 EAPI void              evas_common_font_flush_last           (void);
-EAPI RGBA_Font_Int    *evas_common_font_int_find             (const char *name, int size, Font_Rend_Flags wanted_rend);
+EAPI RGBA_Font_Int    *evas_common_font_int_find             (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
 EAPI void              evas_common_font_all_clear            (void);
 EAPI void              evas_common_font_ext_clear            (void);
 
@@ -85,7 +85,7 @@ EAPI int               evas_common_font_query_run_font_end_get(RGBA_Font *fn, RG
 EAPI void              evas_common_font_ascent_descent_get(RGBA_Font *fn, const Evas_Text_Props *text_props, int *ascent, int *descent);
 
 EAPI void             *evas_common_font_glyph_compress(void *data, int num_grays, int pixel_mode, int pitch_data, int w, int h, int *size_ret);
-EAPI void              evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, RGBA_Draw_Context *dc, RGBA_Image *dst, int dst_pitch, int x, int y, int cx, int cy, int cw, int ch);
+EAPI void              evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, RGBA_Draw_Context *dc, RGBA_Image *dst, int dst_pitch, int dx, int dy, int dw, int dh, int cx, int cy, int cw, int ch);
 EAPI DATA8            *evas_common_font_glyph_uncompress(RGBA_Font_Glyph *fg, int *wret, int *hret);
 
 void evas_common_font_load_init(void);
index 3a0e90c..5e7658c 100644 (file)
@@ -482,14 +482,19 @@ EAPI void
 evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, 
                             RGBA_Draw_Context *dc,
                             RGBA_Image *dst_image, int dst_pitch,
-                            int x, int y, int cx, int cy, int cw, int ch)
+                            int dx, int dy, int dw, int dh, int cx, int cy, int cw, int ch)
 {
    RGBA_Font_Glyph_Out *fgo = fg->glyph_out;
-   int w, h, x1, x2, y1, y2, i, *iptr;
+   int x, y, w, h, x1, x2, y1, y2, i, *iptr;
    DATA32 *dst = dst_image->image.data;
    DATA32 coltab[16], col;
    DATA16 mtab[16], v;
 
+   // FIXME: Use dw, dh for scaling glyphs...
+   (void) dw;
+   (void) dh;
+   x = dx;
+   y = dy;
    w = fgo->bitmap.width; h = fgo->bitmap.rows;
    // skip if totally clipped out
    if ((y >= (cy + ch)) || ((y + h) <= cy) ||
@@ -582,7 +587,7 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
 
              ptr = dst + (x + x1) + ((y + row) * dst_pitch);
              buf_ptr = buf + (row * w) + x1;
-             func(buf_ptr, mask, 0, ptr, x2 - x1);
+             func(buf_ptr, mask, 0, ptr, w);
           }
      }
    else
index f7fcb13..4bdecdd 100644 (file)
@@ -24,16 +24,25 @@ evas_common_font_draw_init(void)
 }
 
 static void *
-_evas_font_image_new_from_data(int w, int h, DATA32 *image_data, int alpha, Evas_Colorspace cspace)
+_evas_font_image_new(RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace)
 {
+   DATA32 *image_data;
+   int src_w, src_h;
+
+   if (!fg) return NULL;
+
+   image_data = (DATA32 *)fg->glyph_out->bitmap.buffer;
+   src_w = fg->glyph_out->bitmap.width;
+   src_h = fg->glyph_out->bitmap.rows;
+
 #ifdef EVAS_CSERVE2
    if (evas_cserve2_use_get())
      {
         Evas_Cache2 *cache = evas_common_image_cache2_get();
-        return evas_cache2_image_data(cache, w, h, image_data, alpha, cspace);
+        return evas_cache2_image_data(cache, src_w, src_h, image_data, alpha, cspace);
      }
 #endif
-   return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
+   return evas_cache_image_data(evas_common_image_cache_get(), src_w, src_h, image_data, alpha, cspace);
 }
 
 static void
@@ -50,12 +59,15 @@ _evas_font_image_free(void *image)
 }
 
 static void
-_evas_font_image_draw(void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
+_evas_font_image_draw(void *context, void *surface, void *image, RGBA_Font_Glyph *fg, int x, int y, int w, int h, int smooth)
 {
    RGBA_Image *im;
+   int src_w, src_h;
 
-   if (!image) return;
+   if (!image || !fg) return;
    im = image;
+   src_w = fg->glyph_out->bitmap.width;
+   src_h = fg->glyph_out->bitmap.rows;
 
 #ifdef BUILD_PIPE_RENDER
    if ((eina_cpu_count() > 1))
@@ -66,24 +78,24 @@ _evas_font_image_draw(void *context, void *surface, void *image, int src_x, int
 #endif
         evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
                                                   surface, context, smooth,
-                                                  src_x, src_y, src_w, src_h,
-                                                  dst_x, dst_y, dst_w, dst_h);
+                                                  0, 0, src_w, src_h,
+                                                  x, y, w, h);
 
         evas_common_pipe_image_draw(im, surface, context, smooth,
-                                    src_x, src_y, src_w, src_h,
-                                    dst_x, dst_y, dst_w, dst_h);
+                                    0, 0, src_w, src_h,
+                                    x, y, w, h);
      }
    else
 #endif
      {
         evas_common_rgba_image_scalecache_prepare
           (&im->cache_entry, surface, context, smooth,
-           src_x, src_y, src_w, src_h,
-           dst_x, dst_y, dst_w, dst_h);
+           0, 0, src_w, src_h,
+           x, y, w, h);
         evas_common_rgba_image_scalecache_do
           (&im->cache_entry, surface, context, smooth,
-           src_x, src_y, src_w, src_h,
-           dst_x, dst_y, dst_w, dst_h);
+           0, 0, src_w, src_h,
+           x, y, w, h);
 
         evas_common_cpu_end_opt();
      }
@@ -111,9 +123,20 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
         int chr_x, chr_y, w, h;
 
         fg = glyph->fg;
+
         w = fg->glyph_out->bitmap.width;
         h = fg->glyph_out->bitmap.rows;
 
+        if (FT_HAS_FIXED_SIZES(fg->fi->src->ft.face))
+          {
+             if ((fg->fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) &&
+                 FT_HAS_COLOR(fg->fi->src->ft.face))
+               {
+                  w *= fg->fi->scale_factor;
+                  h *= fg->fi->scale_factor;
+               }
+          }
+
         if ((!fg->ext_dat) && (dc->font_ext.func.gl_new))
           {
              /* extension calls */
@@ -132,9 +155,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
                }
              else
                {
-                  fg->ext_dat = _evas_font_image_new_from_data
-                    (w, h, (DATA32 *)fg->glyph_out->bitmap.buffer,
-                     EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
+                  fg->ext_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
                   fg->ext_dat_free = _evas_font_image_free;
                }
           }
@@ -150,10 +171,11 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
                        if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
                          dc->font_ext.func.gl_draw(dc->font_ext.data, dst,
                                                    dc, fg,
-                                                   chr_x, y - (chr_y - y));
+                                                   chr_x, y - (chr_y - y), w, h);
                        else
+                         // TODO: scale with evas_font_compress_draw.c...
                          evas_common_font_glyph_draw(fg, dc, dst, im_w,
-                                                     chr_x, y - (chr_y - y),
+                                                     chr_x, y - (chr_y - y), w, h,
                                                      ext_x, ext_y,
                                                      ext_w, ext_h);
                     }
@@ -165,7 +187,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
                             chr_x, y - (chr_y - y), w, h, EINA_TRUE);
                        else
                          _evas_font_image_draw
-                           (dc, dst, fg->ext_dat, 0, 0, w, h,
+                           (dc, dst, fg->ext_dat, fg,
                             chr_x, y - (chr_y - y), w, h, EINA_TRUE);
                     }
                }
index 2afd124..6bf1e34 100644 (file)
@@ -42,9 +42,16 @@ _evas_font_cache_int_cmp(const RGBA_Font_Int *k1, int k1_length EINA_UNUSED,
    if (k1->src->name == k2->src->name)
      {
         if (k1->size == k2->size)
-           return k1->wanted_rend - k2->wanted_rend;
+          {
+             if (k1->wanted_rend == k2->wanted_rend)
+               return k1->bitmap_scalable - k2->bitmap_scalable;
+             else
+               return k1->wanted_rend - k2->wanted_rend;
+          }
         else
-           return k1->size - k2->size;
+          {
+             return k1->size - k2->size;
+          }
      }
    return strcmp(k1->src->name, k2->src->name);
 }
@@ -57,6 +64,7 @@ _evas_font_cache_int_hash(const RGBA_Font_Int *key, int key_length EINA_UNUSED)
    hash = eina_hash_djb2(key->src->name, eina_stringshare_strlen(key->src->name) + 1);
    hash ^= eina_hash_int32(&key->size, sizeof (int));
    hash ^= eina_hash_int32(&wanted_rend, sizeof (int));
+   hash ^= eina_hash_int32(&key->bitmap_scalable, sizeof (int));
    return hash;
 }
 
@@ -322,13 +330,13 @@ _evas_common_font_int_cache_init(RGBA_Font_Int *fi)
 }
 
 EAPI RGBA_Font_Int *
-evas_common_font_int_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend)
+evas_common_font_int_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font_Int *fi;
    char *fake_name;
 
    fake_name = evas_file_path_join(source, name);
-   fi = evas_common_font_int_find(fake_name, size, wanted_rend);
+   fi = evas_common_font_int_find(fake_name, size, wanted_rend, bitmap_scalable);
    if (fi)
      {
         free(fake_name);
@@ -350,6 +358,7 @@ evas_common_font_int_memory_load(const char *source, const char *name, int size,
        return NULL;
      }
    fi->size = size;
+   fi->bitmap_scalable = bitmap_scalable;
    _evas_common_font_int_cache_init(fi);
    fi = evas_common_font_int_load_init(fi);
    evas_common_font_int_load_complete(fi);
@@ -374,11 +383,12 @@ evas_common_font_int_memory_load(const char *source, const char *name, int size,
 
 EAPI RGBA_Font_Int *
 evas_common_font_int_load(const char *name, int size,
-                          Font_Rend_Flags wanted_rend)
+                          Font_Rend_Flags wanted_rend,
+                                                 Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font_Int *fi;
 
-   fi = evas_common_font_int_find(name, size, wanted_rend);
+   fi = evas_common_font_int_find(name, size, wanted_rend, bitmap_scalable);
    if (fi) return fi;
    fi = calloc(1, sizeof(RGBA_Font_Int));
    if (!fi) return NULL;
@@ -393,6 +403,7 @@ evas_common_font_int_load(const char *name, int size,
      }
    fi->size = size;
    fi->wanted_rend = wanted_rend;
+   fi->bitmap_scalable = bitmap_scalable;
    _evas_common_font_int_cache_init(fi);
    fi = evas_common_font_int_load_init(fi);
 #ifdef EVAS_CSERVE2
@@ -437,6 +448,7 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
        FT_Activate_Size(fi->ft.size);
      }
    fi->real_size = fi->size * 64;
+   fi->scale_factor = 1.0;
    error = FT_Set_Char_Size(fi->src->ft.face, 0, fi->real_size, font_dpi, font_dpi);
    if (error)
      error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size);
@@ -468,9 +480,20 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
         FTLOCK();
 
         if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
-          error = FT_Select_Size(fi->src->ft.face, strike_index);
+          {
+             error = FT_Select_Size(fi->src->ft.face, strike_index);
+
+             if (!error)
+               {
+                  if (FT_HAS_COLOR(fi->src->ft.face) &&
+                      fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+                    fi->scale_factor = (float)fi->size * 64.0 / (float)fi->real_size;
+               }
+          }
         else
-          error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size);
+          {
+             error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size);
+          }
 
         FTUNLOCK();
        if (error)
@@ -543,13 +566,13 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
 }
 
 EAPI RGBA_Font *
-evas_common_font_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend)
+evas_common_font_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font *fn;
    RGBA_Font_Int *fi;
 
    fi = evas_common_font_int_memory_load(source, name, size, data, data_size,
-                                         wanted_rend);
+                                         wanted_rend, bitmap_scalable);
    if (!fi) return NULL;
    fn = calloc(1, sizeof(RGBA_Font));
    if (!fn)
@@ -577,12 +600,12 @@ evas_common_font_memory_load(const char *source, const char *name, int size, con
 //   fi->fs
 
 EAPI RGBA_Font *
-evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend)
+evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font *fn;
    RGBA_Font_Int *fi;
 
-   fi = evas_common_font_int_load(name, size, wanted_rend);
+   fi = evas_common_font_int_load(name, size, wanted_rend, bitmap_scalable);
    if (!fi) return NULL;
    /* First font, complete load */
    if (!fi->ft.size)
@@ -619,12 +642,12 @@ evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend)
 }
 
 EAPI RGBA_Font *
-evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend)
+evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font_Int *fi;
 
    if (!fn) return NULL;
-   fi = evas_common_font_int_load(name, size, wanted_rend);
+   fi = evas_common_font_int_load(name, size, wanted_rend, bitmap_scalable);
    if (fi)
      {
        fn->fonts = eina_list_append(fn->fonts, fi);
@@ -641,13 +664,13 @@ evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags
 }
 
 EAPI RGBA_Font *
-evas_common_font_memory_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend)
+evas_common_font_memory_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font_Int *fi;
 
    if (!fn)
       return NULL;
-   fi = evas_common_font_int_memory_load(source, name, size, data, data_size, wanted_rend);
+   fi = evas_common_font_int_memory_load(source, name, size, data, data_size, wanted_rend, bitmap_scalable);
    if (fi)
      {
        fn->fonts = eina_list_append(fn->fonts, fi);
@@ -744,38 +767,38 @@ evas_common_hinting_available(Font_Hint_Flags hinting)
 }
 
 EAPI RGBA_Font *
-evas_common_font_memory_hinting_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend)
+evas_common_font_memory_hinting_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font *fn;
 
-   fn = evas_common_font_memory_load(source, name, size, data, data_size, wanted_rend);
+   fn = evas_common_font_memory_load(source, name, size, data, data_size, wanted_rend, bitmap_scalable);
    if (fn) evas_common_font_hinting_set(fn, hinting);
    return fn;
 }
 
 EAPI RGBA_Font *
-evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend)
+evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font *fn;
 
-   fn = evas_common_font_load(name, size, wanted_rend);
+   fn = evas_common_font_load(name, size, wanted_rend, bitmap_scalable);
    if (fn) evas_common_font_hinting_set(fn, hinting);
    return fn;
 }
 
 EAPI RGBA_Font *
-evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend)
+evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
-   fn = evas_common_font_add(fn, name, size, wanted_rend);
+   fn = evas_common_font_add(fn, name, size, wanted_rend, bitmap_scalable);
    if (fn) evas_common_font_hinting_set(fn, hinting);
    return fn;
 }
 
 EAPI RGBA_Font *
-evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend)
+evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    fn = evas_common_font_memory_add(fn, source, name, size, data, data_size,
-                                    wanted_rend);
+                                    wanted_rend, bitmap_scalable);
    if (fn) evas_common_font_hinting_set(fn, hinting);
    return fn;
 }
@@ -939,7 +962,8 @@ evas_common_font_flush_last(void)
 
 EAPI RGBA_Font_Int *
 evas_common_font_int_find(const char *name, int size,
-                          Font_Rend_Flags wanted_rend)
+                          Font_Rend_Flags wanted_rend,
+                                                 Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    RGBA_Font_Int tmp_fi;
    RGBA_Font_Source tmp_fn;
@@ -949,6 +973,7 @@ evas_common_font_int_find(const char *name, int size,
    tmp_fi.src = &tmp_fn;
    tmp_fi.size = size;
    tmp_fi.wanted_rend = wanted_rend;
+   tmp_fi.bitmap_scalable = bitmap_scalable;
    fi = eina_hash_find(fonts, &tmp_fi);
    if (fi)
      {
index 91db4d5..0b25e31 100644 (file)
@@ -115,6 +115,14 @@ evas_common_font_instance_ascent_get(RGBA_Font_Int *fi)
         WRN("NOT SCALABLE!");
      }
    val = (int)fi->src->ft.face->size->metrics.ascender;
+
+   if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+     {
+        if (FT_HAS_COLOR(fi->src->ft.face) &&
+            fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+          val *= fi->scale_factor;
+     }
+
    return FONT_METRIC_ROUNDUP(val);
 //   printf("%i | %i\n", val, val >> 6);
 //   if (fi->src->ft.face->units_per_EM == 0)
@@ -137,6 +145,14 @@ evas_common_font_instance_descent_get(RGBA_Font_Int *fi)
         fi->src->current_size = fi->size;
      }
    val = -(int)fi->src->ft.face->size->metrics.descender;
+
+   if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+     {
+        if (FT_HAS_COLOR(fi->src->ft.face) &&
+            fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+          val *= fi->scale_factor;
+     }
+
    return FONT_METRIC_ROUNDUP(val);
 //   if (fi->src->ft.face->units_per_EM == 0)
 //     return val;
@@ -165,6 +181,14 @@ evas_common_font_instance_max_ascent_get(RGBA_Font_Int *fi)
      val = FONT_METRIC_ROUNDUP((int)fi->src->ft.face->size->metrics.ascender);
    else
      val = (int)fi->src->ft.face->bbox.yMax;
+
+   if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+     {
+        if (FT_HAS_COLOR(fi->src->ft.face) &&
+            fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+          val *= fi->scale_factor;
+     }
+
    if (fi->src->ft.face->units_per_EM == 0)
      return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
@@ -192,6 +216,14 @@ evas_common_font_instance_max_descent_get(RGBA_Font_Int *fi)
      val = FONT_METRIC_ROUNDUP(-(int)fi->src->ft.face->size->metrics.descender);
    else
      val = -(int)fi->src->ft.face->bbox.yMin;
+
+   if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+     {
+        if (FT_HAS_COLOR(fi->src->ft.face) &&
+            fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+          val *= fi->scale_factor;
+     }
+
    if (fi->src->ft.face->units_per_EM == 0)
      return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
@@ -244,6 +276,14 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
         fi->src->current_size = fi->size;
      }
    val = (int)fi->src->ft.face->size->metrics.height;
+
+   if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+     {
+        if ((fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) &&
+            FT_HAS_COLOR(fi->src->ft.face))
+          val *= fi->scale_factor;
+     }
+
    if ((fi->src->ft.face->bbox.yMax == 0) &&
        (fi->src->ft.face->bbox.yMin == 0) &&
        (fi->src->ft.face->units_per_EM == 0))
@@ -558,6 +598,19 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx)
         fg->width = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMax - outbox.xMin);
         fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin);
         fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax);
+
+        if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
+          {
+             if (FT_HAS_COLOR(fi->src->ft.face) &&
+                 fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
+               {
+                  fg->glyph->advance.x *= fi->scale_factor;
+                  fg->glyph->advance.y *= fi->scale_factor;
+                  fg->width *= fi->scale_factor;
+                  fg->x_bear *= fi->scale_factor;
+                  fg->y_bear *= fi->scale_factor;
+               }
+          }
      }
 
    fg->index = idx;
index a4b3ae3..12cda89 100644 (file)
@@ -749,7 +749,7 @@ struct _RGBA_Draw_Context
       struct {
          void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg);
          void  (*gl_free) (void *ext_dat);
-         void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y);
+         void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h);
          void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace);
          void  (*gl_image_free) (void *image);
          void  (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth);
@@ -1010,6 +1010,7 @@ struct _RGBA_Font_Int
    Eina_Hash        *kerning;
    Fash_Glyph       *fash;
    unsigned int      size;
+   float             scale_factor;
    int               real_size;
    int               max_h;
    int               references;
@@ -1033,6 +1034,8 @@ struct _RGBA_Font_Int
 
    int              generation;
 
+   Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
+
    unsigned char    sizeok : 1;
    unsigned char    inuse : 1;
 };
index 1241999..02c93c5 100644 (file)
@@ -1501,10 +1501,10 @@ struct _Evas_Func
    void *(*image_plane_assign)             (void *data, void *image, int x, int y);
    void (*image_plane_release)             (void *data, void *image, void *plane);
 
-   Evas_Font_Set *(*font_load)             (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend);
-   Evas_Font_Set *(*font_memory_load)      (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend);
-   Evas_Font_Set *(*font_add)              (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend);
-   Evas_Font_Set *(*font_memory_add)       (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend);
+   Evas_Font_Set *(*font_load)             (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+   Evas_Font_Set *(*font_memory_load)      (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+   Evas_Font_Set *(*font_add)              (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
+   Evas_Font_Set *(*font_memory_add)       (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
    void (*font_free)                       (void *engine, Evas_Font_Set *font);
    int  (*font_ascent_get)                 (void *engine, Evas_Font_Set *font);
    int  (*font_descent_get)                (void *engine, Evas_Font_Set *font);
@@ -1774,7 +1774,7 @@ void evas_font_desc_unref(Evas_Font_Description *fdesc);
 int evas_font_desc_cmp(const Evas_Font_Description *a, const Evas_Font_Description *b);
 Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc);
 const char *evas_font_lang_normalize(const char *lang);
-void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size);
+void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
 void evas_font_load_hinting_set(Evas *evas, void *font, int hinting);
 void evas_object_smart_member_cache_invalidate(Evas_Object *obj, Eina_Bool pass_events, Eina_Bool freeze_events, Eina_Bool sourve_invisible);
 void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b);
index 6124cf8..8e21295 100644 (file)
@@ -748,7 +748,7 @@ Evas_GL_Image    *evas_gl_common_image_virtual_scaled_get(Evas_GL_Image *scaled,
 
 void             *evas_gl_font_texture_new(void *gc, RGBA_Font_Glyph *fg);
 void              evas_gl_font_texture_free(void *);
-void              evas_gl_font_texture_draw(void *gc, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y);
+void              evas_gl_font_texture_draw(void *gc, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y, int w, int h);
 void             *evas_gl_font_image_new(void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace);
 void              evas_gl_font_image_free(void *im);
 void              evas_gl_font_image_draw(void *gc, void *im, int dx, int dy, int dw, int dh, int smooth);
index 1b3e35b..2e2c526 100644 (file)
@@ -57,7 +57,7 @@ evas_gl_font_texture_free(void *tex)
 }
 
 void
-evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y)
+evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y, int w, int h)
 {
    Evas_Engine_GL_Context *gc = context;
    RGBA_Draw_Context *dc = draw_context;
@@ -108,25 +108,25 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
           {
              int nx, ny, nw, nh;
 
-             nx = x; ny = y; nw = tex->w; nh = tex->h;
+             nx = x; ny = y; nw = w; nh = h;
              RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
                                 gc->dc->clip.x, gc->dc->clip.y,
                                 gc->dc->clip.w, gc->dc->clip.h);
              if ((nw < 1) || (nh < 1)) return;
-             if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
+             if ((nx == x) && (ny == y) && (nw == w) && (nh == h))
                {
                   evas_gl_common_context_font_push(gc, tex,
                                                    0.0, 0.0, 0.0, 0.0,
 //                                                   sx, sy, sw, sh,
-                                                   x, y, tex->w, tex->h,
+                                                   x, y, w, h,
                                                    mtex, mx, my, mw, mh, mask_smooth, mask_color,
                                                    r, g, b, a);
                   return;
                }
-             ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
-             ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
-             ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
-             ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
+             ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
+             ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
+             ssw = ((double)sw * (double)(nw)) / (double)(w);
+             ssh = ((double)sh * (double)(nh)) / (double)(h);
              evas_gl_common_context_font_push(gc, tex,
                                               ssx, ssy, ssw, ssh,
                                               nx, ny, nw, nh,
@@ -138,7 +138,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
              evas_gl_common_context_font_push(gc, tex,
                                               0.0, 0.0, 0.0, 0.0,
 //                                              sx, sy, sw, sh,
-                                              x, y, tex->w, tex->h,
+                                              x, y, w, h,
                                               mtex, mx, my, mw, mh, mask_smooth, mask_color,
                                               r, g, b, a);
           }
@@ -147,7 +147,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
    /* save out clip info */
    c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
    evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->shared->w, gc->shared->h);
-   evas_common_draw_context_clip_clip(gc->dc, x, y, tex->w, tex->h);
+   evas_common_draw_context_clip_clip(gc->dc, x, y, w, h);
    /* our clip is 0 size.. abort */
    if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0))
      {
@@ -160,23 +160,23 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
         int nx, ny, nw, nh;
 
         rct = _evas_gl_common_cutout_rects->rects + i;
-        nx = x; ny = y; nw = tex->w; nh = tex->h;
+        nx = x; ny = y; nw = w; nh = h;
         RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h);
         if ((nw < 1) || (nh < 1)) continue;
-        if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
+        if ((nx == x) && (ny == y) && (nw == w) && (nh == h))
           {
              evas_gl_common_context_font_push(gc, tex,
                                               0.0, 0.0, 0.0, 0.0,
 //                                              sx, sy, sw, sh,
-                                              x, y, tex->w, tex->h,
+                                              x, y, w, h,
                                               mtex, mx, my, mw, mh, mask_smooth, mask_color,
                                               r, g, b, a);
              continue;
           }
-        ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
-        ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
-        ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
-        ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
+        ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
+        ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
+        ssw = ((double)sw * (double)(nw)) / (double)(w);
+        ssh = ((double)sh * (double)(nh)) / (double)(h);
         evas_gl_common_context_font_push(gc, tex,
                                          ssx, ssy, ssw, ssh,
                                          nx, ny, nw, nh,
index d7253de..554fdf8 100644 (file)
@@ -3192,30 +3192,33 @@ eng_image_cache_get(void *data EINA_UNUSED)
 
 static Evas_Font_Set *
 eng_font_load(void *data EINA_UNUSED, const char *name, int size,
-      Font_Rend_Flags wanted_rend)
+      Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
-   return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend);
+   return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend, bitmap_scalable);
 }
 
 static Evas_Font_Set *
-eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
+eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size,
+                     Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    return (Evas_Font_Set *) evas_common_font_memory_load(source, name, size,
-         fdata, fdata_size, wanted_rend);
+         fdata, fdata_size, wanted_rend, bitmap_scalable);
 }
 
 static Evas_Font_Set *
-eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend)
+eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend,
+             Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
-         size, wanted_rend);
+         size, wanted_rend, bitmap_scalable);
 }
 
 static Evas_Font_Set *
-eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
+eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size,
+                    Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
 {
    return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font,
-         source, name, size, fdata, fdata_size, wanted_rend);
+         source, name, size, fdata, fdata_size, wanted_rend, bitmap_scalable);
 }
 
 static void