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
This commit is contained in:
Youngbok Shin 2017-09-25 18:34:22 +09:00 committed by Carsten Haitzler (Rasterman)
parent bb887f9869
commit 1750410650
20 changed files with 402 additions and 188 deletions

View File

@ -37,6 +37,18 @@ enum Efl.Text.Font.Slant {
italic, [[Italic 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 { interface Efl.Text.Font {
[[Font settings of the text [[Font settings of the text
@ -114,5 +126,17 @@ interface Efl.Text.Font {
lang: string; [[Language]] 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]]
}
}
} }
} }

View 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_weight { get; set; }
Efl.Text.Font.font_slant { get; set; } Efl.Text.Font.font_slant { get; set; }
Efl.Text.Font.font_width { 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.normal_color { get; set; }
Efl.Text.Style.backing_type { get; set; } Efl.Text.Style.backing_type { get; set; }
Efl.Text.Style.backing_color { get; set; } Efl.Text.Style.backing_color { get; set; }

View File

@ -32,6 +32,7 @@ struct _Fndat
Evas_Font_Set *font; Evas_Font_Set *font;
int ref; int ref;
Font_Rend_Flags wanted_rend; Font_Rend_Flags wanted_rend;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
FcFontSet *set; FcFontSet *set;
@ -235,7 +236,7 @@ evas_font_free(Evas *eo_evas, void *font)
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
static Evas_Font_Set * static Evas_Font_Set *
_evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int size, _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); Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
int i; 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); FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
if (font) 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 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; return font;
@ -550,7 +551,7 @@ evas_font_name_parse(Evas_Font_Description *fdesc, const char *name)
} }
void * 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); Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
@ -585,8 +586,9 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (((!source) && (!fd->source)) || if (((!source) && (!fd->source)) ||
((source) && (fd->source) && (!strcmp(source, fd->source)))) ((source) && (fd->source) && (!strcmp(source, fd->source))))
{ {
if ((size == fd->size) && if ((size == fd->size) &&
(wanted_rend == fd->wanted_rend)) (wanted_rend == fd->wanted_rend) &&
(bitmap_scalable == fd->bitmap_scalable))
{ {
fonts_cache = eina_list_promote_list(fonts_cache, l); fonts_cache = eina_list_promote_list(fonts_cache, l);
fd->ref++; fd->ref++;
@ -605,7 +607,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
if (found_fd) 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; goto on_find;
} }
#endif #endif
@ -638,7 +640,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
if (found_fd) 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; goto on_find;
} }
#endif #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); fake_name = evas_file_path_join(source, nm);
if (fake_name) 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 */ if (!font) /* Load from fake name failed, probably not cached */
{ {
/* read original!!! */ /* 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); fdata = eet_read(ef, nm, &fsize);
if (fdata) 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); free(fdata);
} }
eet_close(ef); 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 (!font) /* Source load failed */
{ {
if (evas_file_path_is_full_path((char *)nm)) /* Try filename */ 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 */ else /* search font path */
{ {
Eina_List *ll; 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); f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file) 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; 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); f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file) 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; if (font) break;
} }
} }
@ -729,7 +731,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (fake_name) if (fake_name)
{ {
/* FIXME: make an engine func */ /* 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!!! */ /* read original!!! */
ef = eet_open(source, EET_FILE_MODE_READ); 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); fdata = eet_read(ef, nm, &fsize);
if ((fdata) && (fsize > 0)) 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); eet_close(ef);
free(fdata); free(fdata);
@ -755,7 +757,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (!ok) if (!ok)
{ {
if (evas_file_path_is_full_path((char *)nm)) 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 else
{ {
Eina_List *ll; 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); f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file) 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) if (fn)
break; 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); f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file) 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) if (fn)
break; break;
} }
@ -854,7 +856,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
} }
else 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. */ 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 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 #endif
@ -899,6 +901,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
fd->font = font; fd->font = font;
fd->wanted_rend = wanted_rend; fd->wanted_rend = wanted_rend;
fd->size = size; fd->size = size;
fd->bitmap_scalable = bitmap_scalable;
fd->ref = 1; fd->ref = 1;
fonts_cache = eina_list_prepend(fonts_cache, fd); fonts_cache = eina_list_prepend(fonts_cache, fd);
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG

View File

@ -48,6 +48,7 @@ struct _Evas_Text_Data
Evas_Font_Size size; Evas_Font_Size size;
Evas_Text_Style_Type style; Evas_Text_Style_Type style;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev; } cur, prev;
struct { struct {
@ -417,15 +418,59 @@ _evas_text_efl_text_properties_font_source_get(Eo *eo_obj EINA_UNUSED, Evas_Text
return o->cur.source; return o->cur.source;
} }
EOLIAN static void static void
_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size) _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); 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 pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE; Eina_Bool source_invisible = EINA_FALSE;
Evas_Font_Description *fdesc;
Eina_List *was = NULL; Eina_List *was = NULL;
if (!(obj->layer->evas->is_frozen))
{
pass = evas_event_passes_through(eo_obj, obj);
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
1, 1);
}
/* DO IT */
if (o->font)
{
evas_font_free(obj->layer->evas->evas, o->font);
o->font = NULL;
}
o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source,
(int)(((double) o->cur.size) * obj->cur->scale), o->cur.bitmap_scalable);
{
o->ascent = 0;
o->descent = 0;
o->max_ascent = 0;
o->max_descent = 0;
}
_evas_object_text_items_clear(o);
_evas_object_text_recalc(eo_obj, o->cur.text);
o->changed = 1;
if (o->has_filter)
evas_filter_changed_set(eo_obj, EINA_TRUE);
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible)
_evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
}
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; if ((!font) || (size <= 0)) return;
evas_object_async_block(obj); evas_object_async_block(obj);
@ -455,43 +500,7 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha
eina_stringshare_replace(&o->cur.font, font); eina_stringshare_replace(&o->cur.font, font);
o->prev.font = NULL; o->prev.font = NULL;
if (!(obj->layer->evas->is_frozen)) _evas_text_font_reload(eo_obj, o);
{
pass = evas_event_passes_through(eo_obj, obj);
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
1, 1);
}
/* DO IT */
if (o->font)
{
evas_font_free(obj->layer->evas->evas, o->font);
o->font = NULL;
}
o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source,
(int)(((double) o->cur.size) * obj->cur->scale));
{
o->ascent = 0;
o->descent = 0;
o->max_ascent = 0;
o->max_descent = 0;
}
_evas_object_text_items_clear(o);
_evas_object_text_recalc(eo_obj, o->cur.text);
o->changed = 1;
if (o->has_filter)
evas_filter_changed_set(eo_obj, EINA_TRUE);
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible)
_evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
} }
EOLIAN static void EOLIAN static void
@ -1618,6 +1627,7 @@ evas_object_text_init(Evas_Object *eo_obj)
Evas_Text_Data *o = obj->private_data; Evas_Text_Data *o = obj->private_data;
/* alloc obj private data */ /* alloc obj private data */
o->prev.ellipsis = o->cur.ellipsis = -1.0; 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; o->prev = o->cur;
#ifdef BIDI_SUPPORT #ifdef BIDI_SUPPORT
o->bidi_par_props = evas_bidi_paragraph_props_new(); 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; 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 \ #define EVAS_TEXT_EXTRA_OPS \
EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_text_efl_object_dbg_info_get) EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_text_efl_object_dbg_info_get)

View File

