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



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

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

	* src/io-gdip-native.h:
	* src/io-gdip-jpeg.c: Support setting the JPEG's quality, just like GdkPixbuf's 
	built-in JPEG encoder

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

Modified: trunk/src/io-gdip-jpeg.c
==============================================================================
--- trunk/src/io-gdip-jpeg.c	(original)
+++ trunk/src/io-gdip-jpeg.c	Mon Mar  3 23:12:21 2008
@@ -21,8 +21,11 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#define INITGUID
 #include "io-gdip-utils.h"
 
+DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
+
 static gboolean
 gdk_pixbuf__gdip_image_save_JPEG_to_callback (GdkPixbufSaveFunc   save_func,
                                              gpointer            user_data,
@@ -31,12 +34,59 @@
                                              gchar             **values,
                                              GError            **error)
 {
-  EncoderParameters *encoder_params = NULL;
+  EncoderParameters encoder_params;
+  ULONG quality = 75; /* default; must be between 0 and 100 */
   gboolean status;
 
-  status = io_gdip_save_pixbuf (pixbuf, L"image/jpeg", encoder_params, save_func, user_data, error);
-
-  g_free (encoder_params);
+  if (keys && *keys) {
+    gchar **kiter = keys;
+    gchar **viter = values;
+    
+    while (*kiter) {
+      if (strcmp (*kiter, "quality") == 0) {
+        char *endptr = NULL;
+        quality = strtol (*viter, &endptr, 10);
+        
+        if (endptr == *viter) {
+          g_set_error (error,
+                       GDK_PIXBUF_ERROR,
+                       GDK_PIXBUF_ERROR_BAD_OPTION,
+                       _("JPEG quality must be a value between 0 and 100; value '%s' could not be parsed."),
+                       *viter);
+          
+          return FALSE;
+        }
+        
+        if (quality < 0 ||
+            quality > 100) {
+          /* 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,
+                       _("JPEG quality must be a value between 0 and 100; value '%d' is not allowed."),
+                       (int)quality);
+          
+          return FALSE;
+        }
+      } else {
+        g_warning ("Unrecognized parameter (%s) passed to JPEG saver.", *kiter);
+      }
+      
+      ++kiter;
+      ++viter;
+    }
+  }
+
+  encoder_params.Count = 1;
+  encoder_params.Parameter[0].Guid = EncoderQuality;
+  encoder_params.Parameter[0].Type = EncoderParameterValueTypeLong;
+  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;
 }

Modified: trunk/src/io-gdip-native.h
==============================================================================
--- trunk/src/io-gdip-native.h	(original)
+++ trunk/src/io-gdip-native.h	Mon Mar  3 23:12:21 2008
@@ -33,6 +33,18 @@
 typedef gulong ARGB;
 typedef gint PixelFormat;
 
+typedef enum {
+    EncoderParameterValueTypeByte = 1,
+    EncoderParameterValueTypeASCII = 2,
+    EncoderParameterValueTypeShort = 3,
+    EncoderParameterValueTypeLong = 4,
+    EncoderParameterValueTypeRational = 5,
+    EncoderParameterValueTypeLongRange = 6,
+    EncoderParameterValueTypeUndefined = 7,
+    EncoderParameterValueTypeRationalRange = 8,
+    EncoderParameterValueTypePointer = 9
+} EncoderParameterValueType;
+
 #define    PixelFormatIndexed   0x00010000
 #define    PixelFormatGDI       0x00020000
 #define    PixelFormatAlpha     0x00040000



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