gdip-pixbuf-loader r43 - in trunk: . src



Author: doml
Date: Mon Mar  3 23:22:41 2008
New Revision: 43
URL: http://svn.gnome.org/viewvc/gdip-pixbuf-loader?rev=43&view=rev

Log:
2008-03-03  Dominic Lachowicz <domlachowicz gmail com>

	* src/io-gdip-png.c: Support setting the PNG's compression level, just like
	 GdkPixbuf's built-in PNG encoder. Still need to support tEXt chunks.

Modified:
   trunk/ChangeLog
   trunk/src/io-gdip-jpeg.c
   trunk/src/io-gdip-png.c

Modified: trunk/src/io-gdip-jpeg.c
==============================================================================
--- trunk/src/io-gdip-jpeg.c	(original)
+++ trunk/src/io-gdip-jpeg.c	Mon Mar  3 23:22:41 2008
@@ -35,8 +35,7 @@
                                              GError            **error)
 {
   EncoderParameters encoder_params;
-  ULONG quality = 75; /* default; must be between 0 and 100 */
-  gboolean status;
+  LONG quality = 75; /* default; must be between 0 and 100 */
 
   if (keys && *keys) {
     gchar **kiter = keys;
@@ -86,9 +85,7 @@
   encoder_params.Parameter[0].NumberOfValues = 1;
   encoder_params.Parameter[0].Value = &quality;
      
-  status = io_gdip_save_pixbuf (pixbuf, L"image/jpeg", &encoder_params, save_func, user_data, error);
-
-  return status;
+  return io_gdip_save_pixbuf (pixbuf, L"image/jpeg", &encoder_params, save_func, user_data, error);
 }
 
 static gboolean

Modified: trunk/src/io-gdip-png.c
==============================================================================
--- trunk/src/io-gdip-png.c	(original)
+++ trunk/src/io-gdip-png.c	Mon Mar  3 23:22:41 2008
@@ -21,8 +21,11 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#define INITGUID
 #include "io-gdip-utils.h"
 
+DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
+
 static gboolean
 gdk_pixbuf__gdip_image_save_PNG_to_callback (GdkPixbufSaveFunc   save_func,
                                              gpointer            user_data,
@@ -31,15 +34,57 @@
                                              gchar             **values,
                                              GError            **error)
 {
-  /* TODO: support exif data and the like */
-  EncoderParameters *encoder_params = NULL;
-  gboolean status;
-
-  status = io_gdip_save_pixbuf (pixbuf, L"image/png", encoder_params, save_func, user_data, error);
+  EncoderParameters encoder_params;
+  LONG compression = 5;
 
-  g_free (encoder_params);
+  if (keys && *keys) {
+    gchar **kiter = keys;
+    gchar **viter = values;
+    
+    while (*kiter) {
+      if (strncmp (*kiter, "tEXt::", 6) == 0) {
+        /* TODO: support exif data and the like */
+      }
+      else if (strcmp (*kiter, "compression") == 0) {
+        char *endptr = NULL;
+        compression = strtol (*viter, &endptr, 10);
+        
+        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,
+                       _("PNG compression level must be a value between 0 and 9; value '%d' is not allowed."),
+                       (int)compression);
+          return FALSE;
+        }       
+      } else {
+        g_warning ("Unrecognized parameter (%s) passed to PNG saver.", *kiter);
+      }
+      
+      ++kiter;
+      ++viter;
+    }
+  }
+
+  encoder_params.Count = 1;
+  encoder_params.Parameter[0].Guid = EncoderCompression;
+  encoder_params.Parameter[0].Type = EncoderParameterValueTypeLong;
+  encoder_params.Parameter[0].NumberOfValues = 1;
+  encoder_params.Parameter[0].Value = &compression;
 
-  return status;
+  return io_gdip_save_pixbuf (pixbuf, L"image/png", &encoder_params, save_func, user_data, error);
 }
 
 static gboolean



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