]> Pileus Git - ~andy/gtk/commitdiff
allow to specify the PNG compression level by passing a "compression"
authorSven Neumann <sven@gimp.org>
Tue, 24 May 2005 17:09:56 +0000 (17:09 +0000)
committerSven Neumann <neo@src.gnome.org>
Tue, 24 May 2005 17:09:56 +0000 (17:09 +0000)
2005-05-24  Sven Neumann  <sven@gimp.org>

* io-png.c: allow to specify the PNG compression level by passing
a "compression" parameter to the PNG save function (bug #305337).

* gdk-pixbuf-io.c (gdk_pixbuf_save): document the new parameter.

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

index d26f4a6a5355e5c5f385aaa895ca0c0aa2767de7..05bcfb5cc5037fc26a5b4fdf1ba09929a6f22d4c 100644 (file)
@@ -1,3 +1,10 @@
+2005-05-24  Sven Neumann  <sven@gimp.org>
+
+       * io-png.c: allow to specify the PNG compression level by passing
+       a "compression" parameter to the PNG save function (bug #305337).
+
+       * gdk-pixbuf-io.c (gdk_pixbuf_save): document the new parameter.
+
 2005-04-09  Matthias Clasen  <mclasen@redhat.com>
        
        * Makefile.am: Use $(NM), not nm directly. (#301299, 
index 653315e26681df609c32aaf413d3c7edc720f565..76b91653e338cd5e7a7002b7b4204e74c70025a3 100644 (file)
@@ -1556,11 +1556,15 @@ gdk_pixbuf_real_save_to_callback (GdkPixbuf         *pixbuf,
  *                  "quality", "100", NULL);
  * </programlisting></informalexample>
  *
- * Currently only few parameters exist. JPEG images can be saved with a 
- * "quality" parameter; its value should be in the range [0,100]. 
+ * Currently only few parameters exist. JPEG images can be saved with a
+ * "quality" parameter; its value should be in the range [0,100].
+ *
  * Text chunks can be attached to PNG images by specifying parameters of
  * the form "tEXt::key", where key is an ASCII string of length 1-79.
- * The values are UTF-8 encoded strings. 
+ * The values are UTF-8 encoded strings. The PNG compression level can
+ * be specified using the "compression" parameter; it's value is in an
+ * integer in the range of [0,9].
+ *
  * ICO images can be saved in depth 16, 24, or 32, by using the "depth"
  * parameter. When the ICO saver is given "x_hot" and "y_hot" parameters,
  * it produces a CUR instead of an ICO.
index 7e9fb36de139f491f5e0fd19f174ef982c11a92e..25a2bb6060340f5078c77b5e7e506c0eb2e79fc1 100644 (file)
@@ -789,40 +789,69 @@ static gboolean real_save_png (GdkPixbuf        *pixbuf,
        int has_alpha;
        int bpc;
        int num_keys;
+       int compression = -1;
        gboolean success = TRUE;
        SaveToFunctionIoPtr to_callback_ioptr;
 
        num_keys = 0;
 
        if (keys && *keys) {
-               gchar **kiter;
-               gchar  *key;
-               int     len;
+               gchar **kiter = keys;
+               gchar **viter = values;
+
+               while (*kiter) {
+                       if (strncmp (*kiter, "tEXt::", 6) == 0) {
+                               gchar  *key = *kiter + 6;
+                               int     len = strlen (key);
+                               if (len <= 1 || len > 79) {
+                                       g_set_error (error,
+                                                    GDK_PIXBUF_ERROR,
+                                                    GDK_PIXBUF_ERROR_BAD_OPTION,
+                                                    _("Keys for PNG text chunks must have at least 1 and at most 79 characters."));
+                                       return FALSE;
+                               }
+                               for (i = 0; i < len; i++) {
+                                       if ((guchar) key[i] > 127) {
+                                               g_set_error (error,
+                                                            GDK_PIXBUF_ERROR,
+                                                            GDK_PIXBUF_ERROR_BAD_OPTION,
+                                                            _("Keys for PNG text chunks must be ASCII characters."));
+                                               return FALSE;
+                                       }
+                               }
+                               num_keys++;
+                       } else if (strcmp (*kiter, "compression") == 0) {
+                               char *endptr = NULL;
+                               compression = strtol (*viter, &endptr, 10);
 
-               for (kiter = keys; *kiter; kiter++) {
-                       if (strncmp (*kiter, "tEXt::", 6) != 0) {
-                               g_warning ("Bad option name '%s' passed to PNG saver", *kiter);
-                               return FALSE;
-                       }
-                       key = *kiter + 6;
-                       len = strlen (key);
-                       if (len <= 1 || len > 79) {
-                               g_set_error (error,
-                                            GDK_PIXBUF_ERROR,
-                                            GDK_PIXBUF_ERROR_BAD_OPTION,
-                                            _("Keys for PNG text chunks must have at least 1 and at most 79 characters."));
-                               return FALSE;
-                       }
-                       for (i = 0; i < len; i++) {
-                               if ((guchar) key[i] > 127) {
+                               if (endptr == *viter) {
+                                       g_set_error (error,
+                                                    GDK_PIXBUF_ERROR,
+                                                    GDK_PIXBUF_ERROR_BAD_OPTION,
+                                                    _("PNG compression level must be a value between 0 and 9; value '%s' could not be parsed."),
+                                                    *viter);
+                                       return FALSE;
+                               }
+                               if (compression < 0 || compression > 9) {
+                                       /* This is a user-visible error;
+                                        * lets people skip the range-checking
+                                        * in their app.
+                                        */
                                        g_set_error (error,
                                                     GDK_PIXBUF_ERROR,
                                                     GDK_PIXBUF_ERROR_BAD_OPTION,
-                                                    _("Keys for PNG text chunks must be ASCII characters."));
+                                                    _("PNG compression level must be a value between 0 and 9; value '%d' is not allowed."),
+                                                    compression);
                                        return FALSE;
                                }
+                       } else {
+                               g_warning ("Bad option name '%s' passed to PNG saver",
+                                          *kiter);
+                               return FALSE;
                        }
-                       num_keys++;
+
+                       ++kiter;
+                       ++viter;
                }
        }
 
@@ -900,6 +929,9 @@ static gboolean real_save_png (GdkPixbuf        *pixbuf,
                png_init_io (png_ptr, f);
        }
 
+       if (compression >= 0)
+               png_set_compression_level (png_ptr, compression);
+
        if (has_alpha) {
                png_set_IHDR (png_ptr, info_ptr, w, h, bpc,
                              PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,