[gthumb] fixed saving of TGA files



commit f41d9ef9058229d837593ec7efce689c95f23b6c
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Jun 27 19:48:26 2013 +0200

    fixed saving of TGA files
    
    save the colors in little ending order

 extensions/cairo_io/gth-image-saver-jpeg.c |    2 +-
 extensions/cairo_io/gth-image-saver-png.c  |    2 +-
 extensions/cairo_io/gth-image-saver-tga.c  |    2 +-
 extensions/cairo_io/gth-image-saver-tiff.c |    2 +-
 gthumb/cairo-utils.c                       |   44 ++++++++++++++++++++++++----
 gthumb/cairo-utils.h                       |    6 +++-
 6 files changed, 47 insertions(+), 11 deletions(-)
---
diff --git a/extensions/cairo_io/gth-image-saver-jpeg.c b/extensions/cairo_io/gth-image-saver-jpeg.c
index aeb1d59..d9aac8a 100644
--- a/extensions/cairo_io/gth-image-saver-jpeg.c
+++ b/extensions/cairo_io/gth-image-saver-jpeg.c
@@ -396,7 +396,7 @@ _cairo_surface_write_as_jpeg (cairo_surface_t  *image,
 
                /* convert scanline from RGBA to RGB packed */
 
-               _cairo_copy_line_as_rgba (buf, pixels, w, FALSE);
+               _cairo_copy_line_as_rgba_big_endian (buf, pixels, w, FALSE);
 
                /* write scanline */
                jbuf = (JSAMPROW *)(&buf);
diff --git a/extensions/cairo_io/gth-image-saver-png.c b/extensions/cairo_io/gth-image-saver-png.c
index b30143e..22e216f 100644
--- a/extensions/cairo_io/gth-image-saver-png.c
+++ b/extensions/cairo_io/gth-image-saver-png.c
@@ -276,7 +276,7 @@ _cairo_surface_write_as_png (cairo_surface_t  *image,
        buf = g_new (guchar, width * bpp);
        ptr = pixels;
        for (row = 0; row < height; ++row) {
-               _cairo_copy_line_as_rgba (buf, ptr, width, alpha);
+               _cairo_copy_line_as_rgba_big_endian (buf, ptr, width, alpha);
                png_write_rows (cairo_png_data->png_ptr, &buf, 1);
 
                ptr += rowstride;
diff --git a/extensions/cairo_io/gth-image-saver-tga.c b/extensions/cairo_io/gth-image-saver-tga.c
index fd5e011..268ee71 100644
--- a/extensions/cairo_io/gth-image-saver-tga.c
+++ b/extensions/cairo_io/gth-image-saver-tga.c
@@ -260,7 +260,7 @@ _cairo_surface_write_as_tga (cairo_surface_t  *image,
 
        ptr = pixels;
        for (row = 0; row < height; ++row) {
-               _cairo_copy_line_as_rgba (buf, ptr, width, alpha);
+               _cairo_copy_line_as_rgba_little_endian (buf, ptr, width, alpha);
 
                if (rle_compression)
                        rle_write (buffer_data, buf, width, out_bpp, error);
diff --git a/extensions/cairo_io/gth-image-saver-tiff.c b/extensions/cairo_io/gth-image-saver-tiff.c
index 05cffad..d615417 100644
--- a/extensions/cairo_io/gth-image-saver-tiff.c
+++ b/extensions/cairo_io/gth-image-saver-tiff.c
@@ -439,7 +439,7 @@ _cairo_surface_write_as_tiff (cairo_surface_t  *image,
        /* Now write the TIFF data. */
        ptr = pixels;
        for (row = 0; row < rows; row++) {
-               _cairo_copy_line_as_rgba (buf, ptr, cols, alpha);
+               _cairo_copy_line_as_rgba_big_endian (buf, ptr, cols, alpha);
                if (TIFFWriteScanline (tif, buf, row, 0) < 0) {
                        g_set_error (error,
                                     GDK_PIXBUF_ERROR,
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index dba6c43..651c72e 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -586,10 +586,10 @@ _cairo_image_surface_color_shift (cairo_surface_t *image,
 
 
 void
-_cairo_copy_line_as_rgba (guchar *dest,
-                         guchar *src,
-                         guint   width,
-                         guint   alpha)
+_cairo_copy_line_as_rgba_big_endian (guchar *dest,
+                                    guchar *src,
+                                    guint   width,
+                                    guint   alpha)
 {
        guint x;
 
@@ -603,9 +603,41 @@ _cairo_copy_line_as_rgba (guchar *dest,
        }
        else {
                for (x = 0; x < width; x++) {
-                       dest[0] = src[CAIRO_RED];
+                       CAIRO_GET_RGB (src, dest[0], dest[1], dest[2]);
+
+                       src += 4;
+                       dest += 3;
+               }
+       }
+}
+
+
+void
+_cairo_copy_line_as_rgba_little_endian (guchar *dest,
+                                       guchar *src,
+                                       guint   width,
+                                       guint   alpha)
+{
+       guint x;
+
+       if (alpha) {
+               int r, g, b, a;
+               for (x = 0; x < width; x++) {
+                       CAIRO_GET_RGBA (src, r, g, b, a);
+                       dest[0] = b;
+                       dest[1] = g;
+                       dest[2] = r;
+                       dest[3] = a;
+
+                       src += 4;
+                       dest += 4;
+               }
+       }
+       else {
+               for (x = 0; x < width; x++) {
+                       dest[0] = src[CAIRO_BLUE];
                        dest[1] = src[CAIRO_GREEN];
-                       dest[2] = src[CAIRO_BLUE];
+                       dest[2] = src[CAIRO_RED];
 
                        src += 4;
                        dest += 3;
diff --git a/gthumb/cairo-utils.h b/gthumb/cairo-utils.h
index 9eb4e94..82c1d2d 100644
--- a/gthumb/cairo-utils.h
+++ b/gthumb/cairo-utils.h
@@ -181,7 +181,11 @@ cairo_surface_t *  _cairo_image_surface_transform           (cairo_surface_t
                                                             GthTransform           transform);
 cairo_surface_t *  _cairo_image_surface_color_shift         (cairo_surface_t       *image,
                                                             int                    shift);
-void               _cairo_copy_line_as_rgba                 (guchar                *dest,
+void               _cairo_copy_line_as_rgba_big_endian      (guchar                *dest,
+                                                            guchar                *src,
+                                                            guint                  width,
+                                                            guint                  alpha);
+void               _cairo_copy_line_as_rgba_little_endian   (guchar                *dest,
                                                             guchar                *src,
                                                             guint                  width,
                                                             guint                  alpha);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]