@ -512,6 +512,7 @@ struct _Evas_Object_Textblock_Format
const char *source; /**< Pointer to object from which to search for the font. */ const char *source; /**< Pointer to object from which to search for the font. */
Evas_Font_Set *font; /**< Pointer to font set. */ Evas_Font_Set *font; /**< Pointer to font set. */
Evas_Font_Size size; /**< Size of the font. */ Evas_Font_Size size; /**< Size of the font. */
Efl_Text_Font_Bitmap_Scalable bitmap_scalable; /**< Scalable for bitmap font. */
} font; } font;
struct { struct {
struct { struct {
@ -629,6 +630,7 @@ struct _Evas_Object_Textblock
Efl_Text_Style_Effect_Type effect; Efl_Text_Style_Effect_Type effect;
Efl_Text_Style_Shadow_Direction shadow_direction; Efl_Text_Style_Shadow_Direction shadow_direction;
Efl_Text_Format_Wrap wrap; Efl_Text_Format_Wrap wrap;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} info; } info;
} default_format; } default_format;
double valign; double valign;
@ -2826,7 +2828,7 @@ _format_dup(Evas_Object *eo_obj, const Evas_Object_Textblock_Format *fmt)
/* FIXME: just ref the font here... */ /* FIXME: just ref the font here... */
fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc, 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) 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); c->format_stack = eina_list_prepend(c->format_stack, fmt);
*fmt = c->o->default_format.format; *fmt = c->o->default_format.format;
fmt->ref = 1; fmt->ref = 1;
fmt->font.bitmap_scalable = _FMT_INFO(bitmap_scalable);
// Apply font if specified // Apply font if specified
if (_FMT_INFO(font)) 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->width = _FMT_INFO(font_width);
fmt->font.fdesc->lang = _FMT_INFO(font_lang); fmt->font.fdesc->lang = _FMT_INFO(font_lang);
fmt->font.font = evas_font_load(evas_obj->layer->evas->evas, fmt->font.fdesc, 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)) 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; of = fmt->font.font;
fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc, 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); 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(linerelgap) = 0.0;
_FMT(password) = 1; _FMT(password) = 1;
_FMT(ellipsis) = -1; _FMT(ellipsis) = -1;
_FMT_INFO(bitmap_scalable) = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
return eo_obj; 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); 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 */ /* Efl.Text.Style interface implementation */
/* Helper: sets color fields of style 'x' and informs if any are changed. */ /* Helper: sets color fields of style 'x' and informs if any are changed. */

View File

@ -36,6 +36,7 @@ struct _Evas_Textgrid_Data
Eina_Array palette_standard; Eina_Array palette_standard;
Eina_Array palette_extended; Eina_Array palette_extended;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev; } cur, prev;
int ascent; int ascent;
@ -156,6 +157,7 @@ evas_object_textgrid_init(Evas_Object *eo_obj)
Evas_Textgrid_Data *o = obj->private_data; Evas_Textgrid_Data *o = obj->private_data;
o->magic = MAGIC_OBJ_TEXTGRID; o->magic = MAGIC_OBJ_TEXTGRID;
o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
o->prev = o->cur; o->prev = o->cur;
eina_array_step_set(&o->cur.palette_standard, sizeof (Eina_Array), 16); eina_array_step_set(&o->cur.palette_standard, sizeof (Eina_Array), 16);
eina_array_step_set(&o->cur.palette_extended, 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, fdesc,
o->cur.font_source, o->cur.font_source,
(int)(((double) o->cur.font_size) * (int)(((double) o->cur.font_size) *
obj->cur->scale)); obj->cur->scale),
o->cur.bitmap_scalable);
if (font) if (font)
{ {
Eina_Unicode W[2] = { 'O', 0 }; Eina_Unicode W[2] = { 'O', 0 };
@ -1054,11 +1057,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj,
return ret; return ret;
} }
EOLIAN static void static void
_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, _evas_textgrid_font_reload(Eo *eo_obj, Evas_Textgrid_Data *o)
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_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE; 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; Evas_Font_Description *fdesc;
Eina_List *was = NULL; Eina_List *was = NULL;
if ((!font_name) || (!*font_name) || (font_size <= 0)) fdesc = o->cur.font_description_normal;
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;
if (!(obj->layer->evas->is_frozen)) 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_description_normal,
o->cur.font_source, o->cur.font_source,
(int)(((double) o->cur.font_size) * (int)(((double) o->cur.font_size) *
obj->cur->scale)); obj->cur->scale),
o->cur.bitmap_scalable);
if (o->font_normal) if (o->font_normal)
{ {
Eina_Unicode W[2] = { 'O', 0 }; Eina_Unicode W[2] = { 'O', 0 };
@ -1244,6 +1222,43 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, 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 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) _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)
{ {
@ -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); 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 \ #define EVAS_TEXTGRID_EXTRA_OPS \
EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_textgrid_efl_object_dbg_info_get) EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_textgrid_efl_object_dbg_info_get)

