diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index e6f2bdebd5..8b97c19399 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -294,7 +294,8 @@ struct _RGBA_Font_Int Eina_Hash *kerning; Fash_Glyph *fash; unsigned int size; - float scale_factor; + double scale_factor; + Eina_Bool is_resized; int real_size; int max_h; int references; diff --git a/src/lib/evas/common/evas_font_draw.c b/src/lib/evas/common/evas_font_draw.c index 3a8f633bfd..241f772f49 100644 --- a/src/lib/evas/common/evas_font_draw.c +++ b/src/lib/evas/common/evas_font_draw.c @@ -105,8 +105,12 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, 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->fi->is_resized ) + { + w *= fg->fi->scale_factor; + h *= fg->fi->scale_factor; + } + } } diff --git a/src/lib/evas/common/evas_font_load.c b/src/lib/evas/common/evas_font_load.c index 3aa2070499..4aa6901257 100644 --- a/src/lib/evas/common/evas_font_load.c +++ b/src/lib/evas/common/evas_font_load.c @@ -460,9 +460,14 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) { if (fi->real_size > 0) - fi->scale_factor = (float)fi->size * 64.0 / (float)fi->real_size; + { + fi->scale_factor = (double)fi->size * 64.0 / (double)fi->real_size; + fi->is_resized = EINA_FALSE; + if ((fi->scale_factor <= 0.9) && (fi->scale_factor != 0)) + fi->is_resized = EINA_TRUE; + } else - fi->scale_factor = (float)64.0; + fi->scale_factor = 64.0; } } } diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c index c41e350dcf..799f8a89d0 100644 --- a/src/lib/evas/common/evas_font_main.c +++ b/src/lib/evas/common/evas_font_main.c @@ -857,6 +857,41 @@ evas_common_font_int_cache_glyph_render(RGBA_Font_Glyph *fg) { fg->glyph_out->rle = NULL; fg->glyph_out->bitmap.rle_alloc = EINA_FALSE; + if (fi->is_resized) + { + int w = fbg->bitmap.width; + int h = fbg->bitmap.rows; + + RGBA_Image src = {0}; + src.image.data = (DATA32 *) fbg->bitmap.buffer; + src.cache_entry.w = w; + src.cache_entry.h = h; + src.cache_entry.flags.alpha = 1; + + RGBA_Image dst = {0}; + dst.cache_entry.w = w * fi->scale_factor; + dst.cache_entry.h = h * fi->scale_factor; + dst.image.data = malloc(dst.cache_entry.w * dst.cache_entry.h * 4); + dst.cache_entry.flags.alpha = 1; + + evas_common_scale_rgba_smooth_draw(&src, &dst, + 0, 0, src.cache_entry.w , src.cache_entry.h, + 0xffffffff, EVAS_RENDER_COPY, + 0, 0, src.cache_entry.w , src.cache_entry.h, + 0, 0, dst.cache_entry.w, dst.cache_entry.h, + NULL, 0, 0); + + fg->glyph_out->bitmap.rows = dst.cache_entry.h; + fg->glyph_out->bitmap.width = dst.cache_entry.w; + fg->glyph_out->bitmap.buffer = (unsigned char *) dst.image.data; + fg->glyph_out->bitmap.pitch = dst.cache_entry.w * 4; + + fg->glyph_out->rle = NULL; + fg->glyph_out->bitmap.rle_alloc = EINA_TRUE; + // this may be technically incorrect as we go and free a bitmap buffer + // behind the ftglyph's back... + FT_Bitmap_Done(evas_ft_lib, &(fbg->bitmap)); + } } return EINA_TRUE;