summaryrefslogtreecommitdiffstats
path: root/apps/plugins/imageviewer/gif/gif_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/imageviewer/gif/gif_decoder.c')
-rw-r--r--apps/plugins/imageviewer/gif/gif_decoder.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/apps/plugins/imageviewer/gif/gif_decoder.c b/apps/plugins/imageviewer/gif/gif_decoder.c
index f57eab1cf1..a1fda43a46 100644
--- a/apps/plugins/imageviewer/gif/gif_decoder.c
+++ b/apps/plugins/imageviewer/gif/gif_decoder.c
@@ -115,6 +115,11 @@ void gif_decoder_init(struct gif_decoder *d, void *mem, size_t size)
init_memory_pool(d->mem_size, d->mem);
}
+void gif_decoder_destroy_memory_pool(struct gif_decoder *d)
+{
+ destroy_memory_pool(d->mem);
+}
+
void gif_open(char *filename, struct gif_decoder *d)
{
if ((GifFile = DGifOpenFileName(filename, &d->error)) == NULL)
@@ -181,6 +186,7 @@ void gif_decode(struct gif_decoder *d,
{
/* error allocating temp space */
d->error = D_GIF_ERR_NOT_ENOUGH_MEM;
+ DGifCloseFile(GifFile);
return;
}
@@ -196,7 +202,7 @@ void gif_decode(struct gif_decoder *d,
if (pixels_buffer[0] == NULL)
{
d->error = D_GIF_ERR_NOT_ENOUGH_MEM;
- return;
+ goto free_and_return;
}
/* Global background color */
@@ -215,7 +221,7 @@ void gif_decode(struct gif_decoder *d,
if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
switch (RecordType)
@@ -225,7 +231,7 @@ void gif_decode(struct gif_decoder *d,
if (DGifGetImageDesc(GifFile) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
/* Image Position relative to canvas */
@@ -239,7 +245,7 @@ void gif_decode(struct gif_decoder *d,
GifFile->SColorMap == NULL)
{
d->error = D_GIF_ERR_NO_COLOR_MAP;
- return;
+ goto free_and_return;
}
/* sanity check */
@@ -247,7 +253,7 @@ void gif_decode(struct gif_decoder *d,
GifFile->Image.Top+GifFile->Image.Height>GifFile->SHeight)
{
d->error = D_GIF_ERR_DATA_TOO_BIG;
- return;
+ goto free_and_return;
}
if (GifFile->Image.GCB &&
@@ -275,7 +281,7 @@ void gif_decode(struct gif_decoder *d,
if (DGifGetLine(GifFile, Line, Width) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
gif2pixels(Line, pixels_buffer[buf_idx],
@@ -294,14 +300,14 @@ void gif_decode(struct gif_decoder *d,
if (DGifGetLine(GifFile, Line, Width) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
gif2pixels(Line, pixels_buffer[buf_idx],
Row + i, Col, Width);
if (pf_progress != NULL)
- pf_progress(25*(i+1), 100);
+ pf_progress((i+1), Height);
}
}
@@ -310,7 +316,7 @@ void gif_decode(struct gif_decoder *d,
if (out == NULL)
{
d->error = D_GIF_ERR_NOT_ENOUGH_MEM;
- return;
+ goto free_and_return;
}
bm.data = out + d->native_img_size*d->frames_count;
@@ -350,7 +356,7 @@ void gif_decode(struct gif_decoder *d,
GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
if (ExtCode == GRAPHICS_EXT_FUNC_CODE)
@@ -364,7 +370,7 @@ void gif_decode(struct gif_decoder *d,
GifFile->Image.GCB) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
d->delay = GifFile->Image.GCB->DelayTime;
}
@@ -375,7 +381,7 @@ void gif_decode(struct gif_decoder *d,
if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR)
{
d->error = GifFile->Error;
- return;
+ goto free_and_return;
}
}
break;
@@ -391,6 +397,10 @@ void gif_decode(struct gif_decoder *d,
if (DGifCloseFile(GifFile) == GIF_ERROR)
{
d->error = GifFile->Error;
+ free(pixels_buffer[0]);
+ if (pixels_buffer[1])
+ free(pixels_buffer[1]);
+ free(Line);
return;
}
@@ -472,4 +482,15 @@ void gif_decode(struct gif_decoder *d,
}
}
#endif
+ return;
+
+free_and_return:
+ if (Line)
+ free(Line);
+ if (pixels_buffer[0])
+ free(pixels_buffer[0]);
+ if (pixels_buffer[1])
+ free(pixels_buffer[1]);
+ DGifCloseFile(GifFile);
+ return;
}