View File

@ -1,6 +1,6 @@
type @extern Evas.Text_Style_Type : __undefined_type; [[External text style type]] 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]] [[Evas text class]]
legacy_prefix: evas_object_text; 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.text { get; set; }
Efl.Text.Properties.font { get; set; } Efl.Text.Properties.font { get; set; }
Efl.Text.Properties.font_source { get; set; } Efl.Text.Properties.font_source { get; set; }
Efl.Text.Font.font_bitmap_scalable { get; set; }
Efl.Gfx.Filter.filter_program { set; } Efl.Gfx.Filter.filter_program { set; }
Efl.Canvas.Filter.Internal.filter_dirty; Efl.Canvas.Filter.Internal.filter_dirty;
Efl.Canvas.Filter.Internal.filter_input_alpha; Efl.Canvas.Filter.Internal.filter_input_alpha;

View File

@ -20,7 +20,7 @@ enum Evas.Textgrid.Font_Style {
/* XXX: Actual definition is in C. */ /* XXX: Actual definition is in C. */
struct Evas.Textgrid.Cell; [[Evas textgrid cell data structure]] 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]] [[Evas textgrid class]]
legacy_prefix: evas_object_textgrid; legacy_prefix: evas_object_textgrid;
@ -200,5 +200,6 @@ class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties)
Efl.Object.destructor; Efl.Object.destructor;
Efl.Text.Properties.font { get; set; } Efl.Text.Properties.font { get; set; }
Efl.Text.Properties.font_source { get; set; } Efl.Text.Properties.font_source { get; set; }
Efl.Text.Font.font_bitmap_scalable { get; set; }
} }
} }

View File

@ -11,7 +11,7 @@ EAPI void evas_common_draw_context_font_ext_set (RGBA_D
void *data, void *data,
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), void *(*gl_new) (void *data, RGBA_Font_Glyph *fg),
void (*gl_free) (void *ext_dat), 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_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
void (*gl_image_free) (void *image), void (*gl_image_free) (void *image),
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth)); void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth));

View File

@ -215,7 +215,7 @@ evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc,
void *data, void *data,
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), void *(*gl_new) (void *data, RGBA_Font_Glyph *fg),
void (*gl_free) (void *ext_dat), 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_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
void (*gl_image_free) (void *image), void (*gl_image_free) (void *image),
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth)) void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth))

View 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 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_source_free (RGBA_Font_Source *fs);
EAPI void evas_common_font_size_use (RGBA_Font *fn); 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_init (RGBA_Font_Int *fn);
EAPI RGBA_Font_Int *evas_common_font_int_load_complete (RGBA_Font_Int *fi); 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_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); 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); 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); 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_free (RGBA_Font *fn);
EAPI void evas_common_font_int_unref (RGBA_Font_Int *fi); 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 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 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_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); 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); 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); 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 void evas_common_font_int_modify_cache_by (RGBA_Font_Int *fi, int dir);
EAPI int evas_common_font_cache_get (void); EAPI int evas_common_font_cache_get (void);
EAPI void evas_common_font_cache_set (int size); EAPI void evas_common_font_cache_set (int size);
EAPI void evas_common_font_flush (void); EAPI void evas_common_font_flush (void);
EAPI void evas_common_font_flush_last (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_all_clear (void);
EAPI void evas_common_font_ext_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_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_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); EAPI DATA8 *evas_common_font_glyph_uncompress(RGBA_Font_Glyph *fg, int *wret, int *hret);
void evas_common_font_load_init(void); void evas_common_font_load_init(void);

