From 4b6fe57ade7241d3189af849da4a15623917a532 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Wed, 21 Aug 2019 00:30:23 +0100 Subject: [PATCH] evas - font rendering - dont crash if we have color fonts and gl and sw so if you use sw and gl enignes in a process and have color font glyphs.. *BOOM* because the color glyph code used ext dat that was intended for engines to extend with a gotcha of "only 1 engine can extend this"... commented already. so this unfortunately adds an extra ptr per glyph to store color data explicitly. but now it both renders right and doesn't crash. we still have a limit of 1 engine alone can extend glyphs with ext_dat though. @fix --- src/lib/evas/common/evas_font.h | 1 + src/lib/evas/common/evas_font_draw.c | 26 +++++++++++--------------- src/lib/evas/common/evas_font_load.c | 3 +++ src/lib/evas/common/evas_font_main.c | 1 + 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index ab6e6fbd17..e16785520d 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -315,6 +315,7 @@ struct _RGBA_Font_Glyph Evas_Coord y_bear; FT_Glyph glyph; RGBA_Font_Glyph_Out *glyph_out; + void *col_dat; /* this is a problem - only 1 engine at a time can extend such a font... grrr */ void *ext_dat; void (*ext_dat_free) (void *ext_dat); diff --git a/src/lib/evas/common/evas_font_draw.c b/src/lib/evas/common/evas_font_draw.c index df39438ca2..f6aa4d5424 100644 --- a/src/lib/evas/common/evas_font_draw.c +++ b/src/lib/evas/common/evas_font_draw.c @@ -35,12 +35,6 @@ _evas_font_image_new(RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace) return evas_cache_image_data(evas_common_image_cache_get(), src_w, src_h, image_data, alpha, cspace); } -static void -_evas_font_image_free(void *image) -{ - evas_cache_image_drop(image); -} - static void _evas_font_image_draw(void *context, void *surface, void *image, RGBA_Font_Glyph *fg, int x, int y, int w, int h, int smooth) { @@ -123,19 +117,21 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, fg->ext_dat_free = dc->font_ext.func.gl_free; } - if ((!fg->ext_dat) && FT_HAS_COLOR(fg->fi->src->ft.face)) + if (dc->font_ext.func.gl_image_new) { - if (dc->font_ext.func.gl_image_new) + if ((!fg->ext_dat) && FT_HAS_COLOR(fg->fi->src->ft.face)) { /* extension calls */ fg->ext_dat = dc->font_ext.func.gl_image_new (dc->font_ext.data, fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888); fg->ext_dat_free = dc->font_ext.func.gl_image_free; } - else + } + else + { + if ((!fg->col_dat) && FT_HAS_COLOR(fg->fi->src->ft.face)) { - fg->ext_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888); - fg->ext_dat_free = _evas_font_image_free; + fg->col_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888); } } @@ -158,15 +154,15 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, ext_x, ext_y, ext_w, ext_h); } - else if ((fg->ext_dat) && FT_HAS_COLOR(fg->fi->src->ft.face)) + else if (FT_HAS_COLOR(fg->fi->src->ft.face)) { - if (dc->font_ext.func.gl_image_draw) + if ((fg->ext_dat) && (dc->font_ext.func.gl_image_draw)) dc->font_ext.func.gl_image_draw (dc->font_ext.data, fg->ext_dat, chr_x, y - (chr_y - y), w, h, EINA_TRUE); - else + else if (fg->col_dat) _evas_font_image_draw - (dc, dst, fg->ext_dat, fg, + (dc, dst, fg->col_dat, fg, chr_x, y - (chr_y - y), w, h, EINA_TRUE); } } diff --git a/src/lib/evas/common/evas_font_load.c b/src/lib/evas/common/evas_font_load.c index 15d1017b1f..f2011bd72f 100644 --- a/src/lib/evas/common/evas_font_load.c +++ b/src/lib/evas/common/evas_font_load.c @@ -2,6 +2,7 @@ # include "config.h" #endif +#include "evas_common_private.h" #include #include "evas_font_ot.h" @@ -996,6 +997,8 @@ _font_int_ext_clear(RGBA_Font_Int *fi) fg->ext_dat = NULL; fg->ext_dat_free = NULL; } + if (fg->col_dat) evas_cache_image_drop(fg->col_dat); + fg->col_dat = NULL; } } } diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c index b99df9a927..1a163748ca 100644 --- a/src/lib/evas/common/evas_font_main.c +++ b/src/lib/evas/common/evas_font_main.c @@ -435,6 +435,7 @@ _glyph_free(RGBA_Font_Glyph *fg) FT_Done_Glyph(fg->glyph); /* extension calls */ if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat); + if (fg->col_dat) evas_cache_image_drop(fg->col_dat); free(fg); }