kwo pushed a commit to branch master.

http://git.enlightenment.org/legacy/imlib2.git/commit/?id=0f5b4fb10aa22298a439bd73c29f6a17bb29a279

commit 0f5b4fb10aa22298a439bd73c29f6a17bb29a279
Author: Kim Woelders <[email protected]>
Date:   Sat Nov 30 16:22:55 2019 +0100

    Loaders: Simplify/fix progress handling
    
    Progress handling was broken in at least bmp, gif, lbm, and png loaders.
---
 src/modules/loaders/loader_argb.c |  21 +---
 src/modules/loaders/loader_bmp.c  | 203 +++++++++-----------------------------
 src/modules/loaders/loader_ff.c   |   9 +-
 src/modules/loaders/loader_gif.c  |  20 +---
 src/modules/loaders/loader_ico.c  |   4 +-
 src/modules/loaders/loader_jpeg.c |  23 +----
 src/modules/loaders/loader_lbm.c  |  26 +----
 src/modules/loaders/loader_png.c  |  31 ++----
 src/modules/loaders/loader_pnm.c  |  53 +++++-----
 src/modules/loaders/loader_tga.c  |   4 +-
 src/modules/loaders/loader_tiff.c |  39 ++------
 src/modules/loaders/loader_webp.c |   4 +-
 src/modules/loaders/loader_xpm.c  |  19 ++--
 13 files changed, 119 insertions(+), 337 deletions(-)

diff --git a/src/modules/loaders/loader_argb.c 
b/src/modules/loaders/loader_argb.c
index 63fe81d..ec55abb 100644
--- a/src/modules/loaders/loader_argb.c
+++ b/src/modules/loaders/loader_argb.c
@@ -8,8 +8,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    FILE               *f;
    int                 w = 0, h = 0, alpha = 0;
    DATA32             *ptr;
-   int                 y, l;
-   int                 pper = 0, pl = 0;
+   int                 y;
 
    f = fopen(im->real_file, "rb");
    if (!f)
@@ -64,22 +63,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
 #endif
         ptr += im->w;
 
-        if (progress)
+        if (im->lc && __imlib_LoadProgressRows(im, y, 1))
           {
-             char                per;
-
-             per = (char)((100 * y) / im->h);
-             if (((per - pper) >= progress_granularity) || (y == (im->h - 1)))
-               {
-                  l = y - pl;
-                  if (!progress(im, per, 0, (y - l), im->w, l))
-                    {
-                       rc = LOAD_BREAK;
-                       goto quit;
-                    }
-                  pper = per;
-                  pl = y;
-               }
+             rc = LOAD_BREAK;
+             goto quit;
           }
      }
 
diff --git a/src/modules/loaders/loader_bmp.c b/src/modules/loaders/loader_bmp.c
index 4385e97..5e2320f 100644
--- a/src/modules/loaders/loader_bmp.c
+++ b/src/modules/loaders/loader_bmp.c
@@ -139,8 +139,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
 {
    int                 rc;
    FILE               *f;
-   char                pper = 0;
-   int                 pl = 0;
    unsigned int        offset;
    unsigned int        size, comp, imgsize;
    unsigned int        bitcount, ncols, skip;
@@ -442,26 +440,11 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                     }
                   buffer_ptr += skip;
                   ptr -= w * 2;
-                  if (progress)
-                    {
-                       char                per;
-                       int                 ll;
 
-                       per = (char)((100 * y) / im->h);
-                       if (((per - pper) >= progress_granularity) ||
-                           (y == (im->h - 1)))
-                         {
-                            ll = y - pl;
-                            if (!progress
-                                (im, per, 0, im->h - y - 1, im->w,
-                                 im->h - y + ll))
-                              {
-                                 rc = LOAD_BREAK;
-                                 goto quit;
-                              }
-                            pper = per;
-                            pl = y;
-                         }
+                  if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
+                    {
+                       rc = LOAD_BREAK;
+                       goto quit;
                     }
                }
              break;
@@ -517,7 +500,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             ptr = im->data + (h - y - 1) * w;
                             break;
                          case RLE_END:
-                            goto bail_bc4;
+                            x = 0;
+                            y = h;
+                            buffer_ptr = buffer_end_safe;
+                            break;
                          case RLE_MOVE:
                             /* Need to read two bytes */
                             if (buffer_ptr >= buffer_end_safe)
@@ -556,27 +542,17 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             break;
                          }
                     }
+                  goto progress_bc4;
+
                 bail_bc4:
-                  if (progress)
-                    {
-                       char                per;
-                       int                 ll;
+                  buffer_ptr = buffer_end_safe;
 
-                       per = (char)((100 * y) / im->h);
-                       if (((per - pper) >= progress_granularity) ||
-                           (y == (im->h - 1)))
-                         {
-                            ll = y - pl;
-                            if (!progress
-                                (im, per, 0, im->h - y - 1, im->w,
-                                 im->h - y + ll))
-                              {
-                                 rc = LOAD_BREAK;
-                                 goto quit;
-                              }
-                            pper = per;
-                            pl = y;
-                         }
+                progress_bc4:
+                  if (im->lc && (x == w) &&
+                      __imlib_LoadProgressRows(im, h - y - 1, -1))
+                    {
+                       rc = LOAD_BREAK;
+                       goto quit;
                     }
                }
              break;
@@ -595,26 +571,11 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                     }
                   buffer_ptr += skip;
                   ptr -= w * 2;
-                  if (progress)
-                    {
-                       char                per;
-                       int                 ll;
 
-                       per = (char)((100 * y) / im->h);
-                       if (((per - pper) >= progress_granularity) ||
-                           (y == (im->h - 1)))
-                         {
-                            ll = y - pl;
-                            if (!progress
-                                (im, per, 0, im->h - y - 1, im->w,
-                                 im->h - y + ll))
-                              {
-                                 rc = LOAD_BREAK;
-                                 goto quit;
-                              }
-                            pper = per;
-                            pl = y;
-                         }
+                  if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
+                    {
+                       rc = LOAD_BREAK;
+                       goto quit;
                     }
                }
              break;
@@ -659,7 +620,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             ptr = im->data + ((h - y - 1) * w) + x;
                             break;
                          case RLE_END:
-                            goto bail_bc8;
+                            x = 0;
+                            y = h;
+                            buffer_ptr = buffer_end_safe;
+                            break;
                          case RLE_MOVE:
                             /* Need to read two bytes */
                             if (buffer_ptr >= buffer_end_safe)
@@ -693,29 +657,17 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             break;
                          }
                     }
-               }
-           bail_bc8:
-             if (progress)
-               {
-                  char                per;
-                  int                 ll;
-
-                  per = (char)((100 * y) / im->h);
-#if 0
-                  /* Always call progress() at least once */
-                  if (((per - pper) >= progress_granularity) ||
-                      (y == (im->h - 1)))
-#endif
+                  goto progress_bc8;
+
+                bail_bc8:
+                  buffer_ptr = buffer_end_safe;
+
+                progress_bc8:
+                  if (im->lc && (x == w) &&
+                      __imlib_LoadProgressRows(im, h - y - 1, -1))
                     {
-                       ll = y - pl;
-                       if (!progress
-                           (im, per, 0, im->h - y - 1, im->w, im->h - y + ll))
-                         {
-                            rc = LOAD_BREAK;
-                            goto quit;
-                         }
-                       pper = per;
-                       pl = y;
+                       rc = LOAD_BREAK;
+                       goto quit;
                     }
                }
              break;
@@ -732,26 +684,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                   ptr -= w * 2;
                   buffer_ptr += skip;
 
-                  if (progress)
+                  if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
                     {
-                       char                per;
-                       int                 ll;
-
-                       per = (char)((100 * y) / im->h);
-                       if (((per - pper) >= progress_granularity) ||
-                           (y == (im->h - 1)))
-                         {
-                            ll = y - pl;
-                            if (!progress
-                                (im, per, 0, im->h - y - 1, im->w,
-                                 im->h - y + ll))
-                              {
-                                 rc = LOAD_BREAK;
-                                 goto quit;
-                              }
-                            pper = per;
-                            pl = y;
-                         }
+                       rc = LOAD_BREAK;
+                       goto quit;
                     }
                }
              break;
@@ -781,25 +717,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
              ptr -= w * 2;
              buffer_ptr += skip;
 
-             if (progress)
+             if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
                {
-                  char                per;
-                  int                 ll;
-
-                  per = (char)((100 * y) / im->h);
-                  if (((per - pper) >= progress_granularity) ||
-                      (y == (im->h - 1)))
-                    {
-                       ll = y - pl;
-                       if (!progress
-                           (im, per, 0, im->h - y - 1, im->w, im->h - y + ll))
-                         {
-                            rc = LOAD_BREAK;
-                            goto quit;
-                         }
-                       pper = per;
-                       pl = y;
-                    }
+                  rc = LOAD_BREAK;
+                  goto quit;
                }
           }
         break;
@@ -820,25 +741,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
              ptr -= w * 2;
              buffer_ptr += skip;
 
-             if (progress)
+             if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
                {
-                  char                per;
-                  int                 ll;
-
-                  per = (char)((100 * y) / im->h);
-                  if (((per - pper) >= progress_granularity) ||
-                      (y == (im->h - 1)))
-                    {
-                       ll = y - pl;
-                       if (!progress
-                           (im, per, 0, im->h - y - 1, im->w, im->h - y + ll))
-                         {
-                            rc = LOAD_BREAK;
-                            goto quit;
-                         }
-                       pper = per;
-                       pl = y;
-                    }
+                  rc = LOAD_BREAK;
+                  goto quit;
                }
           }
         break;
@@ -866,25 +772,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
              ptr -= w * 2;
              buffer_ptr += skip;
 
-             if (progress)
+             if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
                {
-                  char                per;
-                  int                 ll;
-
-                  per = (char)((100 * y) / im->h);
-                  if (((per - pper) >= progress_granularity) ||
-                      (y == (im->h - 1)))
-                    {
-                       ll = y - pl;
-                       if (!progress
-                           (im, per, 0, im->h - y - 1, im->w, im->h - y + ll))
-                         {
-                            rc = LOAD_BREAK;
-                            goto quit;
-                         }
-                       pper = per;
-                       pl = y;
-                    }
+                  rc = LOAD_BREAK;
+                  goto quit;
                }
           }
         break;
diff --git a/src/modules/loaders/loader_ff.c b/src/modules/loaders/loader_ff.c
index f6942d2..0950f97 100644
--- a/src/modules/loaders/loader_ff.c
+++ b/src/modules/loaders/loader_ff.c
@@ -72,10 +72,13 @@ load(ImlibImage * im, ImlibProgressFunction progress,
              dat[j + 0] = ntohs(row[j + 2]) / 257;
              dat[j + 3] = ntohs(row[j + 3]) / 257;
           }
-     }
 
-   if (progress)
-      progress(im, 100, 0, 0, im->w, im->h);
+        if (im->lc && __imlib_LoadProgressRows(im, i, 1))
+          {
+             rc = LOAD_BREAK;
+             goto quit;
+          }
+     }
 
    rc = LOAD_SUCCESS;
 
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index fece782..53fc8b9 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -17,8 +17,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    GifRecordType       rec;
    ColorMapObject     *cmap;
    int                 i, j, done, bg, r, g, b, w = 0, h = 0;
-   float               per = 0.0, per_inc;
-   int                 last_per = 0, last_y = 0;
    int                 transp;
    int                 fd;
    DATA32              colormap[256];
@@ -150,30 +148,20 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    if (!ptr)
       goto quit;
 
-   per_inc = 100.0 / (float)h;
    for (i = 0; i < h; i++)
      {
         for (j = 0; j < w; j++)
           {
              *ptr++ = colormap[rows[i][j]];
           }
-        per += per_inc;
-        if (progress && (((int)per) != last_per)
-            && (((int)per) % progress_granularity == 0))
+
+        if (im->lc && __imlib_LoadProgressRows(im, i, 1))
           {
-             last_per = (int)per;
-             if (!(progress(im, per, 0, last_y, w, i)))
-               {
-                  rc = LOAD_BREAK;
-                  goto quit;
-               }
-             last_y = i;
+             rc = LOAD_BREAK;
+             goto quit;
           }
      }
 
-   if (progress)
-      progress(im, 100, 0, last_y, im->w, im->h);
-
    rc = LOAD_SUCCESS;
 
  quit:
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index f2215e4..5aff0a5 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -419,8 +419,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    ok = ico_load(ico, im, load_data);
    if (ok)
      {
-        if (progress)
-           progress(im, 100, 0, 0, im->w, im->h);
+        if (im->lc)
+           __imlib_LoadProgressRows(im, 0, im->h);
      }
 
    ico_delete(ico);
diff --git a/src/modules/loaders/loader_jpeg.c 
b/src/modules/loaders/loader_jpeg.c
index 2c0999a..036a007 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -67,7 +67,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    FILE               *f;
    DATA8              *ptr, *line[16];
    DATA32             *ptr2;
-   int                 x, y, l, i, scans, count, prevy;
+   int                 x, y, l, i, scans;
 
    f = fopen(im->real_file, "rb");
    if (!f)
@@ -115,9 +115,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    if (!ptr2)
       goto quit;
 
-   count = 0;
-   prevy = 0;
-
    for (i = 0; i < cinfo.rec_outbuf_height; i++)
       line[i] = jdata.data + (i * w * cinfo.output_components);
 
@@ -165,22 +162,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                }
           }
 
-        if (progress)
+        if (im->lc && __imlib_LoadProgressRows(im, l, scans))
           {
-             int                 per;
-
-             per = (l * 100) / h;
-             if (((per - count) >= progress_granularity)
-                 || ((h - l) <= cinfo.rec_outbuf_height))
-               {
-                  count = per;
-                  if (!progress(im, per, 0, prevy, w, scans + l - prevy))
-                    {
-                       rc = LOAD_BREAK;
-                       goto done;
-                    }
-                  prevy = l + scans;
-               }
+             rc = LOAD_BREAK;
+             goto done;
           }
      }
 
diff --git a/src/modules/loaders/loader_lbm.c b/src/modules/loaders/loader_lbm.c
index 10b4808..419c724 100644
--- a/src/modules/loaders/loader_lbm.c
+++ b/src/modules/loaders/loader_lbm.c
@@ -453,7 +453,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
 {
    int                 rc;
    char               *env;
-   int                 i, n, y, z, gran, nexty, prevy;
+   int                 i, n, y, z;
    unsigned char      *plane[40];
    ILBM                ilbm;
 
@@ -534,8 +534,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    * from each plane are interleaved, from top to bottom. The first plane is 
the
    * 0 bit.
    *----------*/
-   plane[0] = NULL;
-   gran = nexty = 0;
 
    __imlib_AllocateData(im);
    if (!im->data)
@@ -553,15 +551,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
 
    z = ((im->w + 15) / 16) * 2 * n;
 
-   if (progress)
-     {
-        prevy = 0;
-        if (progress_granularity <= 0)
-           progress_granularity = 1;
-        gran = progress_granularity;
-        nexty = ((im->h * gran) / 100);
-     }
-
    scalecmap(&ilbm);
 
    for (y = 0; y < im->h; y++)
@@ -571,17 +560,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
         deplane(im->data + im->w * y, im->w, &ilbm, plane);
         ilbm.row++;
 
-        if (progress && (y >= nexty || y == im->h - 1))
+        if (im->lc && __imlib_LoadProgressRows(im, y, 1))
           {
-             if (!progress
-                 (im, (char)((100 * (y + 1)) / im->h), 0, prevy, im->w, y + 1))
-               {
-                  rc = LOAD_BREAK;
-                  goto quit;
-               }
-             prevy = y;
-             gran += progress_granularity;
-             nexty = ((im->h * gran) / 100);
+             rc = LOAD_BREAK;
+             goto quit;
           }
      }
 
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index ff771d8..9b36fb5 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -134,38 +134,25 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    for (i = 0; i < h; i++)
       lines[i] = ((unsigned char *)(im->data)) + (i * w * sizeof(DATA32));
 
-   if (progress)
+   if (im->lc)
      {
-        int                 y, count, prevy, pass, number_passes, per,
-           nrows = 1;
+        int                 y, pass, n_passes, nrows = 1;
 
-        count = 0;
-        number_passes = png_set_interlace_handling(png_ptr);
-        for (pass = 0; pass < number_passes; pass++)
+        n_passes = png_set_interlace_handling(png_ptr);
+        for (pass = 0; pass < n_passes; pass++)
           {
-             prevy = 0;
-             per = 0;
+             __imlib_LoadProgressSetPass(im, pass, n_passes);
+
              for (y = 0; y < h; y += nrows)
                {
                   png_read_rows(png_ptr, &lines[y], NULL, nrows);
 
-                  per = (((pass * h) + y) * 100) / (h * number_passes);
-                  if ((per - count) >= progress_granularity)
+                  if (__imlib_LoadProgressRows(im, y, nrows))
                     {
-                       count = per;
-                       if (!progress(im, per, 0, prevy, w, y - prevy + 1))
-                         {
-                            rc = LOAD_BREAK;
-                            goto quit1;
-                         }
-                       prevy = y + 1;
+                       rc = LOAD_BREAK;
+                       goto quit1;
                     }
                }
-             if (!progress(im, per, 0, prevy, w, y - prevy + 1))
-               {
-                  rc = LOAD_BREAK;
-                  goto quit1;
-               }
           }
      }
    else