View File

@ -482,14 +482,19 @@ EAPI void
evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
RGBA_Draw_Context *dc, RGBA_Draw_Context *dc,
RGBA_Image *dst_image, int dst_pitch, 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; 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 *dst = dst_image->image.data;
DATA32 coltab[16], col; DATA32 coltab[16], col;
DATA16 mtab[16], v; 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; w = fgo->bitmap.width; h = fgo->bitmap.rows;
// skip if totally clipped out // skip if totally clipped out
if ((y >= (cy + ch)) || ((y + h) <= cy) || 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); ptr = dst + (x + x1) + ((y + row) * dst_pitch);
buf_ptr = buf + (row * w) + x1; buf_ptr = buf + (row * w) + x1;
func(buf_ptr, mask, 0, ptr, x2 - x1); func(buf_ptr, mask, 0, ptr, w);
} }
} }
else else

View File

@ -24,16 +24,25 @@ evas_common_font_draw_init(void)
} }
static 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 #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get()) if (evas_cserve2_use_get())
{ {
Evas_Cache2 *cache = evas_common_image_cache2_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 #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 static void
@ -50,12 +59,15 @@ _evas_font_image_free(void *image)
} }
static void 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; RGBA_Image *im;
int src_w, src_h;
if (!image) return; if (!image || !fg) return;
im = image; im = image;
src_w = fg->glyph_out->bitmap.width;
src_h = fg->glyph_out->bitmap.rows;
#ifdef BUILD_PIPE_RENDER #ifdef BUILD_PIPE_RENDER
if ((eina_cpu_count() > 1)) if ((eina_cpu_count() > 1))
@ -66,24 +78,24 @@ _evas_font_image_draw(void *context, void *surface, void *image, int src_x, int
#endif #endif
evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im), evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
surface, context, smooth, surface, context, smooth,
src_x, src_y, src_w, src_h, 0, 0, src_w, src_h,
dst_x, dst_y, dst_w, dst_h); x, y, w, h);
evas_common_pipe_image_draw(im, surface, context, smooth, evas_common_pipe_image_draw(im, surface, context, smooth,
src_x, src_y, src_w, src_h, 0, 0, src_w, src_h,
dst_x, dst_y, dst_w, dst_h); x, y, w, h);
} }
else else
#endif #endif
{ {
evas_common_rgba_image_scalecache_prepare evas_common_rgba_image_scalecache_prepare
(&im->cache_entry, surface, context, smooth, (&im->cache_entry, surface, context, smooth,
src_x, src_y, src_w, src_h, 0, 0, src_w, src_h,
dst_x, dst_y, dst_w, dst_h); x, y, w, h);
evas_common_rgba_image_scalecache_do evas_common_rgba_image_scalecache_do
(&im->cache_entry, surface, context, smooth, (&im->cache_entry, surface, context, smooth,
src_x, src_y, src_w, src_h, 0, 0, src_w, src_h,
dst_x, dst_y, dst_w, dst_h); x, y, w, h);
evas_common_cpu_end_opt(); 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; int chr_x, chr_y, w, h;
fg = glyph->fg; fg = glyph->fg;
w = fg->glyph_out->bitmap.width; w = fg->glyph_out->bitmap.width;
h = fg->glyph_out->bitmap.rows; 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)) if ((!fg->ext_dat) && (dc->font_ext.func.gl_new))
{ {
/* extension calls */ /* extension calls */
@ -132,9 +155,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
} }
else else
{ {
fg->ext_dat = _evas_font_image_new_from_data fg->ext_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
(w, h, (DATA32 *)fg->glyph_out->bitmap.buffer,
EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
fg->ext_dat_free = _evas_font_image_free; 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)) if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
dc->font_ext.func.gl_draw(dc->font_ext.data, dst, dc->font_ext.func.gl_draw(dc->font_ext.data, dst,
dc, fg, dc, fg,
chr_x, y - (chr_y - y)); chr_x, y - (chr_y - y), w, h);
else else
// TODO: scale with evas_font_compress_draw.c...
evas_common_font_glyph_draw(fg, dc, dst, im_w, 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_x, ext_y,
ext_w, ext_h); 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); chr_x, y - (chr_y - y), w, h, EINA_TRUE);
else else
_evas_font_image_draw _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); chr_x, y - (chr_y - y), w, h, EINA_TRUE);
} }
} }

View 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->src->name == k2->src->name)
{ {
if (k1->size == k2->size) 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 else
return k1->size - k2->size; {
return k1->size - k2->size;
}
} }
return strcmp(k1->src->name, k2->src->name); 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_djb2(key->src->name, eina_stringshare_strlen(key->src->name) + 1);
hash ^= eina_hash_int32(&key->size, sizeof (int)); hash ^= eina_hash_int32(&key->size, sizeof (int));
hash ^= eina_hash_int32(&wanted_rend, sizeof (int)); hash ^= eina_hash_int32(&wanted_rend, sizeof (int));
hash ^= eina_hash_int32(&key->bitmap_scalable, sizeof (int));
return hash; return hash;
} }
@ -322,13 +330,13 @@ _evas_common_font_int_cache_init(RGBA_Font_Int *fi)
} }
EAPI RGBA_Font_Int * 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; RGBA_Font_Int *fi;
char *fake_name; char *fake_name;
fake_name = evas_file_path_join(source, 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) if (fi)
{ {
free(fake_name); free(fake_name);
@ -350,6 +358,7 @@ evas_common_font_int_memory_load(const char *source, const char *name, int size,
return NULL; return NULL;
} }
fi->size = size; fi->size = size;
fi->bitmap_scalable = bitmap_scalable;
_evas_common_font_int_cache_init(fi); _evas_common_font_int_cache_init(fi);
fi = evas_common_font_int_load_init(fi); fi = evas_common_font_int_load_init(fi);
evas_common_font_int_load_complete(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 * EAPI RGBA_Font_Int *
evas_common_font_int_load(const char *name, int size, 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; 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; if (fi) return fi;
fi = calloc(1, sizeof(RGBA_Font_Int)); fi = calloc(1, sizeof(RGBA_Font_Int));
if (!fi) return NULL; if (!fi) return NULL;
@ -393,6 +403,7 @@ evas_common_font_int_load(const char *name, int size,
} }
fi->size = size; fi->size = size;
fi->wanted_rend = wanted_rend; fi->wanted_rend = wanted_rend;
fi->bitmap_scalable = bitmap_scalable;
_evas_common_font_int_cache_init(fi); _evas_common_font_int_cache_init(fi);
fi = evas_common_font_int_load_init(fi); fi = evas_common_font_int_load_init(fi);
#ifdef EVAS_CSERVE2 #ifdef EVAS_CSERVE2
@ -437,6 +448,7 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
} }
fi->real_size = fi->size * 64; 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); error = FT_Set_Char_Size(fi->src->ft.face, 0, fi->real_size, font_dpi, font_dpi);
if (error) if (error)
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);
@ -468,9 +480,20 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
FTLOCK(); FTLOCK();
if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) 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 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(); FTUNLOCK();
if (error) if (error)
@ -543,13 +566,13 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
} }
EAPI RGBA_Font * 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 *fn;
RGBA_Font_Int *fi; RGBA_Font_Int *fi;
fi = evas_common_font_int_memory_load(source, name, size, data, data_size, fi = evas_common_font_int_memory_load(source, name, size, data, data_size,
wanted_rend); wanted_rend, bitmap_scalable);
if (!fi) return NULL; if (!fi) return NULL;
fn = calloc(1, sizeof(RGBA_Font)); fn = calloc(1, sizeof(RGBA_Font));
if (!fn) if (!fn)
@ -577,12 +600,12 @@ evas_common_font_memory_load(const char *source, const char *name, int size, con
// fi->fs // fi->fs
EAPI RGBA_Font * 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 *fn;
RGBA_Font_Int *fi; 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; if (!fi) return NULL;
/* First font, complete load */ /* First font, complete load */
if (!fi->ft.size) 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 * 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; RGBA_Font_Int *fi;
if (!fn) return NULL; 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) if (fi)
{ {
fn->fonts = eina_list_append(fn->fonts, 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 * 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; RGBA_Font_Int *fi;
if (!fn) if (!fn)
return NULL; 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) if (fi)
{ {
fn->fonts = eina_list_append(fn->fonts, fi); fn->fonts = eina_list_append(fn->fonts, fi);
@ -744,38 +767,38 @@ evas_common_hinting_available(Font_Hint_Flags hinting)
} }
EAPI RGBA_Font * 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; 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); if (fn) evas_common_font_hinting_set(fn, hinting);
return fn; return fn;
} }
EAPI RGBA_Font * 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; 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); if (fn) evas_common_font_hinting_set(fn, hinting);
return fn; return fn;
} }
EAPI RGBA_Font * 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); if (fn) evas_common_font_hinting_set(fn, hinting);
return fn; return fn;
} }
EAPI RGBA_Font * 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, 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); if (fn) evas_common_font_hinting_set(fn, hinting);
return fn; return fn;
} }
@ -939,7 +962,8 @@ evas_common_font_flush_last(void)
EAPI RGBA_Font_Int * EAPI RGBA_Font_Int *
evas_common_font_int_find(const char *name, int size, 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_Int tmp_fi;
RGBA_Font_Source tmp_fn; 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.src = &tmp_fn;
tmp_fi.size = size; tmp_fi.size = size;
tmp_fi.wanted_rend = wanted_rend; tmp_fi.wanted_rend = wanted_rend;
tmp_fi.bitmap_scalable = bitmap_scalable;
fi = eina_hash_find(fonts, &tmp_fi); fi = eina_hash_find(fonts, &tmp_fi);
if (fi) if (fi)
{ {

View File

@ -115,6 +115,14 @@ evas_common_font_instance_ascent_get(RGBA_Font_Int *fi)
WRN("NOT SCALABLE!"); WRN("NOT SCALABLE!");
} }
val = (int)fi->src->ft.face->size->metrics.ascender; 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); return FONT_METRIC_ROUNDUP(val);
// printf("%i | %i\n", val, val >> 6); // printf("%i | %i\n", val, val >> 6);
// if (fi->src->ft.face->units_per_EM == 0) // 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; fi->src->current_size = fi->size;
} }
val = -(int)fi->src->ft.face->size->metrics.descender; 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); return FONT_METRIC_ROUNDUP(val);
// if (fi->src->ft.face->units_per_EM == 0) // if (fi->src->ft.face->units_per_EM == 0)
// return val; // 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); val = FONT_METRIC_ROUNDUP((int)fi->src->ft.face->size->metrics.ascender);
else else
val = (int)fi->src->ft.face->bbox.yMax; 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) if (fi->src->ft.face->units_per_EM == 0)
return val; return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; 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); val = FONT_METRIC_ROUNDUP(-(int)fi->src->ft.face->size->metrics.descender);
else else
val = -(int)fi->src->ft.face->bbox.yMin; 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) if (fi->src->ft.face->units_per_EM == 0)
return val; return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; 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; fi->src->current_size = fi->size;
} }
val = (int)fi->src->ft.face->size->metrics.height; 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) && if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0) && (fi->src->ft.face->bbox.yMin == 0) &&
(fi->src->ft.face->units_per_EM == 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->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->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin);
fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax); 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; fg->index = idx;

