This commit introduced weird flicking black background with animated gif image. Can you check it?
Daniel Juyung Seo (SeoZ) On Fri, Jul 5, 2013 at 10:55 PM, Carsten Haitzler - Enlightenment Git < no-re...@enlightenment.org> wrote: > raster pushed a commit to branch master. > > commit fab94cb3eae041de6275c4423eb3744c135cfab2 > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> > Date: Fri Jul 5 23:11:18 2013 +0900 > > evas - fix gif animatd loader segv just inroduced. > --- > src/modules/evas/loaders/gif/evas_image_load_gif.c | 183 > +++++++++++++++++---- > 1 file changed, 152 insertions(+), 31 deletions(-) > > diff --git a/src/modules/evas/loaders/gif/evas_image_load_gif.c > b/src/modules/evas/loaders/gif/evas_image_load_gif.c > index ed7d89f..4eccd4e 100644 > --- a/src/modules/evas/loaders/gif/evas_image_load_gif.c > +++ b/src/modules/evas/loaders/gif/evas_image_load_gif.c > @@ -187,7 +187,7 @@ _evas_image_load_frame_image_des_info(GifFileType > *gif, Image_Entry_Frame *frame > > static Eina_Bool > _evas_image_load_frame_image_data(Eina_File *f, > - const Evas_Image_Load_Opts *opts, > + const Evas_Image_Load_Opts *opts > EINA_UNUSED, > Evas_Image_Property *prop, > Evas_Image_Animated *animated, > GifFileType *gif, Image_Entry_Frame > *frame, int *error) > @@ -198,8 +198,8 @@ _evas_image_load_frame_image_data(Eina_File *f, > DATA32 *ptr; > Gif_Frame *gif_frame = NULL; > > - double per; > - double per_inc; > +// double per; > +// double per_inc; > size_t siz; > int intoffset[] = { 0, 4, 2, 1 }; > int intjump[] = { 8, 8, 4, 2 }; > @@ -226,7 +226,9 @@ _evas_image_load_frame_image_data(Eina_File *f, > cache_h = prop->h; > > /* if user don't set scale down, default scale_ratio is 1 */ > - if (opts->scale_down_by > 1) scale_ratio = opts->scale_down_by; > + // disable scale down by until gif is handled right > + //if (opts->scale_down_by > 1) scale_ratio = opts->scale_down_by; > + > scale_w = w / scale_ratio; > scale_h = h / scale_ratio; > scale_x = x / scale_ratio; > @@ -246,7 +248,7 @@ _evas_image_load_frame_image_data(Eina_File *f, > /* alloc memory according to scaled size */ > for (i = 0; i < scale_h; i++) > { > - rows[i] = malloc(w * sizeof(GifPixelType)); > + rows[i] = malloc(scale_w * sizeof(GifPixelType)); > if (!rows[i]) > { > for (i = 0; i < scale_h; i++) > @@ -262,15 +264,15 @@ _evas_image_load_frame_image_data(Eina_File *f, > } > } > > - if (scale_ratio > 1) > - { > - tmp = malloc(w * sizeof(GifPixelType)); > - if (!tmp) > - { > - *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; > - goto error; > - } > - } > +// if (scale_ratio > 1) > +// { > +// tmp = malloc(w * sizeof(GifPixelType)); > +// if (!tmp) > +// { > +// *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; > +// goto error; > +// } > +// } > > if (gif->Image.Interlace) > { > @@ -345,8 +347,8 @@ _evas_image_load_frame_image_data(Eina_File *f, > return EINA_FALSE; > } > > - per_inc = 100.0 / (((double)w) * h); > - per = 0.0; > +// per_inc = 100.0 / (((double)w) * h); > +// per = 0.0; > cur_h = scale_h; > cur_w = scale_w; > > @@ -387,15 +389,130 @@ _evas_image_load_frame_image_data(Eina_File *f, > else > { > Gif_Frame *gif_frame2 = NULL; > + int xx, yy, xin = 0, yin = 0; > + > ptr_src = new_frame->data; > if (new_frame->info) > { > gif_frame2 = (Gif_Frame *)(new_frame->info); > + // the disposal mode of this frame > disposal = gif_frame2->frame_info.disposal; > + // background rgba color value > gif_frame->bg_val = gif_frame2->bg_val; > bg_val = gif_frame->bg_val; > - } > - switch(disposal) /* we only support disposal flag 0,1,2 */ > +#if 1 > + // clip the image desc region to be within current image > + // size and note the inset > + if (x < 0) > + { > + w += x; xin = -x; x = 0; > + } > + if ((x + w) > cache_w) > + { > + w = cache_w - x; > + } > + if (y < 0) > + { > + h += y; yin = -y; y = 0; > + } > + if ((y + h) > cache_h) > + { > + h = cache_h - y; > + } > +#define PIX(_x, _y) rows[yin + _y][xin + (_x * scale_ratio)] > +#define CMAP(_v) cmap->Colors[_v] > + switch (disposal) > + { > + case 0: // no nothing > + memset(ptr, 0, siz); > + for (yy = 0; yy < h; yy++) > + { > + ptr = frame->data; > + ptr += ((y + yy) * cache_w) + x; > + for (xx = 0; xx < w; xx++) > + { > + if (PIX(xx, yy) != alpha) > + { > + r = CMAP(PIX(xx, yy)).Red; > + g = CMAP(PIX(xx, yy)).Green; > + b = CMAP(PIX(xx, yy)).Blue; > + *ptr = ARGB_JOIN(0xff, r, g, b); > + } > + else > + *ptr = 0; > + ptr++; > + } > + } > + break; > + case 1: // leave as-is > + memcpy(ptr, ptr_src, siz); > + for (yy = 0; yy < h; yy++) > + { > + ptr = frame->data; > + ptr += ((y + yy) * cache_w) + x; > + for (xx = 0; xx < w; xx++) > + { > + if (PIX(xx, yy) != alpha) > + { > + r = CMAP(PIX(xx, yy)).Red; > + g = CMAP(PIX(xx, yy)).Green; > + b = CMAP(PIX(xx, yy)).Blue; > + *ptr = ARGB_JOIN(0xff, r, g, b); > + } > + ptr++; > + } > + } > + break; > + case 2: // restore bg > + for (yy = 0; yy < cache_h; yy++) > + { > + for (xx = 0; xx < cache_w; xx++) > + { > + *ptr = bg_val; > + ptr++; > + } > + } > + for (yy = 0; yy < h; yy++) > + { > + ptr = frame->data; > + ptr += ((y + yy) * cache_w) + x; > + for (xx = 0; xx < w; xx++) > + { > + if (PIX(xx, yy) != alpha) > + { > + r = CMAP(PIX(xx, yy)).Red; > + g = CMAP(PIX(xx, yy)).Green; > + b = CMAP(PIX(xx, yy)).Blue; > + *ptr = ARGB_JOIN(0xff, r, g, b); > + } > + ptr++; > + } > + } > + break; > + case 3: // previous image > + memcpy(ptr, ptr_src, siz); > + for (yy = 0; yy < h; yy++) > + { > + ptr = frame->data; > + ptr += ((y + yy) * cache_w) + x; > + for (xx = 0; xx < w; xx++) > + { > + if (PIX(xx, yy) != alpha) > + { > + r = CMAP(PIX(xx, yy)).Red; > + g = CMAP(PIX(xx, yy)).Green; > + b = CMAP(PIX(xx, yy)).Blue; > + *ptr = ARGB_JOIN(0xff, r, g, b); > + } > + ptr++; > + } > + } > + break; > + default: > + break; > + } > +#else > + switch (disposal) /* we only support disposal flag 0,1,2 */ > { > case 1: /* Do not dispose. need previous frame*/ > memcpy(ptr, ptr_src, siz); > @@ -409,7 +526,7 @@ _evas_image_load_frame_image_data(Eina_File *f, > { > if (rows[i][j * scale_ratio] == alpha) > { > - ptr++ ; > + ptr++; > } > else > { > @@ -453,7 +570,7 @@ _evas_image_load_frame_image_data(Eina_File *f, > { > if (rows[i][j * scale_ratio] == > alpha) > { > - ptr++ ; > + ptr++; > } > else > { > @@ -467,14 +584,15 @@ _evas_image_load_frame_image_data(Eina_File *f, > } > } > break; > + case 3: /* Restore previous */ > case 0: /* No disposal specified */ > default: > memset(ptr, 0, siz); > - for (i = 0; i < cache_h; i++) > + for (i = 0; i < gif_frame2->image_des.h; i++) > { > if ((i < scale_y) || (i >= (scale_y + cur_h))) > { > - for (j = 0; j < cache_w; j++) > + for (j = 0; j < gif_frame2->image_des.w; j++) > { > *ptr = bg_val; > ptr++; > @@ -485,7 +603,7 @@ _evas_image_load_frame_image_data(Eina_File *f, > int i1, j1; > i1 = i - scale_y; > > - for (j = 0; j < cache_w; j++) > + for (j = 0; j < gif_frame2->image_des.w; j++) > { > j1 = j - scale_x; > if ((j < scale_x) || (j >= (scale_x + > cur_w))) > @@ -497,7 +615,7 @@ _evas_image_load_frame_image_data(Eina_File *f, > { > if (rows[i][j * scale_ratio] == > alpha) > { > - ptr++ ; > + ptr++; > } > else > { > @@ -512,6 +630,8 @@ _evas_image_load_frame_image_data(Eina_File *f, > } > break; > } > +#endif > + } > } > } > else /* first frame decoding */ > @@ -711,7 +831,7 @@ evas_image_load_file_head_gif(void *loader_data, > int *error) > { > Evas_Loader_Internal *loader = loader_data; > - Evas_Image_Load_Opts *load_opts; > +// Evas_Image_Load_Opts *load_opts; > Evas_Image_Animated *animated; > Eina_File *f; > > @@ -726,7 +846,7 @@ evas_image_load_file_head_gif(void *loader_data, > int image_count = 0; > > f = loader->f; > - load_opts = loader->opts; > +// load_opts = loader->opts; > animated = loader->animated; > > prop->w = 0; > @@ -757,11 +877,12 @@ evas_image_load_file_head_gif(void *loader_data, > prop->w = gif->SWidth; > prop->h = gif->SHeight; > /* support scale down feture in gif*/ > - if (load_opts->scale_down_by > 1) > - { > - prop->w /= load_opts->scale_down_by; > - prop->h /= load_opts->scale_down_by; > - } > +// disable scale down for gif until gif is handled right > +// if (load_opts->scale_down_by > 1) > +// { > +// prop->w /= load_opts->scale_down_by; > +// prop->h /= load_opts->scale_down_by; > +// } > > if ((prop->w < 1) || (prop->h < 1) || > (prop->w > IMG_MAX_SIZE) || (prop->h > IMG_MAX_SIZE) || > > -- > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Windows: > > Build for Windows Store. > > http://p.sf.net/sfu/windows-dev2dev > ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel