[gtk+] gdk: Make gdk_pixbuf_get_from_*() bindable



commit 872ef111ecabf6cd4453590b1e17afd3c9757f28
Author: Benjamin Otte <otte redhat com>
Date:   Sat Oct 2 02:47:55 2010 +0200

    gdk: Make gdk_pixbuf_get_from_*() bindable
    
    The ownership of the return value for gdk_pixbuf_get_from_window() and
    gdk_pixbuf_get_from_surface() was determined by the first argument.
    
    Because that is an ugly design and the functions are new to GTK3, we
    decided to adapt them.
    And that adaptation was quite easy since almost no one passses anything
    but NULL as the first argument.

 demos/testpixbuf-color.c |    4 +-
 demos/testpixbuf-save.c  |    8 ++--
 docs/tools/shooter.c     |    4 +-
 gdk/gdkpixbuf-drawable.c |  101 ++++++++++------------------------------------
 gdk/gdkpixbuf.h          |   10 +----
 gtk/gtkcolorsel.c        |    6 +--
 gtk/gtkoffscreenwindow.c |    4 +-
 7 files changed, 36 insertions(+), 101 deletions(-)
---
diff --git a/demos/testpixbuf-color.c b/demos/testpixbuf-color.c
index 5ce086c..3f762e6 100644
--- a/demos/testpixbuf-color.c
+++ b/demos/testpixbuf-color.c
@@ -112,8 +112,8 @@ main (int argc, char **argv)
 	gtk_init (&argc, &argv);
 
 	root = gdk_get_default_root_window ();
-	pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-					     0, 0, 0, 0, 150, 160);
+	pixbuf = gdk_pixbuf_get_from_window (root,
+					     0, 0, 150, 160);
 
 	/* PASS */
 	g_debug ("try to save PNG with a profile");
diff --git a/demos/testpixbuf-save.c b/demos/testpixbuf-save.c
index e7cdd60..5277c89 100644
--- a/demos/testpixbuf-save.c
+++ b/demos/testpixbuf-save.c
@@ -335,8 +335,8 @@ configure_cb (GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
                 GdkPixbuf *new_pixbuf;
 
                 root = gdk_get_default_root_window ();
-                new_pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-                                                         0, 0, 0, 0, evt->width, evt->height);
+                new_pixbuf = gdk_pixbuf_get_from_window (root,
+                                                         0, 0, evt->width, evt->height);
                 g_object_set_data_full (G_OBJECT (drawing_area), "pixbuf", new_pixbuf,
                                         (GDestroyNotify) g_object_unref);
         }
@@ -356,8 +356,8 @@ main (int argc, char **argv)
         gtk_init (&argc, &argv);   
 
         root = gdk_get_default_root_window ();
