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
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]]
+ }
+ }
}
}
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; }
Evas_Font_Set *font;
int ref;
Font_Rend_Flags wanted_rend;
+ Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
#ifdef HAVE_FONTCONFIG
FcFontSet *set;
#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;
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;
}
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
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++;
#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
#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
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!!! */
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);
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;
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;
}
}
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;
}
}
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);
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);
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;
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;
}
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;
}
}
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
{
- 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
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
Evas_Font_Size size;
Evas_Text_Style_Type style;
+ Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev;
struct {
return o->cur.source;
}
-EOLIAN static void
-_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size)
+static void
+_evas_text_font_reload(Eo *eo_obj, Evas_Text_Data *o)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE;
- Evas_Font_Description *fdesc;
Eina_List *was = NULL;
- if ((!font) || (size <= 0)) return;
-
- evas_object_async_block(obj);
- if ((size == o->cur.size) &&
- (o->cur.font && !strcmp(font, o->cur.font))) return;
-
- /* We can't assume the given font is same with current fdesc by comparing string.
- Since Evas starts to supporting "auto" for language,
- the given font string should be parsed once before comparing it. */
- fdesc = evas_font_desc_new();
-
- /* Set default language according to locale. */
- eina_stringshare_replace(&(fdesc->lang), evas_font_lang_normalize("auto"));
- evas_font_name_parse(fdesc, font);
-
- if (o->cur.fdesc && !evas_font_desc_cmp(fdesc, o->cur.fdesc) &&
- (size == o->cur.size))
- {
- evas_font_desc_unref(fdesc);
- return;
- }
-
- if (o->cur.fdesc) evas_font_desc_unref(o->cur.fdesc);
- o->cur.fdesc = fdesc;
-
- o->cur.size = size;
- eina_stringshare_replace(&o->cur.font, font);
- o->prev.font = NULL;
-
if (!(obj->layer->evas->is_frozen))
{
pass = evas_event_passes_through(eo_obj, obj);
}
o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source,
- (int)(((double) o->cur.size) * obj->cur->scale));
+ (int)(((double) o->cur.size) * obj->cur->scale), o->cur.bitmap_scalable);
{
o->ascent = 0;
o->descent = 0;
}
EOLIAN static void
+_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size)
+{
+ Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Font_Description *fdesc;
+
+ if ((!font) || (size <= 0)) return;
+
+ evas_object_async_block(obj);
+ if ((size == o->cur.size) &&
+ (o->cur.font && !strcmp(font, o->cur.font))) return;
+
+ /* We can't assume the given font is same with current fdesc by comparing string.
+ Since Evas starts to supporting "auto" for language,
+ the given font string should be parsed once before comparing it. */
+ fdesc = evas_font_desc_new();
+
+ /* Set default language according to locale. */
+ eina_stringshare_replace(&(fdesc->lang), evas_font_lang_normalize("auto"));
+ evas_font_name_parse(fdesc, font);
+
+ if (o->cur.fdesc && !evas_font_desc_cmp(fdesc, o->cur.fdesc) &&
+ (size == o->cur.size))
+ {
+ evas_font_desc_unref(fdesc);
+ return;
+ }
+
+ if (o->cur.fdesc) evas_font_desc_unref(o->cur.fdesc);
+ o->cur.fdesc = fdesc;
+
+ o->cur.size = size;
+ eina_stringshare_replace(&o->cur.font, font);
+ o->prev.font = NULL;
+
+ _evas_text_font_reload(eo_obj, o);
+}
+
+EOLIAN static void
_evas_text_efl_text_properties_font_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o, const char **font, Evas_Font_Size *size)
{
if (font) *font = o->cur.font;
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();
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)
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 {
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;
/* 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)
{
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))
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))
{
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);
}
_FMT(linerelgap) = 0.0;
_FMT(password) = 1;
_FMT(ellipsis) = -1;
+ _FMT_INFO(bitmap_scalable) = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR;
return eo_obj;
}
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. */
Eina_Array palette_standard;
Eina_Array palette_extended;
+ Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
} cur, prev;
int ascent;
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);
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 };
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;
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))
{
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 };
}
EOLIAN static void
+_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
+ Evas_Textgrid_Data *o,
+ const char *font_name,
+ Evas_Font_Size font_size)
+{
+ Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Font_Description *fdesc;
+
+ if ((!font_name) || (!*font_name) || (font_size <= 0))
+ return;
+
+ evas_object_async_block(obj);
+ fdesc = evas_font_desc_new();
+ /* Set default language according to locale. */
+ eina_stringshare_replace(&(fdesc->lang),
+ evas_font_lang_normalize("auto"));
+ evas_font_name_parse(fdesc, font_name);
+ if (o->cur.font_description_normal &&
+ !evas_font_desc_cmp(fdesc, o->cur.font_description_normal) &&
+ (font_size == o->cur.font_size))
+ {
+ evas_font_desc_unref(fdesc);
+ return;
+ }
+
+ if (o->cur.font_description_normal)
+ evas_font_desc_unref(o->cur.font_description_normal);
+ o->cur.font_description_normal = fdesc;
+
+ o->cur.font_size = font_size;
+ eina_stringshare_replace(&o->cur.font_name, font_name);
+ o->prev.font_name = NULL;
+
+ _evas_textgrid_font_reload(eo_obj, o);
+}
+
+EOLIAN static void
_evas_textgrid_efl_text_properties_font_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, const char **font_name, Evas_Font_Size *font_size)
{
if (font_name) *font_name = o->cur.font_name;
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)
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;
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;
/* 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;
Efl.Object.destructor;
Efl.Text.Properties.font { get; set; }
Efl.Text.Properties.font_source { get; set; }
+ Efl.Text.Font.font_bitmap_scalable { get; set; }
}
}
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));
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))
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);
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);
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) ||
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
}
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
}
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))
#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();
}
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 */
}
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;
}
}
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);
}
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);
}
}
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);
}
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;
}
}
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);
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);
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;
}
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
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);
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)
}
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)
// 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)
}
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);
}
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);
}
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;
}
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;
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)
{
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)
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;
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;
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;
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))
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;
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);
Eina_Hash *kerning;
Fash_Glyph *fash;
unsigned int size;
+ float scale_factor;
int real_size;
int max_h;
int references;
int generation;
+ Efl_Text_Font_Bitmap_Scalable bitmap_scalable;
+
unsigned char sizeok : 1;
unsigned char inuse : 1;
};
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);
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);
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);
}
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;
{
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,
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);
}
/* 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))
{
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,
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