View File

@ -749,7 +749,7 @@ struct _RGBA_Draw_Context
struct { struct {
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg); void *(*gl_new) (void *data, RGBA_Font_Glyph *fg);
void (*gl_free) (void *ext_dat); 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_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace);
void (*gl_image_free) (void *image); void (*gl_image_free) (void *image);
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth); 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; Eina_Hash *kerning;
Fash_Glyph *fash; Fash_Glyph *fash;
unsigned int size; unsigned int size;
float scale_factor;
int real_size; int real_size;
int max_h; int max_h;
int references; int references;
@ -1033,6 +1034,8 @@ struct _RGBA_Font_Int
int generation; int generation;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
unsigned char sizeok : 1; unsigned char sizeok : 1;
unsigned char inuse : 1; unsigned char inuse : 1;
}; };

View File

@ -1501,10 +1501,10 @@ struct _Evas_Func
void *(*image_plane_assign) (void *data, void *image, int x, int y); void *(*image_plane_assign) (void *data, void *image, int x, int y);
void (*image_plane_release) (void *data, void *image, void *plane); 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_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); 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); 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); 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); void (*font_free) (void *engine, Evas_Font_Set *font);
int (*font_ascent_get) (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); 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); 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); Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc);
const char *evas_font_lang_normalize(const char *lang); 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_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_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); void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b);

