Flip some more images
authorMatthias Clasen <matthiasc@src.gnome.org>
Tue, 6 Mar 2007 04:16:24 +0000 (04:16 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 6 Mar 2007 04:16:24 +0000 (04:16 +0000)
svn path=/trunk/; revision=17393

gdk-pixbuf/ChangeLog
gdk-pixbuf/io-tga.c

index 0ece5e3ad576fae440ab84f44451e00e6aea9553..7072aadeba9e5ac9559912a87e9e9254ce27ae91 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-05  Matthias Clasen <mclasen@redhat.com>
+
+       * io-tga.c: (gdk_pixbuf__tga_stop_load): Flip rle-encoded
+       images even if they haven't been completely loaded.  (#347106)
+
 2007-02-27  Felix Riemann  <friemann@svn.gnome.org>
 
        * io-ico.c: (fill_info): Add image/x-ico to supported mime types.
index 427fac4e08114dfc519dcd20fb13a76ff4f87c8e..79c661c01f79837d1c4cb6afc94b301c53c6489e 100644 (file)
@@ -504,8 +504,9 @@ static guint parse_rle_data_pseudocolor(TGAContext *ctx)
                }
        }
 
-       if (ctx->pbuf_bytes_done == ctx->pbuf_bytes)
+       if (ctx->pbuf_bytes_done == ctx->pbuf_bytes) 
                ctx->done = TRUE;
+       
        return n;
 }
 
@@ -657,8 +658,10 @@ static gboolean parse_rle_data(TGAContext *ctx, GError **err)
                 * perfect, but doing it during the rle decoding in place
                 * is considerably more work. 
                 */
-               if (!(ctx->hdr->flags & TGA_ORIGIN_UPPER))
+               if (!(ctx->hdr->flags & TGA_ORIGIN_UPPER)) {
                        pixbuf_flip_vertically (ctx->pbuf);
+                       ctx->hdr->flags |= TGA_ORIGIN_UPPER;
+               }
 
        }
                
@@ -933,6 +936,13 @@ static gboolean gdk_pixbuf__tga_stop_load(gpointer data, GError **err)
        TGAContext *ctx = (TGAContext *) data;
        g_return_val_if_fail(ctx != NULL, FALSE);
 
+       if (!(ctx->hdr->flags & TGA_ORIGIN_UPPER) && ctx->run_length_encoded) {
+               pixbuf_flip_vertically (ctx->pbuf);
+               if (ctx->ufunc)
+                       (*ctx->ufunc) (ctx->pbuf, 0, 0,
+                                      ctx->pbuf->width, ctx->pbuf->height,
+                                      ctx->udata);
+       }
        if (ctx->hdr)
          g_free (ctx->hdr);
        if (ctx->cmap) {