From e1fea940e4c642b1c883429ed5f2a69d51b84270 Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Sun, 18 Apr 2021 13:05:33 +0200
Subject: Fixed some memory leaks

---
 libs/libgui/gfx.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

(limited to 'libs/libgui/gfx.c')

diff --git a/libs/libgui/gfx.c b/libs/libgui/gfx.c
index db09d21..c26f59a 100644
--- a/libs/libgui/gfx.c
+++ b/libs/libgui/gfx.c
@@ -59,6 +59,16 @@ static void load_font(enum font_type font_type)
 	assert(fonts[font_type]);
 }
 
+static void free_fonts(void)
+{
+	for (u8 i = 0; i < FONT_COUNT; i++) {
+		if (fonts[i]) {
+			free(fonts[i]->raw);
+			free(fonts[i]);
+		}
+	}
+}
+
 static void write_char(struct context *ctx, vec2 pos, struct font *font, u32 c, char ch)
 {
 	int bypp = ctx->bpp >> 3;
@@ -107,8 +117,14 @@ struct context *gfx_new_ctx(struct context *ctx, vec2 size, u8 bpp)
 }
 
 // On-demand font loading
+static u8 fonts_loaded = 0;
 struct font *gfx_resolve_font(enum font_type font_type)
 {
+	if (!fonts_loaded) {
+		fonts_loaded = 1;
+		atexit(free_fonts);
+	}
+
 	if (!fonts[font_type])
 		load_font(font_type);
 	return fonts[font_type];
@@ -187,6 +203,7 @@ void gfx_load_image_filter(struct context *ctx, vec2 pos, enum gfx_filter filter
 		srcfb += bmp.pitch - diff;
 		destfb += ctx->pitch - diff;
 	}
+	free(bmp.data);
 }
 
 void gfx_load_image(struct context *ctx, vec2 pos, const char *path)
-- 
cgit v1.2.3