Commit 872ef111 authored by Benjamin Otte's avatar Benjamin Otte

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.
parent 0555dd06
......@@ -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");
......
......@@ -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",
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
......@@ -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;
......
......@@ -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));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment