summaryrefslogtreecommitdiff
path: root/render/image.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-02-13 21:30:18 -0500
committerDana Jansens <danakj@orodu.net>2008-02-14 15:10:14 -0500
commit66a897d9b24682e9d243e4d452800b8a5c1237f6 (patch)
tree213b6cd38226acc3486ffeb7ae90fcb7833e5c1b /render/image.c
parente7a86f5fe47906ef845af83fc419dc540cf19daf (diff)
don't reference free'd memory, and don't leak memory if the image cache is not saving any resized pictures
Diffstat (limited to 'render/image.c')
-rw-r--r--render/image.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/render/image.c b/render/image.c
index d0633d94..c7452fce 100644
--- a/render/image.c
+++ b/render/image.c
@@ -40,6 +40,14 @@ void RrImagePicInit(RrImagePic *pic, gint w, gint h, RrPixel32 *data)
pic->sum += *(data++);
}
+static void RrImagePicFree(RrImagePic *pic)
+{
+ if (pic) {
+ g_free(pic->data);
+ g_free(pic);
+ }
+}
+
/*! Add a picture to an Image, that is, add another copy of the image at
another size. This may add it to the "originals" list or to the
"resized" list. */
@@ -91,9 +99,8 @@ static void RemovePicture(RrImage *self, RrImagePic ***list,
/* remove the picture as a key in the cache */
g_hash_table_remove(self->cache->table, (*list)[i]);
- /* free the picture (and its rgba data) */
- g_free((*list)[i]);
- g_free((*list)[i]->data);
+ /* free the picture */
+ RrImagePicFree((*list)[i]);
/* shift everything down one */
for (j = i; j < *len-1; ++j)
(*list)[j] = (*list)[j+1];
@@ -385,9 +392,11 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
gint i, min_diff, min_i, min_aspect_diff, min_aspect_i;
RrImage *self;
RrImagePic *pic;
+ gboolean free_pic;
self = img->image;
pic = NULL;
+ free_pic = FALSE;
/* is there an original of this size? (only w or h has to be right cuz
we maintain aspect ratios) */
@@ -474,6 +483,8 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
if (self->cache->max_resized_saved)
/* add it to the top of the resized list */
AddPicture(self, &self->resized, &self->n_resized, pic);
+ else
+ free_pic = TRUE; /* don't leak mem! */
}
g_assert(pic != NULL);
@@ -481,4 +492,6 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
DrawRGBA(target, target_w, target_h,
pic->data, pic->width, pic->height,
img->alpha, area);
+ if (free_pic)
+ RrImagePicFree(pic);
}