summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoungbok Shin <youngb.shin@samsung.com>2017-09-25 18:34:22 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2017-09-26 11:31:31 +0900
commit17504106501cec1a0a85eb380c5dea7e0ca3729c (patch)
tree942944734aa98b84c791206bdc6c5db1e084c3ae
parentbb887f9869c3dd9eca72c8e65f335d148f9dbdd3 (diff)
downloadefl-17504106501cec1a0a85eb380c5dea7e0ca3729c.tar.gz
evas: Add scale feature for embedded bitmap fonts.
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
-rw-r--r--src/lib/efl/interfaces/efl_text_font.eo24
-rw-r--r--src/lib/evas/canvas/efl_canvas_text.eo1
-rw-r--r--src/lib/evas/canvas/evas_font_dir.c43
-rw-r--r--src/lib/evas/canvas/evas_object_text.c91
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c24
-rw-r--r--src/lib/evas/canvas/evas_object_textgrid.c92
-rw-r--r--src/lib/evas/canvas/evas_text.eo3
-rw-r--r--src/lib/evas/canvas/evas_textgrid.eo3
-rw-r--r--src/lib/evas/common/evas_draw.h2
-rw-r--r--src/lib/evas/common/evas_draw_main.c2
-rw-r--r--src/lib/evas/common/evas_font.h22
-rw-r--r--src/lib/evas/common/evas_font_compress.c11
-rw-r--r--src/lib/evas/common/evas_font_draw.c60
-rw-r--r--src/lib/evas/common/evas_font_load.c75
-rw-r--r--src/lib/evas/common/evas_font_main.c53
-rw-r--r--src/lib/evas/include/evas_common_private.h5
-rw-r--r--src/lib/evas/include/evas_private.h10
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_common.h2
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_font.c34
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c19
20 files changed, 395 insertions, 181 deletions
diff --git a/src/lib/efl/interfaces/efl_text_font.eo b/src/lib/efl/interfaces/efl_text_font.eo
index b43c522c2a..b68e142b6f 100644
--- a/src/lib/efl/interfaces/efl_text_font.eo
+++ b/src/lib/efl/interfaces/efl_text_font.eo
@@ -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]]
+ }
+ }
}
}
diff --git a/src/lib/evas/canvas/efl_canvas_text.eo b/src/lib/evas/canvas/efl_canvas_text.eo
index d18c9bf93f..22b8e9dd0d 100644
--- a/src/lib/evas/canvas/efl_canvas_text.eo
+++ b/src/lib/evas/canvas/efl_canvas_text.eo
@@ -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; }
diff --git a/src/lib/evas/canvas/evas_font_dir.c b/src/lib/evas/canvas/evas_font_dir.c
index 80e37fad08..6514b0ffd4 100644
--- a/src/lib/evas/canvas/evas_font_dir.c
+++ b/src/lib/evas/canvas/evas_font_dir.c
@@ -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
diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c
index 6704bd3239..5108aad00e 100644
--- a/src/lib/evas/canvas/evas_object_text.c
+++ b/src/lib/evas/canvas/evas_object_text.c
@@ -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)
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index ac39ea65d6..c804522f21 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -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. */
diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c
index 1a24086d3e..7f6dc76eb6 100644
--- a/src/lib/evas/canvas/evas_object_textgrid.c
+++ b/src/lib/evas/canvas/evas_object_textgrid.c
@@ -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)
diff --git a/src/lib/evas/canvas/evas_text.eo b/src/lib/evas/canvas/evas_text.eo
index 017d5b34ca..68623a672e 100644
--- a/src/lib/evas/canvas/evas_text.eo
+++ b/src/lib/evas/canvas/evas_text.eo
@@ -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;
diff --git a/src/lib/evas/canvas/evas_textgrid.eo b/src/lib/evas/canvas/evas_textgrid.eo
index 2dd3966f2d..369068862b 100644
--- a/src/lib/evas/canvas/evas_textgrid.eo
+++ b/src/lib/evas/canvas/evas_textgrid.eo
@@ -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; }
}
}
diff --git a/src/lib/evas/common/evas_draw.h b/src/lib/evas/common/evas_draw.h
index 28b7c9429f..e045a186ce 100644
--- a/src/lib/evas/common/evas_draw.h
+++ b/src/lib/evas/common/evas_draw.h
@@ -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));
diff --git a/src/lib/evas/common/evas_draw_main.c b/src/lib/evas/common/evas_draw_main.c
index d6b0a8942b..2f3fa949de 100644
--- a/src/lib/evas/common/evas_draw_main.c
+++ b/src/lib/evas/common/evas_draw_main.c
@@ -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))
diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h
index f9f8026c85..b50b68d530 100644
--- a/src/lib/evas/common/evas_font.h
+++ b/src/lib/evas/common/evas_font.h
@@ -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);
diff --git a/src/lib/evas/common/evas_font_compress.c b/src/lib/evas/common/evas_font_compress.c
index 3a0e90c64f..5e7658caf8 100644
--- a/src/lib/evas/common/evas_font_compress.c
+++ b/src/lib/evas/common/evas_font_compress.c
@@ -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
diff --git a/src/lib/evas/common/evas_font_draw.c b/src/lib/evas/common/evas_font_draw.c
index f7fcb13bd8..4bdecddafe 100644
--- a/src/lib/evas/common/evas_font_draw.c
+++ b/src/lib/evas/common/evas_font_draw.c
@@ -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);
}
}
diff --git a/src/lib/evas/common/evas_font_load.c b/src/lib/evas/common/evas_font_load.c
index 2afd124941..6bf1e34a08 100644
--- a/src/lib/evas/common/evas_font_load.c
+++ b/src/lib/evas/common/evas_font_load.c
@@ -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)
{
diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c
index 91db4d52ec..0b25e31868 100644
--- a/src/lib/evas/common/evas_font_main.c
+++ b/src/lib/evas/common/evas_font_main.c
@@ -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;
diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h
index a4b3ae3623..12cda89d02 100644
--- a/src/lib/evas/include/evas_common_private.h
+++ b/src/lib/evas/include/evas_common_private.h
@@ -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;
};
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 12419998de..02c93c54a8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -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);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h
index 6124cf8da0..8e212952c4 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_common.h
+++ b/src/modules/evas/engines/gl_common/evas_gl_common.h
@@ -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);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_font.c b/src/modules/evas/engines/gl_common/evas_gl_font.c
index 1b3e35b607..2e2c5263a9 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_font.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_font.c
@@ -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,
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index d7253de9fb..554fdf8d3b 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -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