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]]
}
/* 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]]
}
}
}
}

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_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; }

View File

@ -32,6 +32,7 @@ struct _Fndat
Evas_Font_Set *font;
int ref;
Font_Rend_Flags wanted_rend;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
#ifdef HAVE_FONTCONFIG
FcFontSet *set;
@ -235,7 +236,7 @@ evas_font_free(Evas *eo_evas, void *font)
#ifdef HAVE_FONTCONFIG
static Evas_Font_Set *
_evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int size,
Font_Rend_Flags wanted_rend)
Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
int i;
@ -248,9 +249,9 @@ _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int si
FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
if (font)
evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend);
evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend, bitmap_scalable);
else
font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend);
font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend, bitmap_scalable);
}
return font;
@ -550,7 +551,7 @@ evas_font_name_parse(Evas_Font_Description *fdesc, const char *name)
}
void *
evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size)
evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
#ifdef HAVE_FONTCONFIG
@ -585,8 +586,9 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (((!source) && (!fd->source)) ||
((source) && (fd->source) && (!strcmp(source, fd->source))))
{
if ((size == fd->size) &&
(wanted_rend == fd->wanted_rend))
if ((size == fd->size) &&
(wanted_rend == fd->wanted_rend) &&
(bitmap_scalable == fd->bitmap_scalable))
{
fonts_cache = eina_list_promote_list(fonts_cache, l);
fd->ref++;
@ -605,7 +607,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
#ifdef HAVE_FONTCONFIG
if (found_fd)
{
font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend);
font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable);
goto on_find;
}
#endif
@ -638,7 +640,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
#ifdef HAVE_FONTCONFIG
if (found_fd)
{
font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend);
font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable);
goto on_find;
}
#endif
@ -656,7 +658,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
fake_name = evas_file_path_join(source, nm);
if (fake_name)
{
font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend);
font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend, bitmap_scalable);
if (!font) /* Load from fake name failed, probably not cached */
{
/* read original!!! */
@ -669,7 +671,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
fdata = eet_read(ef, nm, &fsize);
if (fdata)
{
font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend);
font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable);
free(fdata);
}
eet_close(ef);
@ -681,7 +683,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (!font) /* Source load failed */
{
if (evas_file_path_is_full_path((char *)nm)) /* Try filename */
font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend);
font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend, bitmap_scalable);
else /* search font path */
{
Eina_List *ll;
@ -694,7 +696,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file)
{
font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend);
font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable);
if (font) break;
}
}
@ -708,7 +710,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file)
{
font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend);
font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable);
if (font) break;
}
}
@ -729,7 +731,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (fake_name)
{
/* FIXME: make an engine func */
if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend))
if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend, bitmap_scalable))
{
/* read original!!! */
ef = eet_open(source, EET_FILE_MODE_READ);
@ -741,7 +743,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
fdata = eet_read(ef, nm, &fsize);
if ((fdata) && (fsize > 0))
{
ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend);
ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable);
}
eet_close(ef);
free(fdata);
@ -755,7 +757,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
if (!ok)
{
if (evas_file_path_is_full_path((char *)nm))
evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend);
evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend, bitmap_scalable);
else
{
Eina_List *ll;
@ -769,7 +771,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file)
{
fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend);
fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable);
if (fn)
break;
}
@ -784,7 +786,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
f_file = evas_font_dir_cache_find(dir, (char *)nm);
if (f_file)
{
fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend);
fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable);
if (fn)
break;
}
@ -854,7 +856,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
}
else
{
font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend);
font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable);
}
}
else /* Add a fallback list from fontconfig according to the found font. */
@ -881,7 +883,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
}
else
{
font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend);
font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable);
}
}
#endif
@ -899,6 +901,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source,
fd->font = font;
fd->wanted_rend = wanted_rend;
fd->size = size;
fd->bitmap_scalable = bitmap_scalable;
fd->ref = 1;
fonts_cache = eina_list_prepend(fonts_cache, fd);
#ifdef HAVE_FONTCONFIG

View File

