From b132ce65ec755e282291f4fa8da46eafcc2af942 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 1 Apr 2016 17:37:37 +0900 Subject: [PATCH] evas - fix leak because cutouts_fre .. doesnt free - it just resets to 0 this works with 7166e6b85994b19a29f05c9e2b6d75a314a3cb91 and fixes a leak added because ... free does not free! evas_common_draw_context_cutouts_real_free(0 now actually frees the rects, but evas_common_draw_context_cutouts_free() before did not. @fix (follow on from 7166e6b85994b19a29f05c9e2b6d75a314a3cb91) --- src/lib/evas/common/evas_draw.h | 1 + src/lib/evas/common/evas_draw_main.c | 8 ++++++++ src/lib/evas/common/evas_font_draw.c | 5 +++-- src/lib/evas/common/evas_map_image.c | 10 ++++++---- src/lib/evas/common/evas_rectangle_main.c | 5 +++-- src/lib/evas/common/evas_scale_main.c | 5 +++-- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/lib/evas/common/evas_draw.h b/src/lib/evas/common/evas_draw.h index 0beb84cf79..0623ea4662 100644 --- a/src/lib/evas/common/evas_draw.h +++ b/src/lib/evas/common/evas_draw.h @@ -23,6 +23,7 @@ EAPI void evas_common_draw_context_set_multiplier (RGBA_D EAPI void evas_common_draw_context_unset_multiplier (RGBA_Draw_Context *dc); EAPI Cutout_Rects *evas_common_draw_context_cutouts_new (void); EAPI void evas_common_draw_context_cutouts_free (Cutout_Rects* rects); +EAPI void evas_common_draw_context_cutouts_real_free (Cutout_Rects* rects); EAPI void evas_common_draw_context_cutouts_del (Cutout_Rects* rects, int idx); EAPI void evas_common_draw_context_add_cutout (RGBA_Draw_Context *dc, int x, int y, int w, int h); EAPI void evas_common_draw_context_clear_cutouts (RGBA_Draw_Context *dc); diff --git a/src/lib/evas/common/evas_draw_main.c b/src/lib/evas/common/evas_draw_main.c index 460a2967d1..289d6dfdb4 100644 --- a/src/lib/evas/common/evas_draw_main.c +++ b/src/lib/evas/common/evas_draw_main.c @@ -35,6 +35,14 @@ evas_common_draw_context_cutouts_free(Cutout_Rects* rects) rects->last_add.w = 0; } +EAPI void +evas_common_draw_context_cutouts_real_free(Cutout_Rects* rects) +{ + if (!rects) return; + free(rects->rects); + free(rects); +} + EAPI void evas_common_draw_context_cutouts_del(Cutout_Rects* rects, int idx) { diff --git a/src/lib/evas/common/evas_font_draw.c b/src/lib/evas/common/evas_font_draw.c index c61e92190c..79c8900c34 100644 --- a/src/lib/evas/common/evas_font_draw.c +++ b/src/lib/evas/common/evas_font_draw.c @@ -421,11 +421,12 @@ evas_common_font_draw_cb(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, E rects_used++; if (rects_used >= 4096) { - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); rects = NULL; + rects_used = 0; } #else - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); #endif } dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; diff --git a/src/lib/evas/common/evas_map_image.c b/src/lib/evas/common/evas_map_image.c index f5b1a32101..252bd3ba58 100644 --- a/src/lib/evas/common/evas_map_image.c +++ b/src/lib/evas/common/evas_map_image.c @@ -793,11 +793,12 @@ evas_common_map_rgba_cb(RGBA_Image *src, RGBA_Image *dst, rects_used++; if (rects_used >= 4096) { - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); rects = NULL; + rects_used = 0; } #else - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); #endif /* restore clip info */ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; @@ -857,11 +858,12 @@ evas_common_map_thread_rgba_cb(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Conte rects_used++; if (rects_used >= 4096) { - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); rects = NULL; + rects_used = 0; } #else - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); #endif /* restore clip info */ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; diff --git a/src/lib/evas/common/evas_rectangle_main.c b/src/lib/evas/common/evas_rectangle_main.c index 388fba663a..ed78cca58e 100644 --- a/src/lib/evas/common/evas_rectangle_main.c +++ b/src/lib/evas/common/evas_rectangle_main.c @@ -51,11 +51,12 @@ evas_common_rectangle_draw_cb(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int rects_used++; if (rects_used >= 4096) { - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); rects = NULL; + rects_used = 0; } #else - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); #endif } } diff --git a/src/lib/evas/common/evas_scale_main.c b/src/lib/evas/common/evas_scale_main.c index 6c8a262588..a09f0c6805 100644 --- a/src/lib/evas/common/evas_scale_main.c +++ b/src/lib/evas/common/evas_scale_main.c @@ -89,11 +89,12 @@ evas_common_scale_rgba_in_to_out_clip_cb(RGBA_Image *src, RGBA_Image *dst, rects_used++; if (rects_used >= 4096) { - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); rects = NULL; + rects_used = 0; } #else - evas_common_draw_context_cutouts_free(rects); + evas_common_draw_context_cutouts_real_free(rects); #endif /* restore clip info */ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;