diff --git a/src/modules/loaders/loader_pnm.c b/src/modules/loaders/loader_pnm.c
index 8f23acd..3d43520 100644
--- a/src/modules/loaders/loader_pnm.c
+++ b/src/modules/loaders/loader_pnm.c
@@ -6,21 +6,14 @@ do_progress(ImlibImage * im, ImlibProgressFunction progress,
             char progress_granularity, char *pper, int *py, int y)
 {
    int                 rc = 0;
-   int                 h = 0;
-   char                per;
+   int                 per;
 
-   per = (char)((100 * y) / im->h);
-   if (((per - *pper) >= progress_granularity) || (y == (im->h - 1)))
+   per = (100 * (y + 1)) / im->h;
+   if (per == 100 || per >= *pper + progress_granularity)
      {
-        h = y - *py;
-
-        /* fix off by one in case of the last line */
-        if (y == (im->h - 1))
-           h++;
-
-        rc = !progress(im, per, 0, *py, im->w, h);
-        *pper = per;
-        *py = y;
+        rc = !progress(im, per, 0, *py, im->w, y + 1 - *py);
+        *py = y + 1;
+        *pper += progress_granularity;
      }
 
    return rc;
@@ -39,8 +32,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    DATA8              *ptr = NULL;
    int                *idata = NULL;    /* for the ASCII versions */
    DATA32             *ptr2, rval, gval, bval;
-   int                 i, j, x, y, pl = 0;
-   char                pper = 0;
+   int                 i, j, x, y;
 
    f = fopen(im->real_file, "rb");
    if (!f)
@@ -156,8 +148,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                   else
                      goto quit;
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -182,8 +174,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                     }
                }
 
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -208,8 +199,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                           (((gval * 255) / v) << 8) | ((bval * 255) / v);
                     }
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -238,8 +229,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                     }
                   ptr++;
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -277,8 +268,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                        ptr++;
                     }
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -316,8 +307,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                        ptr += 3;
                     }
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -348,8 +339,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                   ptr2++;
                   ptr++;
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
@@ -386,8 +377,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                        ptr += 4;
                     }
                }
-             if (progress &&
-                 do_progress(im, progress, progress_granularity, &pper, &pl, 
y))
+
+             if (im->lc && __imlib_LoadProgressRows(im, y, 1))
                 goto quit_progress;
           }
         break;
diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c
index 523a5c6..ac1670e 100644
--- a/src/modules/loaders/loader_tga.c
+++ b/src/modules/loaders/loader_tga.c
@@ -570,8 +570,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
            tgaflip(im->data, im->w, im->h, fliph, flipv);
      }
 
-   if (progress)
-      progress(im, 100, 0, 0, im->w, im->h);
+   if (im->lc)
+      __imlib_LoadProgressRows(im, 0, im->h);
 
    rc = LOAD_SUCCESS;
 
diff --git a/src/modules/loaders/loader_tiff.c 
b/src/modules/loaders/loader_tiff.c
index 14f22e0..eb1c22c 100644
--- a/src/modules/loaders/loader_tiff.c
+++ b/src/modules/loaders/loader_tiff.c
@@ -14,11 +14,6 @@ struct TIFFRGBAImage_Extra {
    tileContigRoutine   put_contig;
    tileSeparateRoutine put_separate;
    ImlibImage         *image;
-   ImlibProgressFunction progress;
-   char                pper;
-   char                progress_granularity;
-   uint32              num_pixels;
-   uint32              py;
 };
 
 typedef struct TIFFRGBAImage_Extra TIFFRGBAImage_Extra;
@@ -190,9 +185,10 @@ raster(TIFFRGBAImage_Extra * img, uint32 * rast,
         break;
      }
 
