From: Jeonghyun Yun <jh0506.yun@samsung.com>
authorJeonghyun Yun <jh0506.yun@samsung.com>
Wed, 16 Feb 2011 05:44:01 +0000 (05:44 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 16 Feb 2011 05:44:01 +0000 (05:44 +0000)
Subject: Re: [E-devel] [Patch] evas_image_load_bmp small patch

When I tested some bmp files on evas, I found one bmp file is not displayed.
But this bmp file is displayed on windows and linux gimp and etc.
So I checked this bmp file, this file have 208 data per line despite 207
pixel per line!!

I fixed code to skip the data when data is more than width instead of
break. I think this is not bug but evas policy problem.

SVN revision: 57076

legacy/evas/ChangeLog
legacy/evas/src/modules/loaders/bmp/evas_image_load_bmp.c

index 257ff48..bafaf5b 100644 (file)
@@ -93,3 +93,9 @@
          transition.
        * A lot of textblock speed improvements and reduced memory footprint.
 
+2011-02-16  Jeonghyun Yun
+
+        * Patch from Jeonghyun Yun <jh0506.yun@samsung.com> that
+          improves BMP loader support to handle malformed RLE BMP's that
+          encode more pixels per line than the image actuall has.
+
index 46a726a..a06d807 100644 (file)
@@ -681,32 +681,34 @@ evas_image_load_file_data_bmp(Image_Entry *ie, const char *file, const char *key
                     {
                        if (p[0])
                          {
-                            unsigned int col1 = pal[p[1] >> 4];
-                            unsigned int col2 = pal[p[1] & 0xf];
+                           if ((x + p[0]) <= wpad)
+                             {
+                                 unsigned int col1 = pal[p[1] >> 4];
+                                 unsigned int col2 = pal[p[1] & 0xf];
                             
-                            if ((x + p[0]) > wpad) break;
-                            count = p[0] / 2;
-                            while (count > 0)
-                              {
-                                 if (x < w)
+                                 count = p[0] / 2;
+                                 while (count > 0)
                                    {
-                                      pix[0] = col1;
-                                      x++;
+                                      if (x < w)
+                                        {
+                                           pix[0] = col1;
+                                           x++;
+                                        }
+                                      if (x < w)
+                                        {
+                                           pix[1] = col2;
+                                           x++;
+                                        }
+                                      pix += 2;
+                                      count--;
                                    }
-                                 if (x < w)
+                                 if (p[0] & 0x1)
                                    {
-                                      pix[1] = col2;
+                                      *pix = col1;
                                       x++;
+                                      pix++;
                                    }
-                                 pix += 2;
-                                 count--;
-                              }
-                            if (p[0] & 0x1)
-                              {
-                                 *pix = col1;
-                                 x++;
-                                 pix++;
-                              }
+                             }
                             p += 2;
                          }
                        else
@@ -809,17 +811,19 @@ evas_image_load_file_data_bmp(Image_Entry *ie, const char *file, const char *key
                     {
                        if (p[0])
                          {
-                            unsigned int col = pal[p[1]];
+                           if ((x + p[0]) <= w)
+                             {
+                                 unsigned int col = pal[p[1]];
                             
-                            count = p[0];
-                            if ((x + p[0]) > w) break;
-                            while (count > 0)
-                              {
-                                 *pix = col;
-                                 pix++;
-                                 count--;
-                              }
-                            x += p[0];
+                                 count = p[0];
+                                 while (count > 0)
+                                   {
+                                      *pix = col;
+                                      pix++;
+                                      count--;
+                                   }
+                                 x += p[0];
+                             }
                             p += 2;
                          }
                        else