@ -48,6 +48,7 @@ struct _Evas_Text_Data
Evas_Font_Size size;
Evas_Text_Style_Type style;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev;
struct {
@ -417,15 +418,59 @@ _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 (!(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;
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);
o->prev.font = 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->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);
_evas_text_font_reload(eo_obj, o);
}
EOLIAN static void
@ -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)

View File

@ -512,6 +512,7 @@ struct _Evas_Object_Textblock_Format
const char *source; /**< Pointer to object from which to search for the font. */
Evas_Font_Set *font; /**< Pointer to font set. */
Evas_Font_Size size; /**< Size of the font. */
Efl_Text_Font_Bitmap_Scalable bitmap_scalable; /**< Scalable for bitmap font. */
} font;
struct {
struct {
@ -629,6 +630,7 @@ struct _Evas_Object_Textblock
Efl_Text_Style_Effect_Type effect;
Efl_Text_Style_Shadow_Direction shadow_direction;
Efl_Text_Format_Wrap wrap;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} info;
} default_format;
double valign;
@ -2826,7 +2828,7 @@ _format_dup(Evas_Object *eo_obj, const Evas_Object_Textblock_Format *fmt)
/* FIXME: just ref the font here... */
fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc,
fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale));
fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale), fmt2->font.bitmap_scalable);
if (fmt->gfx_filter)
{
@ -3365,6 +3367,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt,
c->format_stack = eina_list_prepend(c->format_stack, fmt);
*fmt = c->o->default_format.format;
fmt->ref = 1;
fmt->font.bitmap_scalable = _FMT_INFO(bitmap_scalable);
// Apply font if specified
if (_FMT_INFO(font))
@ -3389,7 +3392,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt,
fmt->font.fdesc->width = _FMT_INFO(font_width);
fmt->font.fdesc->lang = _FMT_INFO(font_lang);
fmt->font.font = evas_font_load(evas_obj->layer->evas->evas, fmt->font.fdesc,
fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale));
fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale), fmt->font.bitmap_scalable);
}
if (_FMT_INFO(gfx_filter_name))
{
@ -4490,7 +4493,7 @@ _format_finalize(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt)
of = fmt->font.font;
fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc,
fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale));
fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale), fmt->font.bitmap_scalable);
if (of) evas_font_free(obj->layer->evas->evas, of);
}
@ -6760,6 +6763,7 @@ _efl_canvas_text_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Text_Data *class_
_FMT(linerelgap) = 0.0;
_FMT(password) = 1;
_FMT(ellipsis) = -1;
_FMT_INFO(bitmap_scalable) = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
return eo_obj;
}
@ -15159,6 +15163,20 @@ _efl_canvas_text_efl_text_font_font_width_get(Eo *obj EINA_UNUSED, Efl_Canvas_Te
return _FMT_INFO(font_width);
}
EOLIAN static void
_efl_canvas_text_efl_text_font_font_bitmap_scalable_set(Eo *obj, Efl_Canvas_Text_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
if (_FMT_INFO(bitmap_scalable) == bitmap_scalable) return;
_FMT_INFO(bitmap_scalable) = bitmap_scalable;
_canvas_text_format_changed(obj, o);
}
EOLIAN static Efl_Text_Font_Bitmap_Scalable
_efl_canvas_text_efl_text_font_font_bitmap_scalable_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o)
{
return _FMT_INFO(bitmap_scalable);
}
/* Efl.Text.Style interface implementation */
/* Helper: sets color fields of style 'x' and informs if any are changed. */

View File

