On Sat, 6 Jul 2013 13:47:03 +0900 Daniel Juyung Seo <[email protected]> said:

update.

> 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 <
> [email protected]> wrote:
> 
> > raster pushed a commit to branch master.
> >
> > commit fab94cb3eae041de6275c4423eb3744c135cfab2
> > Author: Carsten Haitzler (Rasterman) <[email protected]>
> > 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to