View 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_new(void *gc, RGBA_Font_Glyph *fg);
void evas_gl_font_texture_free(void *); 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_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_free(void *im);
void evas_gl_font_image_draw(void *gc, void *im, int dx, int dy, int dw, int dh, int smooth); void evas_gl_font_image_draw(void *gc, void *im, int dx, int dy, int dw, int dh, int smooth);

View File

@ -57,7 +57,7 @@ evas_gl_font_texture_free(void *tex)
} }
void 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; Evas_Engine_GL_Context *gc = context;
RGBA_Draw_Context *dc = draw_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; 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, RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
gc->dc->clip.x, gc->dc->clip.y, gc->dc->clip.x, gc->dc->clip.y,
gc->dc->clip.w, gc->dc->clip.h); gc->dc->clip.w, gc->dc->clip.h);
if ((nw < 1) || (nh < 1)) return; 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, evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh, // sx, sy, sw, sh,
x, y, tex->w, tex->h, x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color, mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a); r, g, b, a);
return; return;
} }
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w)); ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h)); ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
ssw = ((double)sw * (double)(nw)) / (double)(tex->w); ssw = ((double)sw * (double)(nw)) / (double)(w);
ssh = ((double)sh * (double)(nh)) / (double)(tex->h); ssh = ((double)sh * (double)(nh)) / (double)(h);
evas_gl_common_context_font_push(gc, tex, evas_gl_common_context_font_push(gc, tex,
ssx, ssy, ssw, ssh, ssx, ssy, ssw, ssh,
nx, ny, nw, nh, 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, evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh, // sx, sy, sw, sh,
x, y, tex->w, tex->h, x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color, mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a); 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 */ /* 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; 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, 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 */ /* our clip is 0 size.. abort */
if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0)) 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; int nx, ny, nw, nh;
rct = _evas_gl_common_cutout_rects->rects + i; 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); RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h);
if ((nw < 1) || (nh < 1)) continue; 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, evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh, // sx, sy, sw, sh,
x, y, tex->w, tex->h, x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color, mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a); r, g, b, a);
continue; continue;
} }
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w)); ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h)); ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
ssw = ((double)sw * (double)(nw)) / (double)(tex->w); ssw = ((double)sw * (double)(nw)) / (double)(w);
ssh = ((double)sh * (double)(nh)) / (double)(tex->h); ssh = ((double)sh * (double)(nh)) / (double)(h);
evas_gl_common_context_font_push(gc, tex, evas_gl_common_context_font_push(gc, tex,
ssx, ssy, ssw, ssh, ssx, ssy, ssw, ssh,
nx, ny, nw, nh, nx, ny, nw, nh,

View File

@ -3192,30 +3192,33 @@ eng_image_cache_get(void *data EINA_UNUSED)
static Evas_Font_Set * static Evas_Font_Set *
eng_font_load(void *data EINA_UNUSED, const char *name, int size, 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 * 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, 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 * 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, return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
size, wanted_rend); size, wanted_rend, bitmap_scalable);
} }
static Evas_Font_Set * 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, 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 static void