@ -36,6 +36,7 @@ struct _Evas_Textgrid_Data
Eina_Array palette_standard;
Eina_Array palette_extended;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev;
int ascent;
@ -156,6 +157,7 @@ evas_object_textgrid_init(Evas_Object *eo_obj)
Evas_Textgrid_Data *o = obj->private_data;
o->magic = MAGIC_OBJ_TEXTGRID;
o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
o->prev = o->cur;
eina_array_step_set(&o->cur.palette_standard, sizeof (Eina_Array), 16);
eina_array_step_set(&o->cur.palette_extended, sizeof (Eina_Array), 16);
@ -1005,7 +1007,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj,
fdesc,
o->cur.font_source,
(int)(((double) o->cur.font_size) *
obj->cur->scale));
obj->cur->scale),
o->cur.bitmap_scalable);
if (font)
{
Eina_Unicode W[2] = { 'O', 0 };
@ -1054,11 +1057,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj,
return ret;
}
EOLIAN static void
_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
Evas_Textgrid_Data *o,
const char *font_name,
Evas_Font_Size font_size)
static void
_evas_textgrid_font_reload(Eo *eo_obj, Evas_Textgrid_Data *o)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
@ -1066,30 +1066,7 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
Evas_Font_Description *fdesc;
Eina_List *was = NULL;
if ((!font_name) || (!*font_name) || (font_size <= 0))
return;
evas_object_async_block(obj);
fdesc = evas_font_desc_new();
/* Set default language according to locale. */
eina_stringshare_replace(&(fdesc->lang),
evas_font_lang_normalize("auto"));
evas_font_name_parse(fdesc, font_name);
if (o->cur.font_description_normal &&
!evas_font_desc_cmp(fdesc, o->cur.font_description_normal) &&
(font_size == o->cur.font_size))
{
evas_font_desc_unref(fdesc);
return;
}
if (o->cur.font_description_normal)
evas_font_desc_unref(o->cur.font_description_normal);
o->cur.font_description_normal = fdesc;
o->cur.font_size = font_size;
eina_stringshare_replace(&o->cur.font_name, font_name);
o->prev.font_name = NULL;
fdesc = o->cur.font_description_normal;
if (!(obj->layer->evas->is_frozen))
{
@ -1111,7 +1088,8 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
o->cur.font_description_normal,
o->cur.font_source,
(int)(((double) o->cur.font_size) *
obj->cur->scale));
obj->cur->scale),
o->cur.bitmap_scalable);
if (o->font_normal)
{
Eina_Unicode W[2] = { 'O', 0 };
@ -1244,6 +1222,43 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_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
_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);
}
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)

View File

@ -1,6 +1,6 @@
type @extern Evas.Text_Style_Type : __undefined_type; [[External text style type]]
class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Filter.Internal)
class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Text.Font, Efl.Canvas.Filter.Internal)
{
[[Evas text class]]
legacy_prefix: evas_object_text;
@ -274,6 +274,7 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Fi
Efl.Text.text { get; set; }
Efl.Text.Properties.font { get; set; }
Efl.Text.Properties.font_source { get; set; }
Efl.Text.Font.font_bitmap_scalable { get; set; }
Efl.Gfx.Filter.filter_program { set; }
Efl.Canvas.Filter.Internal.filter_dirty;
Efl.Canvas.Filter.Internal.filter_input_alpha;

View File

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

View File

@ -11,7 +11,7 @@ EAPI void evas_common_draw_context_font_ext_set (RGBA_D
void *data,
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg),
void (*gl_free) (void *ext_dat),
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y),
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h),
void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
void (*gl_image_free) (void *image),
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth));

View File

@ -215,7 +215,7 @@ evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc,
void *data,
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg),
void (*gl_free) (void *ext_dat),
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y),
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h),
void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace),
void (*gl_image_free) (void *image),
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth))

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 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);

View File

@ -482,14 +482,19 @@ EAPI void
evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
RGBA_Draw_Context *dc,
RGBA_Image *dst_image, int dst_pitch,
int x, int y, int cx, int cy, int cw, int ch)
int dx, int dy, int dw, int dh, int cx, int cy, int cw, int ch)
{
RGBA_Font_Glyph_Out *fgo = fg->glyph_out;
int w, h, x1, x2, y1, y2, i, *iptr;
int x, y, w, h, x1, x2, y1, y2, i, *iptr;
DATA32 *dst = dst_image->image.data;
DATA32 coltab[16], col;
DATA16 mtab[16], v;
// FIXME: Use dw, dh for scaling glyphs...
(void) dw;
(void) dh;
x = dx;
y = dy;
w = fgo->bitmap.width; h = fgo->bitmap.rows;
// skip if totally clipped out
if ((y >= (cy + ch)) || ((y + h) <= cy) ||
@ -582,7 +587,7 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg,
ptr = dst + (x + x1) + ((y + row) * dst_pitch);
buf_ptr = buf + (row * w) + x1;
func(buf_ptr, mask, 0, ptr, x2 - x1);
func(buf_ptr, mask, 0, ptr, w);
}
}
else