-   if (img->progress)
+   if (img->image->lc)
      {
-        char                per;
+        /* for tile based images, we just progress each tile because */
+        /* of laziness. Couldn't think of a good way to do this */
 
         switch (img->rgba.orientation)
           {
@@ -200,18 +196,7 @@ raster(TIFFRGBAImage_Extra * img, uint32 * rast,
           case ORIENTATION_TOPLEFT:
              if (w >= image_width)
                {
-                  uint32              real_y = (image_height - 1) - y;
-
-                  per = (char)(((real_y + h - 1) * 100) / image_height);
-
-                  if (((per - img->pper) >= img->progress_granularity) ||
-                      (real_y + h) >= image_height)
-                    {
-                       img->progress(img->image, per, 0, img->py, w,
-                                     (real_y + h) - img->py);
-                       img->py = real_y + h;
-                       img->pper = per;
-                    }
+                  __imlib_LoadProgressRows(img->image, image_height - y - 1, 
h);
                }
              else
                {
@@ -231,9 +216,7 @@ raster(TIFFRGBAImage_Extra * img, uint32 * rast,
              y = image_height - y - h;
              goto progress_a;
            progress_a:
-             per = (char)((w * h * 100) / img->num_pixels);
-             img->pper += per;
-             img->progress(img->image, img->pper, x, y, w, h);
+             __imlib_LoadProgress(img->image, x, y, w, h);
              break;
 
           case ORIENTATION_LEFTTOP:
@@ -248,9 +231,7 @@ raster(TIFFRGBAImage_Extra * img, uint32 * rast,
           case ORIENTATION_LEFTBOT:
              goto progress_b;
            progress_b:
-             per = (char)((w * h * 100) / img->num_pixels);
-             img->pper += per;
-             img->progress(img->image, img->pper, y, x, h, w);
+             __imlib_LoadProgress(img->image, y, x, h, w);
              break;
           }
      }
@@ -267,7 +248,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    uint16              magic_number;
    TIFFRGBAImage_Extra rgba_image;
    uint32             *rast = NULL;
-   uint32              num_pixels;
    char                txt[1024];
 
    f = fopen(im->real_file, "rb");
@@ -334,7 +314,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
       goto quit;
 
-   rgba_image.num_pixels = num_pixels = im->w * im->h;
    if (rgba_image.rgba.alpha != EXTRASAMPLE_UNSPECIFIED)
       SET_FLAG(im->flags, F_HAS_ALPHA);
    else
@@ -348,14 +327,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
 
    /* Load data */
 
-   rgba_image.progress = progress;
-   rgba_image.pper = rgba_image.py = 0;
-   rgba_image.progress_granularity = progress_granularity;
-
    if (!__imlib_AllocateData(im))
       goto quit;
 
-   rast = (uint32 *) _TIFFmalloc(sizeof(uint32) * num_pixels);
+   rast = (uint32 *) _TIFFmalloc(sizeof(uint32) * im->w * im->h);
    if (!rast)
      {
         fprintf(stderr, "imlib2-tiffloader: Out of memory\n");
diff --git a/src/modules/loaders/loader_webp.c 
b/src/modules/loaders/loader_webp.c
index 42b4285..6482fa8 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -95,8 +95,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                           sizeof(DATA32) * im->w * im->h, im->w * 4) == NULL)
       goto quit;
 
-   if (progress)
-      progress(im, 100, 0, 0, im->w, im->h);
+   if (im->lc)
+      __imlib_LoadProgressRows(im, 0, im->h);
 
    rc = LOAD_SUCCESS;
 
diff --git a/src/modules/loaders/loader_xpm.c b/src/modules/loaders/loader_xpm.c
index a3bbc3f..7bc3fa9 100644
--- a/src/modules/loaders/loader_xpm.c
+++ b/src/modules/loaders/loader_xpm.c
@@ -140,9 +140,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    int                 lsz = 256;
    cmap_t             *cmap;
    short               lookup[128 - 32][128 - 32];
-   float               per = 0.0, per_inc = 0.0;
-   int                 last_per = 0, last_y = 0;
    int                 count, pixels;
+   int                 last_row = 0;
 
    f = fopen(im->real_file, "rb");
    if (!f)
@@ -241,8 +240,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                   if (!cmap)
                      goto quit;
 
-                  per_inc = 100.0 / (((float)w) * h);
-
                   if (!load_data)
                     {
                        rc = LOAD_SUCCESS;
@@ -387,17 +384,16 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             count++;
                          }
                     }
-                  per += per_inc;
-                  if (progress && (((int)per) != last_per)
-                      && (((int)per) % progress_granularity == 0))
+
+                  i = count / w;
+                  if (im->lc && i > last_row)
                     {
-                       last_per = (int)per;
-                       if (!(progress(im, (int)per, 0, last_y, w, i)))
+                       if (__imlib_LoadProgressRows(im, last_row, i - 
last_row))
                          {
                             rc = LOAD_BREAK;
                             goto quit;
                          }
-                       last_y = i;
+                       last_row = i;
                     }
                }
           }
@@ -454,9 +450,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    else
       UNSET_FLAG(im->flags, F_HAS_ALPHA);
 
-   if (progress)
-      progress(im, 100, 0, last_y, w, h);
-
    rc = LOAD_SUCCESS;
 
  quit:

-- 


Reply via email to