forked from enlightenment/efl
evas: fix bugs in gif image loader
gif's logical screen size (which is considered the image size) might be different from the size of each frame. when decoding a frame, the width and height of the decoded data should be based on the size of the frame, not on the size of the logical screen size. if a frame is decoded into a buffer of screen size, this might happen (frame = 6 X 3, logical screen = 5 X 3) OOOXXX OOOXX OOOXXX => XOOOX OOOXXX XXOOO @fix
This commit is contained in:
parent
243e8a678b
commit
95d83e8040
|
@ -209,7 +209,8 @@ _new_frame(Evas_Image_Animated *animated,
|
||||||
// data pointer
|
// data pointer
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_decode_image(GifFileType *gif, DATA32 *data, int rowpix, int xin, int yin,
|
_decode_image(GifFileType *gif, DATA32 *data, int rowpix, int xin, int yin,
|
||||||
int transparent, int x, int y, int w, int h, Eina_Bool fill)
|
int transparent, int fw, int fh,
|
||||||
|
int x, int y, int w, int h, Eina_Bool fill)
|
||||||
{
|
{
|
||||||
int intoffset[] = { 0, 4, 2, 1 };
|
int intoffset[] = { 0, 4, 2, 1 };
|
||||||
int intjump[] = { 8, 8, 4, 2 };
|
int intjump[] = { 8, 8, 4, 2 };
|
||||||
|
@ -224,14 +225,14 @@ _decode_image(GifFileType *gif, DATA32 *data, int rowpix, int xin, int yin,
|
||||||
|
|
||||||
// build a blob of memory to have pointers to rows of pixels
|
// build a blob of memory to have pointers to rows of pixels
|
||||||
// AND store the decoded gif pixels (1 byte per pixel) as welll
|
// AND store the decoded gif pixels (1 byte per pixel) as welll
|
||||||
rows = malloc((h * sizeof(GifRowType)) + (w * h * sizeof(GifPixelType)));
|
rows = malloc((fh * sizeof(GifRowType)) + (fw * fh * sizeof(GifPixelType)));
|
||||||
if (!rows) goto on_error;
|
if (!rows) goto on_error;
|
||||||
|
|
||||||
// fill in the pointers at the start
|
// fill in the pointers at the start
|
||||||
for (yy = 0; yy < h; yy++)
|
for (yy = 0; yy < fh; yy++)
|
||||||
{
|
{
|
||||||
rows[yy] = ((unsigned char *)rows) + (h * sizeof(GifRowType)) +
|
rows[yy] = ((unsigned char *)rows) + (fh * sizeof(GifRowType)) +
|
||||||
(yy * w * sizeof(GifPixelType));
|
(yy * fw * sizeof(GifPixelType));
|
||||||
}
|
}
|
||||||
|
|
||||||
// if give is interlaced, walk interlace pattern and decode into rows
|
// if give is interlaced, walk interlace pattern and decode into rows
|
||||||
|
@ -239,9 +240,9 @@ _decode_image(GifFileType *gif, DATA32 *data, int rowpix, int xin, int yin,
|
||||||
{
|
{
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
for (yy = intoffset[i]; yy < h; yy += intjump[i])
|
for (yy = intoffset[i]; yy < fh; yy += intjump[i])
|
||||||
{
|
{
|
||||||
if (DGifGetLine(gif, rows[yy], w) != GIF_OK)
|
if (DGifGetLine(gif, rows[yy], fw) != GIF_OK)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,9 +250,9 @@ _decode_image(GifFileType *gif, DATA32 *data, int rowpix, int xin, int yin,
|
||||||
// normal top to bottom - decode into rows
|
// normal top to bottom - decode into rows
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (yy = 0; yy < h; yy++)
|
for (yy = 0; yy < fh; yy++)
|
||||||
{
|
{
|
||||||
if (DGifGetLine(gif, rows[yy], w) != GIF_OK)
|
if (DGifGetLine(gif, rows[yy], fw) != GIF_OK)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -745,6 +746,7 @@ open_file:
|
||||||
&x, &y, &w, &h);
|
&x, &y, &w, &h);
|
||||||
if (!_decode_image(gif, thisframe->data, prop->w,
|
if (!_decode_image(gif, thisframe->data, prop->w,
|
||||||
xin, yin, finfo->transparent,
|
xin, yin, finfo->transparent,
|
||||||
|
finfo->w, finfo->h,
|
||||||
x, y, w, h, first))
|
x, y, w, h, first))
|
||||||
LOADERR(EVAS_LOAD_ERROR_CORRUPT_FILE);
|
LOADERR(EVAS_LOAD_ERROR_CORRUPT_FILE);
|
||||||
// mark as loaded and done
|
// mark as loaded and done
|
||||||
|
@ -772,6 +774,7 @@ open_file:
|
||||||
// and decode the gif with overwriting
|
// and decode the gif with overwriting
|
||||||
if (!_decode_image(gif, pixels, prop->w,
|
if (!_decode_image(gif, pixels, prop->w,
|
||||||
xin, yin, finfo->transparent,
|
xin, yin, finfo->transparent,
|
||||||
|
finfo->w, finfo->h,
|
||||||
x, y, w, h, EINA_TRUE))
|
x, y, w, h, EINA_TRUE))
|
||||||
LOADERR(EVAS_LOAD_ERROR_CORRUPT_FILE);
|
LOADERR(EVAS_LOAD_ERROR_CORRUPT_FILE);
|
||||||
// mark as loaded and done
|
// mark as loaded and done
|
||||||
|
|
Loading…
Reference in New Issue