View File

@ -24,16 +24,25 @@ evas_common_font_draw_init(void)
}
static void *
_evas_font_image_new_from_data(int w, int h, DATA32 *image_data, int alpha, Evas_Colorspace cspace)
_evas_font_image_new(RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace)
{
DATA32 *image_data;
int src_w, src_h;
if (!fg) return NULL;
image_data = (DATA32 *)fg->glyph_out->bitmap.buffer;
src_w = fg->glyph_out->bitmap.width;
src_h = fg->glyph_out->bitmap.rows;
#ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
{
Evas_Cache2 *cache = evas_common_image_cache2_get();
return evas_cache2_image_data(cache, w, h, image_data, alpha, cspace);
return evas_cache2_image_data(cache, src_w, src_h, image_data, alpha, cspace);
}
#endif
return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
return evas_cache_image_data(evas_common_image_cache_get(), src_w, src_h, image_data, alpha, cspace);
}
static void
@ -50,12 +59,15 @@ _evas_font_image_free(void *image)
}
static void
_evas_font_image_draw(void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
_evas_font_image_draw(void *context, void *surface, void *image, RGBA_Font_Glyph *fg, int x, int y, int w, int h, int smooth)
{
RGBA_Image *im;
int src_w, src_h;
if (!image) return;
if (!image || !fg) return;
im = image;
src_w = fg->glyph_out->bitmap.width;
src_h = fg->glyph_out->bitmap.rows;
#ifdef BUILD_PIPE_RENDER
if ((eina_cpu_count() > 1))
@ -66,24 +78,24 @@ _evas_font_image_draw(void *context, void *surface, void *image, int src_x, int
#endif
evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
surface, context, smooth,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h);
0, 0, src_w, src_h,
x, y, w, h);
evas_common_pipe_image_draw(im, surface, context, smooth,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h);
0, 0, src_w, src_h,
x, y, w, h);
}
else
#endif
{
evas_common_rgba_image_scalecache_prepare
(&im->cache_entry, surface, context, smooth,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h);
0, 0, src_w, src_h,
x, y, w, h);
evas_common_rgba_image_scalecache_do
(&im->cache_entry, surface, context, smooth,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h);
0, 0, src_w, src_h,
x, y, w, h);
evas_common_cpu_end_opt();
}
@ -111,9 +123,20 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
int chr_x, chr_y, w, h;
fg = glyph->fg;
w = fg->glyph_out->bitmap.width;
h = fg->glyph_out->bitmap.rows;
if (FT_HAS_FIXED_SIZES(fg->fi->src->ft.face))
{
if ((fg->fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) &&
FT_HAS_COLOR(fg->fi->src->ft.face))
{
w *= fg->fi->scale_factor;
h *= fg->fi->scale_factor;
}
}
if ((!fg->ext_dat) && (dc->font_ext.func.gl_new))
{
/* extension calls */
@ -132,9 +155,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
}
else
{
fg->ext_dat = _evas_font_image_new_from_data
(w, h, (DATA32 *)fg->glyph_out->bitmap.buffer,
EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
fg->ext_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
fg->ext_dat_free = _evas_font_image_free;
}
}
@ -150,10 +171,11 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
dc->font_ext.func.gl_draw(dc->font_ext.data, dst,
dc, fg,
chr_x, y - (chr_y - y));
chr_x, y - (chr_y - y), w, h);
else
// TODO: scale with evas_font_compress_draw.c...
evas_common_font_glyph_draw(fg, dc, dst, im_w,
chr_x, y - (chr_y - y),
chr_x, y - (chr_y - y), w, h,
ext_x, ext_y,
ext_w, ext_h);
}
@ -165,7 +187,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y,
chr_x, y - (chr_y - y), w, h, EINA_TRUE);
else
_evas_font_image_draw
(dc, dst, fg->ext_dat, 0, 0, w, h,
(dc, dst, fg->ext_dat, fg,
chr_x, y - (chr_y - y), w, h, EINA_TRUE);
}
}

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->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)
{

View File

@ -115,6 +115,14 @@ evas_common_font_instance_ascent_get(RGBA_Font_Int *fi)
WRN("NOT SCALABLE!");
}
val = (int)fi->src->ft.face->size->metrics.ascender;
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if (FT_HAS_COLOR(fi->src->ft.face) &&
fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
val *= fi->scale_factor;
}
return FONT_METRIC_ROUNDUP(val);
// printf("%i | %i\n", val, val >> 6);
// if (fi->src->ft.face->units_per_EM == 0)
@ -137,6 +145,14 @@ evas_common_font_instance_descent_get(RGBA_Font_Int *fi)
fi->src->current_size = fi->size;
}
val = -(int)fi->src->ft.face->size->metrics.descender;
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if (FT_HAS_COLOR(fi->src->ft.face) &&
fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
val *= fi->scale_factor;
}
return FONT_METRIC_ROUNDUP(val);
// if (fi->src->ft.face->units_per_EM == 0)
// return val;
@ -165,6 +181,14 @@ evas_common_font_instance_max_ascent_get(RGBA_Font_Int *fi)
val = FONT_METRIC_ROUNDUP((int)fi->src->ft.face->size->metrics.ascender);
else
val = (int)fi->src->ft.face->bbox.yMax;
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if (FT_HAS_COLOR(fi->src->ft.face) &&
fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
val *= fi->scale_factor;
}
if (fi->src->ft.face->units_per_EM == 0)
return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
@ -192,6 +216,14 @@ evas_common_font_instance_max_descent_get(RGBA_Font_Int *fi)
val = FONT_METRIC_ROUNDUP(-(int)fi->src->ft.face->size->metrics.descender);
else
val = -(int)fi->src->ft.face->bbox.yMin;
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if (FT_HAS_COLOR(fi->src->ft.face) &&
fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
val *= fi->scale_factor;
}
if (fi->src->ft.face->units_per_EM == 0)
return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
@ -244,6 +276,14 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
fi->src->current_size = fi->size;
}
val = (int)fi->src->ft.face->size->metrics.height;
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if ((fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) &&
FT_HAS_COLOR(fi->src->ft.face))
val *= fi->scale_factor;
}
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0) &&
(fi->src->ft.face->units_per_EM == 0))
@ -558,6 +598,19 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx)
fg->width = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMax - outbox.xMin);
fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin);
fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax);
if (FT_HAS_FIXED_SIZES(fi->src->ft.face))
{
if (FT_HAS_COLOR(fi->src->ft.face) &&
fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR)
{
fg->glyph->advance.x *= fi->scale_factor;
fg->glyph->advance.y *= fi->scale_factor;
fg->width *= fi->scale_factor;
fg->x_bear *= fi->scale_factor;
fg->y_bear *= fi->scale_factor;
}
}
}
fg->index = idx;

View File

@ -749,7 +749,7 @@ struct _RGBA_Draw_Context
struct {
void *(*gl_new) (void *data, RGBA_Font_Glyph *fg);
void (*gl_free) (void *ext_dat);
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y);
void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h);
void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace);
void (*gl_image_free) (void *image);
void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth);
@ -1010,6 +1010,7 @@ struct _RGBA_Font_Int
Eina_Hash *kerning;
Fash_Glyph *fash;
unsigned int size;
float scale_factor;
int real_size;
int max_h;
int references;
@ -1033,6 +1034,8 @@ struct _RGBA_Font_Int
int generation;
Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
unsigned char sizeok : 1;
unsigned char inuse : 1;
};

View File

@ -1501,10 +1501,10 @@ struct _Evas_Func
void *(*image_plane_assign) (void *data, void *image, int x, int y);
void (*image_plane_release) (void *data, void *image, void *plane);
Evas_Font_Set *(*font_load) (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend);
Evas_Font_Set *(*font_memory_load) (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend);
Evas_Font_Set *(*font_add) (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend);
Evas_Font_Set *(*font_memory_add) (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend);
Evas_Font_Set *(*font_load) (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
Evas_Font_Set *(*font_memory_load) (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
Evas_Font_Set *(*font_add) (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
Evas_Font_Set *(*font_memory_add) (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
void (*font_free) (void *engine, Evas_Font_Set *font);
int (*font_ascent_get) (void *engine, Evas_Font_Set *font);
int (*font_descent_get) (void *engine, Evas_Font_Set *font);
@ -1774,7 +1774,7 @@ void evas_font_desc_unref(Evas_Font_Description *fdesc);
int evas_font_desc_cmp(const Evas_Font_Description *a, const Evas_Font_Description *b);
Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc);
const char *evas_font_lang_normalize(const char *lang);
void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size);
void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable);
void evas_font_load_hinting_set(Evas *evas, void *font, int hinting);
void evas_object_smart_member_cache_invalidate(Evas_Object *obj, Eina_Bool pass_events, Eina_Bool freeze_events, Eina_Bool sourve_invisible);
void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b);

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_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);

