Below is a patch to add support for saving TGA files upside down.  Although it sounds
strange to do, it is a supported feature of the file format and OpenGL expects its
textures to be upside down.  Support already exists for reading such files but it
was impossible to save them.

Brandon

Index: tga.c
===================================================================
RCS file: /cvs/gnome/gimp/plug-ins/common/tga.c,v
retrieving revision 1.20
diff -c -r1.20 tga.c
*** tga.c       2000/08/28 00:42:20     1.20
--- tga.c       2000/09/09 23:16:49
***************
*** 95,105 ****
--- 95,107 ----
  typedef struct _TgaSaveVals
  {
    gint rle;
+   gint vertrev;
  } TgaSaveVals;
  
  static TgaSaveVals tsvals =
  {
    1,    /* rle */
+   0,    /* Bottom to Top ordering */
  };
  
  typedef struct _TgaSaveInterface
***************
*** 1186,1192 ****
    struct tga_header hdr;
  
    int (*myfwrite)(guchar *, int, int, FILE *);
!   guchar *data;
  
    drawable = gimp_drawable_get(drawable_ID);
    dtype = gimp_drawable_type(drawable_ID);
--- 1188,1194 ----
    struct tga_header hdr;
  
    int (*myfwrite)(guchar *, int, int, FILE *);
!   guchar *data, *tmpbuf;
  
    drawable = gimp_drawable_get(drawable_ID);
    dtype = gimp_drawable_type(drawable_ID);
***************
*** 1199,1205 ****
  
    memset (&hdr, 0, sizeof (hdr));
    /* We like our images top-to-bottom, thank you! */
!   hdr.descriptor |= TGA_DESC_VERTICAL;
  
    /* Choose the imageType based on our drawable and compression option. */
    switch (dtype)
--- 1201,1210 ----
  
    memset (&hdr, 0, sizeof (hdr));
    /* We like our images top-to-bottom, thank you! */
!   /* Not all of us :-P */
!   if (!tsvals.vertrev) {
!     hdr.descriptor |= TGA_DESC_VERTICAL;
!   }
  
    /* Choose the imageType based on our drawable and compression option. */
    switch (dtype)
***************
*** 1363,1369 ****
      {
        /* Get a horizontal slice of the image. */
        tileheight = MIN(tileheight, height - i);
!       gimp_pixel_rgn_get_rect(&pixel_rgn, data, 0, i, width, tileheight);
  
  #ifdef VERBOSE
        if (verbose > 1)
--- 1368,1388 ----
      {
        /* Get a horizontal slice of the image. */
        tileheight = MIN(tileheight, height - i);
!       if (!tsvals.vertrev) {
!         gimp_pixel_rgn_get_rect(&pixel_rgn, data, 0, i, width, tileheight);
!       } else {
!         gimp_pixel_rgn_get_rect(&pixel_rgn, data, 0, MAX(height - i - tileheight, 
0), width, tileheight);
!         bsize = width * pelbytes;     /* the width of a row */
!         tmpbuf = (guchar *) g_malloc(bsize);
!         for (j = 0; j < tileheight/2; j++)
!           {
!             memcpy(tmpbuf, data + (j * bsize), bsize);        /* Move top row to the 
tmpbuf */
!             memcpy(data + (j * bsize), data + ((tileheight - j - 1) * bsize),
!                    bsize);    /* Move bottom row to the top */
!             memcpy(data + ((tileheight - j - 1) * bsize), tmpbuf, bsize);
!           }
!         g_free(tmpbuf);
!       }
  
  #ifdef VERBOSE
        if (verbose > 1)
***************
*** 1473,1478 ****
--- 1492,1506 ----
                      GTK_SIGNAL_FUNC (gimp_toggle_button_update),
                      &tsvals.rle);
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), tsvals.rle);
+   gtk_widget_show (toggle);
+ 
+   /* Bottom to Top Ordering */
+   toggle = gtk_check_button_new_with_label (_("Upside Down Image"));
+   gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+   gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
+                       GTK_SIGNAL_FUNC (gimp_toggle_button_update),
+                       &tsvals.vertrev);
+   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), tsvals.vertrev);
    gtk_widget_show (toggle);
  
    gtk_widget_show (vbox);

Reply via email to