diff options
author | Benjamin Otte <otte@redhat.com> | 2010-10-02 02:47:55 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-10-02 03:08:24 +0200 |
commit | 872ef111ecabf6cd4453590b1e17afd3c9757f28 (patch) | |
tree | f84fe201a6661ac903334e780604a558b4bfc923 | |
parent | 0555dd06454a649943f8420512303ddd02ed5867 (diff) | |
download | gtk+-872ef111ecabf6cd4453590b1e17afd3c9757f28.tar.gz |
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.
-rw-r--r-- | demos/testpixbuf-color.c | 4 | ||||
-rw-r--r-- | demos/testpixbuf-save.c | 8 | ||||
-rw-r--r-- | docs/tools/shooter.c | 4 | ||||
-rw-r--r-- | gdk/gdkpixbuf-drawable.c | 101 | ||||
-rw-r--r-- | gdk/gdkpixbuf.h | 10 | ||||
-rw-r--r-- | gtk/gtkcolorsel.c | 6 | ||||
-rw-r--r-- | gtk/gtkoffscreenwindow.c | 4 |
7 files changed, 36 insertions, 101 deletions
diff --git a/demos/testpixbuf-color.c b/demos/testpixbuf-color.c index 5ce086cf90..3f762e6707 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 e7cdd6034c..5277c89a6f 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 ec3d551cfa..873609d972 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 d7021d7783..f638ce1d07 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 6b21078edb..61a1392d09 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 7436d6adeb..1814394697 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 69356fd151..ee37a9ae1d 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)); } |