-        pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-                                             0, 0, 0, 0, 150, 160);
+        pixbuf = gdk_pixbuf_get_from_window (root,
+                                             0, 0, 150, 160);
    
         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
         g_signal_connect (window, "delete_event",
diff --git a/docs/tools/shooter.c b/docs/tools/shooter.c
index ec3d551..873609d 100644
--- a/docs/tools/shooter.c
+++ b/docs/tools/shooter.c
@@ -164,8 +164,8 @@ take_window_shot (Window   child,
   if (y_orig + height > gdk_screen_height ())
     height = gdk_screen_height () - y_orig;
 
-  tmp = gdk_pixbuf_get_from_window (NULL, window,
-				    x, y, 0, 0, width, height);
+  tmp = gdk_pixbuf_get_from_window (window,
+				    x, y, width, height);
 
   if (include_decoration)
     tmp2 = remove_shaped_area (tmp, xid);
diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c
index d7021d7..f638ce1 100644
--- a/gdk/gdkpixbuf-drawable.c
+++ b/gdk/gdkpixbuf-drawable.c
@@ -35,13 +35,9 @@
 
 /**
  * gdk_pixbuf_get_from_window:
- * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf
- *     should be created
  * @window: Source window
  * @src_x: Source X coordinate within @window
  * @src_y: Source Y coordinate within @window
- * @dest_x: Destination X coordinate in @dest, or 0 if @dest is NULL
- * @dest_y: Destination Y coordinate in @dest, or 0 if @dest is NULL
  * @width: Width in pixels of region to get
  * @height: Height in pixels of region to get
  *
@@ -49,19 +45,14 @@
  * representation inside a #GdkPixbuf. In other words, copies
  * image data from a server-side drawable to a client-side RGB(A) buffer.
  * This allows you to efficiently read individual pixels on the client side.
- *
- * If the specified destination pixbuf @dest is %NULL, then this
- * function will create an RGB pixbuf with 8 bits per channel and no
- * alpha, with the same size specified by the @width and @height
- * arguments.  In this case, the @dest_x and @dest_y arguments must be
- * specified as 0.  If the specified destination pixbuf is not %NULL
- * and it contains alpha information, then the filled pixels will be
- * set to full opacity (alpha = 255).
+ * 
+ * This function will create an RGB pixbuf with 8 bits per channel with
+ * the same size specified by the @width and @height arguments. The pixbuf
+ * will contain an alpha channel if the @window contains one.
  *
  * If the window is off the screen, then there is no image data in the
- * obscured/offscreen regions to be placed in the pixbuf. The contents
- * of portions of the pixbuf corresponding to the offscreen region are
- * undefined.
+ * obscured/offscreen regions to be placed in the pixbuf. The contents of
+ * portions of the pixbuf corresponding to the offscreen region are undefined.
  *
  * If the window you're obtaining data from is partially obscured by
  * other windows, then the contents of the pixbuf areas corresponding
@@ -76,37 +67,23 @@
  * (In short, there are several ways this function can fail, and if it fails
  *  it returns %NULL; so check the return value.)
  *
- * Return value: The same pixbuf as @dest if it was non-%NULL, or a
- *     newly-created pixbuf with a reference count of 1 if no destinatio
- *     pixbuf was specified, or %NULL on error
+ * Return value: (transfer full): A newly-created pixbuf with a reference
+ * count of 1, or %NULL on error
  **/
 GdkPixbuf *
-gdk_pixbuf_get_from_window (GdkPixbuf   *dest,
-                            GdkWindow   *src,
+gdk_pixbuf_get_from_window (GdkWindow   *src,
                             int src_x,  int src_y,
-                            int dest_x, int dest_y,
                             int width,  int height)
 {
   cairo_surface_t *surface;
+  GdkPixbuf *dest;
   
   g_return_val_if_fail (GDK_IS_WINDOW (src), NULL);
   g_return_val_if_fail (gdk_window_is_viewable (src), NULL);
 
-  if (!dest)
-    g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
-  else
-    {
-      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
-                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
-    }
-
   surface = _gdk_drawable_ref_cairo_surface (src);
-  dest = gdk_pixbuf_get_from_surface (dest,
-                                      surface,
+  dest = gdk_pixbuf_get_from_surface (surface,
                                       src_x, src_y,
-                                      dest_x, dest_y,
                                       width, height);
   cairo_surface_destroy (surface);
 
@@ -163,14 +140,11 @@ convert_alpha (guchar  *dest_data,
                int      src_stride,
                int      src_x,
                int      src_y,
-               int      dest_x,
-               int      dest_y,
                int      width,
                int      height)
 {
   int x, y;
 
-  dest_data += dest_stride * dest_y + dest_x * 4;
   src_data += src_stride * src_y + src_x * 4;
 
   for (y = 0; y < height; y++) {
@@ -206,14 +180,11 @@ convert_no_alpha (guchar  *dest_data,
                   int      src_stride,
                   int      src_x,
                   int      src_y,
-                  int      dest_x,
-                  int      dest_y,
                   int      width,
                   int      height)
 {
   int x, y;
 
-  dest_data += dest_stride * dest_y + dest_x * 3;
   src_data += src_stride * src_y + src_x * 4;
 
   for (y = 0; y < height; y++) {
@@ -232,13 +203,9 @@ convert_no_alpha (guchar  *dest_data,
 
 /**
  * gdk_pixbuf_get_from_surface:
- * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf
- *     should be created
  * @surface: surface to copy from
  * @src_x: Source X coordinate within @surface
  * @src_y: Source Y coordinate within @surface
- * @dest_x: Destination X coordinate in @dest, or 0 if @dest is NULL
- * @dest_y: Destination Y coordinate in @dest, or 0 if @dest is NULL
  * @width: Width in pixels of region to get
  * @height: Height in pixels of region to get
  *
@@ -247,54 +214,32 @@ convert_no_alpha (guchar  *dest_data,
  * individual pixels from cairo surfaces. For #GdkWindows, use
  * gdk_pixbuf_get_from_surface() instead.
  *
- * If the specified destination pixbuf @dest is %NULL, then this function
- * will create an RGB pixbuf with 8 bits per channel. The pixbuf will contain
- * an alpha channel if the @surface contains one. In this case, the @dest_x
- * and @dest_y arguments must be specified as 0.
+ * This function will create an RGB pixbuf with 8 bits per channel. The pixbuf
+ * will contain an alpha channel if the @surface contains one.
  *
- * Return value: The same pixbuf as @dest if it was non-%NULL, or a
- *     newly-created pixbuf with a reference count of 1 if no destination
- *     pixbuf was specified, or %NULL on error
+ * Return value: (transfer full): A newly-created pixbuf with a reference count
+ * of 1, or %NULL on error
  **/
 GdkPixbuf *
-gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
-                              cairo_surface_t *surface,
+gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
                               int              src_x,
                               int              src_y,
-                              int              dest_x,
-                              int              dest_y,
                               int              width,
                               int              height)
 {
   cairo_content_t content;
+  GdkPixbuf *dest;
   
   /* General sanity checks */
   g_return_val_if_fail (surface != NULL, NULL);
   g_return_val_if_fail (src_x >= 0 && src_y >= 0, NULL);
   g_return_val_if_fail (width > 0 && height > 0, NULL);
 
-  if (!dest)
-    {
-      g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
-
-      content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
-      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
-                             !!(content & CAIRO_CONTENT_ALPHA),
-                             8,
-                             width, height);
-    }
-  else
-    {
-      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
-                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
-      g_return_val_if_fail (dest_x >= 0 && dest_y >= 0, NULL);
-      g_return_val_if_fail (dest_x + width <= gdk_pixbuf_get_width (dest), NULL);
-      g_return_val_if_fail (dest_y + height <= gdk_pixbuf_get_height (dest), NULL);
-
-      content = gdk_pixbuf_get_has_alpha (dest) ? CAIRO_CONTENT_COLOR_ALPHA : CAIRO_CONTENT_COLOR;
-    }
+  content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
+  dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                         !!(content & CAIRO_CONTENT_ALPHA),
+                         8,
+                         width, height);
 
   surface = gdk_cairo_surface_coerce_to_image (surface, content, src_x + width, src_y + height);
   cairo_surface_flush (surface);
@@ -310,7 +255,6 @@ gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
                    cairo_image_surface_get_data (surface),
                    cairo_image_surface_get_stride (surface),
                    src_x, src_y,
-                   dest_x, dest_y,
                    width, height);
   else
     convert_no_alpha (gdk_pixbuf_get_pixels (dest),
@@ -318,7 +262,6 @@ gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
                       cairo_image_surface_get_data (surface),
                       cairo_image_surface_get_stride (surface),
                       src_x, src_y,
-                      dest_x, dest_y,
                       width, height);
 
   cairo_surface_destroy (surface);
diff --git a/gdk/gdkpixbuf.h b/gdk/gdkpixbuf.h
index 6b21078..61a1392 100644
--- a/gdk/gdkpixbuf.h
+++ b/gdk/gdkpixbuf.h
@@ -38,21 +38,15 @@
 G_BEGIN_DECLS
 
 /* Fetching a region from a drawable */
-GdkPixbuf *gdk_pixbuf_get_from_window   (GdkPixbuf   *dest,
-					 GdkWindow   *window,
+GdkPixbuf *gdk_pixbuf_get_from_window   (GdkWindow   *window,
 					 int          src_x,
 					 int          src_y,
-					 int          dest_x,
-					 int          dest_y,
 					 int          width,
 					 int          height);
 
-GdkPixbuf *gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
-                                         cairo_surface_t *surface,
+GdkPixbuf *gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
 					 int              src_x,
 					 int              src_y,
-					 int              dest_x,
-					 int              dest_y,
 					 int              width,
 					 int              height);
 
diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c
index 7436d6a..1814394 100644
--- a/gtk/gtkcolorsel.c
+++ b/gtk/gtkcolorsel.c
@@ -1653,9 +1653,8 @@ grab_color_at_pointer (GdkScreen *screen,
   
   priv = colorsel->private_data;
   
-  pixbuf = gdk_pixbuf_get_from_window (NULL, root_window,
+  pixbuf = gdk_pixbuf_get_from_window (root_window,
                                        x_root, y_root,
-                                       0, 0,
                                        1, 1);
   if (!pixbuf)
     {
@@ -1664,9 +1663,8 @@ grab_color_at_pointer (GdkScreen *screen,
       GdkWindow *window = gdk_display_get_window_at_device_position (display, device, &x, &y);
       if (!window)
 	return;
-      pixbuf = gdk_pixbuf_get_from_window (NULL, window,
+      pixbuf = gdk_pixbuf_get_from_window (window,
                                            x, y,
-                                           0, 0,
                                            1, 1);
       if (!pixbuf)
 	return;
diff --git a/gtk/gtkoffscreenwindow.c b/gtk/gtkoffscreenwindow.c
index 69356fd..ee37a9a 100644
--- a/gtk/gtkoffscreenwindow.c
+++ b/gtk/gtkoffscreenwindow.c
@@ -314,8 +314,8 @@ gtk_offscreen_window_get_pixbuf (GtkOffscreenWindow *offscreen)
 
   if (surface != NULL)
     {
-      pixbuf = gdk_pixbuf_get_from_surface (NULL, surface,
-                                            0, 0, 0, 0,
+      pixbuf = gdk_pixbuf_get_from_surface (surface,
+                                            0, 0,
                                             gdk_window_get_width (window),
                                             gdk_window_get_height (window));
     }



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