View File

@ -57,7 +57,7 @@ evas_gl_font_texture_free(void *tex)
}
void
evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y)
evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y, int w, int h)
{
Evas_Engine_GL_Context *gc = context;
RGBA_Draw_Context *dc = draw_context;
@ -108,25 +108,25 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
{
int nx, ny, nw, nh;
nx = x; ny = y; nw = tex->w; nh = tex->h;
nx = x; ny = y; nw = w; nh = h;
RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
gc->dc->clip.x, gc->dc->clip.y,
gc->dc->clip.w, gc->dc->clip.h);
if ((nw < 1) || (nh < 1)) return;
if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
if ((nx == x) && (ny == y) && (nw == w) && (nh == h))
{
evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh,
x, y, tex->w, tex->h,
x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a);
return;
}
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
ssw = ((double)sw * (double)(nw)) / (double)(w);
ssh = ((double)sh * (double)(nh)) / (double)(h);
evas_gl_common_context_font_push(gc, tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
@ -138,7 +138,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh,
x, y, tex->w, tex->h,
x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a);
}
@ -147,7 +147,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
/* save out clip info */
c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->shared->w, gc->shared->h);
evas_common_draw_context_clip_clip(gc->dc, x, y, tex->w, tex->h);
evas_common_draw_context_clip_clip(gc->dc, x, y, w, h);
/* our clip is 0 size.. abort */
if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0))
{
@ -160,23 +160,23 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c
int nx, ny, nw, nh;
rct = _evas_gl_common_cutout_rects->rects + i;
nx = x; ny = y; nw = tex->w; nh = tex->h;
nx = x; ny = y; nw = w; nh = h;
RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h);
if ((nw < 1) || (nh < 1)) continue;
if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h))
if ((nx == x) && (ny == y) && (nw == w) && (nh == h))
{
evas_gl_common_context_font_push(gc, tex,
0.0, 0.0, 0.0, 0.0,
// sx, sy, sw, sh,
x, y, tex->w, tex->h,
x, y, w, h,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a);
continue;
}
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h));
ssw = ((double)sw * (double)(nw)) / (double)(tex->w);
ssh = ((double)sh * (double)(nh)) / (double)(tex->h);
ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w));
ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h));
ssw = ((double)sw * (double)(nw)) / (double)(w);
ssh = ((double)sh * (double)(nh)) / (double)(h);
evas_gl_common_context_font_push(gc, tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,

View File

@ -3192,30 +3192,33 @@ eng_image_cache_get(void *data EINA_UNUSED)
static Evas_Font_Set *
eng_font_load(void *data EINA_UNUSED, const char *name, int size,
Font_Rend_Flags wanted_rend)
Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend);
return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend, bitmap_scalable);
}
static Evas_Font_Set *
eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size,
Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
return (Evas_Font_Set *) evas_common_font_memory_load(source, name, size,
fdata, fdata_size, wanted_rend);
fdata, fdata_size, wanted_rend, bitmap_scalable);
}
static Evas_Font_Set *
eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend)
eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend,
Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
size, wanted_rend);
size, wanted_rend, bitmap_scalable);
}
static Evas_Font_Set *
eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size,
Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable)
{
return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font,
source, name, size, fdata, fdata_size, wanted_rend);
source, name, size, fdata, fdata_size, wanted_rend, bitmap_scalable);
}
static void