From: Matthias Clasen Date: Mon, 15 May 2023 22:21:08 +0000 (-0400) Subject: gdk: Deprecated some pixbuf apis X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~258^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ed265f6a7e7e6f24f48c887c8ff8aebd5df8bba7;p=gtk4.git gdk: Deprecated some pixbuf apis These are already documented as 'don't use in new apis'. Lets make it official and deprecate them properly. --- diff --git a/gdk/deprecated/gdkpixbuf.c b/gdk/deprecated/gdkpixbuf.c new file mode 100644 index 0000000000..0487014a2f --- /dev/null +++ b/gdk/deprecated/gdkpixbuf.c @@ -0,0 +1,270 @@ +/* GdkPixbuf library - convert X drawable information to RGB + * + * Copyright (C) 1999 Michael Zucchi + * + * Authors: Michael Zucchi + * Cody Russell + * Federico Mena-Quintero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include "config.h" + +#include "gdkpixbuf.h" + +#include "gdkmemoryformatprivate.h" +#include "gdkmemorytextureprivate.h" +#include "gdksurface.h" +#include "gdktexturedownloaderprivate.h" + +#include + + +static cairo_format_t +gdk_cairo_format_for_content (cairo_content_t content) +{ + switch (content) + { + case CAIRO_CONTENT_COLOR: + return CAIRO_FORMAT_RGB24; + case CAIRO_CONTENT_ALPHA: + return CAIRO_FORMAT_A8; + case CAIRO_CONTENT_COLOR_ALPHA: + default: + return CAIRO_FORMAT_ARGB32; + } +} + +static cairo_surface_t * +gdk_cairo_surface_coerce_to_image (cairo_surface_t *surface, + cairo_content_t content, + int src_x, + int src_y, + int width, + int height) +{ + cairo_surface_t *copy; + cairo_t *cr; + + copy = cairo_image_surface_create (gdk_cairo_format_for_content (content), + width, + height); + + cr = cairo_create (copy); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, -src_x, -src_y); + cairo_paint (cr); + cairo_destroy (cr); + + return copy; +} + +static void +convert_alpha (guchar *dest_data, + int dest_stride, + guchar *src_data, + int src_stride, + int src_x, + int src_y, + int width, + int height) +{ + int x, y; + + src_data += src_stride * src_y + src_x * 4; + + for (y = 0; y < height; y++) { + guint32 *src = (guint32 *) src_data; + + for (x = 0; x < width; x++) { + guint alpha = src[x] >> 24; + + if (alpha == 0) + { + dest_data[x * 4 + 0] = 0; + dest_data[x * 4 + 1] = 0; + dest_data[x * 4 + 2] = 0; + } + else + { + dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; + dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; + dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; + } + dest_data[x * 4 + 3] = alpha; + } + + src_data += src_stride; + dest_data += dest_stride; + } +} + +static void +convert_no_alpha (guchar *dest_data, + int dest_stride, + guchar *src_data, + int src_stride, + int src_x, + int src_y, + int width, + int height) +{ + int x, y; + + src_data += src_stride * src_y + src_x * 4; + + for (y = 0; y < height; y++) { + guint32 *src = (guint32 *) src_data; + + for (x = 0; x < width; x++) { + dest_data[x * 3 + 0] = src[x] >> 16; + dest_data[x * 3 + 1] = src[x] >> 8; + dest_data[x * 3 + 2] = src[x]; + } + + src_data += src_stride; + dest_data += dest_stride; + } +} + +/** + * gdk_pixbuf_get_from_surface: + * @surface: surface to copy from + * @src_x: Source X coordinate within @surface + * @src_y: Source Y coordinate within @surface + * @width: Width in pixels of region to get + * @height: Height in pixels of region to get + * + * Transfers image data from a `cairo_surface_t` and converts it + * to a `GdkPixbuf`. + * + * This allows you to efficiently read individual pixels from cairo surfaces. + * + * This function will create an RGB pixbuf with 8 bits per channel. + * The pixbuf will contain an alpha channel if the @surface contains one. + * + * Returns: (nullable) (transfer full): A newly-created pixbuf with a + * reference count of 1 + * + * Deprecated: 4.12: Use [class@Gdk.Texture] and subclasses instead + * cairo surfaces and pixbufs + */ +GdkPixbuf * +gdk_pixbuf_get_from_surface (cairo_surface_t *surface, + int src_x, + int src_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 (width > 0 && height > 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); + + if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE && + cairo_image_surface_get_format (surface) == gdk_cairo_format_for_content (content)) + surface = cairo_surface_reference (surface); + else + { + surface = gdk_cairo_surface_coerce_to_image (surface, content, + src_x, src_y, + width, height); + src_x = 0; + src_y = 0; + } + cairo_surface_flush (surface); + if (cairo_surface_status (surface) || dest == NULL) + { + cairo_surface_destroy (surface); + g_clear_object (&dest); + return NULL; + } + + if (gdk_pixbuf_get_has_alpha (dest)) + convert_alpha (gdk_pixbuf_get_pixels (dest), + gdk_pixbuf_get_rowstride (dest), + cairo_image_surface_get_data (surface), + cairo_image_surface_get_stride (surface), + src_x, src_y, + width, height); + else + convert_no_alpha (gdk_pixbuf_get_pixels (dest), + gdk_pixbuf_get_rowstride (dest), + cairo_image_surface_get_data (surface), + cairo_image_surface_get_stride (surface), + src_x, src_y, + width, height); + + cairo_surface_destroy (surface); + return dest; +} + +static void +pixbuf_texture_unref_cb (guchar *pixels, + gpointer bytes) +{ + g_bytes_unref (bytes); +} + +/** + * gdk_pixbuf_get_from_texture: + * @texture: a `GdkTexture` + * + * Creates a new pixbuf from @texture. + * + * This should generally not be used in newly written code as later + * stages will almost certainly convert the pixbuf back into a texture + * to draw it on screen. + * + * Returns: (transfer full) (nullable): a new `GdkPixbuf` + * + * Deprecated: 4.12: Use [class@Gdk.Texture] and subclasses instead + * cairo surfaces and pixbufs + */ +GdkPixbuf * +gdk_pixbuf_get_from_texture (GdkTexture *texture) +{ + GdkTextureDownloader downloader; + GBytes *bytes; + gsize stride; + gboolean alpha; + + alpha = gdk_memory_format_alpha (gdk_texture_get_format (texture)) != GDK_MEMORY_ALPHA_OPAQUE; + + gdk_texture_downloader_init (&downloader, texture); + gdk_texture_downloader_set_format (&downloader, + alpha ? GDK_MEMORY_GDK_PIXBUF_ALPHA + : GDK_MEMORY_GDK_PIXBUF_OPAQUE); + bytes = gdk_texture_downloader_download_bytes (&downloader, &stride); + gdk_texture_downloader_finish (&downloader); + + return gdk_pixbuf_new_from_data (g_bytes_get_data (bytes, NULL), + GDK_COLORSPACE_RGB, + alpha, + 8, + gdk_texture_get_width (texture), + gdk_texture_get_height (texture), + stride, + pixbuf_texture_unref_cb, + bytes); +} diff --git a/gdk/deprecated/gdkpixbuf.h b/gdk/deprecated/gdkpixbuf.h new file mode 100644 index 0000000000..738b856236 --- /dev/null +++ b/gdk/deprecated/gdkpixbuf.h @@ -0,0 +1,46 @@ +/* GDK - The GIMP Drawing Kit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#pragma once + +#if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +GDK_DEPRECATED_IN_4_12 +GdkPixbuf *gdk_pixbuf_get_from_surface (cairo_surface_t *surface, + int src_x, + int src_y, + int width, + int height); +GDK_DEPRECATED_IN_4_12 +GdkPixbuf *gdk_pixbuf_get_from_texture (GdkTexture *texture); + +G_END_DECLS + diff --git a/gdk/deprecated/meson.build b/gdk/deprecated/meson.build new file mode 100644 index 0000000000..12b0b25076 --- /dev/null +++ b/gdk/deprecated/meson.build @@ -0,0 +1,7 @@ +gdk_deprecated_sources = [ + 'deprecated/gdkpixbuf.c', +] + +gdk_deprecated_headers = [ + 'deprecated/gdkpixbuf.h', +] diff --git a/gdk/gdk.h b/gdk/gdk.h index 64b4882672..6b69c4dd89 100644 --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -61,7 +61,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/gdk/gdkcairo.h b/gdk/gdkcairo.h index 10591ab8fa..eafc4c29dc 100644 --- a/gdk/gdkcairo.h +++ b/gdk/gdkcairo.h @@ -22,7 +22,7 @@ #endif #include -#include +#include #include G_BEGIN_DECLS diff --git a/gdk/gdkcontentserializer.c b/gdk/gdkcontentserializer.c index 16fe2c5870..b433266256 100644 --- a/gdk/gdkcontentserializer.c +++ b/gdk/gdkcontentserializer.c @@ -22,7 +22,7 @@ #include "gdkcontentserializer.h" #include "gdkcontentformats.h" -#include "gdkpixbuf.h" +#include "deprecated/gdkpixbuf.h" #include "filetransferportalprivate.h" #include "gdktextureprivate.h" #include "gdkrgba.h" @@ -642,7 +642,9 @@ pixbuf_serializer (GdkContentSerializer *serializer) else if (G_VALUE_HOLDS (value, GDK_TYPE_TEXTURE)) { GdkTexture *texture = g_value_get_object (value); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS pixbuf = gdk_pixbuf_get_from_texture (texture); +G_GNUC_END_IGNORE_DEPRECATIONS } else { diff --git a/gdk/gdkpixbuf.c b/gdk/gdkpixbuf.c deleted file mode 100644 index 3e3a20336f..0000000000 --- a/gdk/gdkpixbuf.c +++ /dev/null @@ -1,264 +0,0 @@ -/* GdkPixbuf library - convert X drawable information to RGB - * - * Copyright (C) 1999 Michael Zucchi - * - * Authors: Michael Zucchi - * Cody Russell - * Federico Mena-Quintero - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#include "config.h" - -#include "gdkpixbuf.h" - -#include "gdkmemoryformatprivate.h" -#include "gdkmemorytextureprivate.h" -#include "gdksurface.h" -#include "gdktexturedownloaderprivate.h" - -#include - - -static cairo_format_t -gdk_cairo_format_for_content (cairo_content_t content) -{ - switch (content) - { - case CAIRO_CONTENT_COLOR: - return CAIRO_FORMAT_RGB24; - case CAIRO_CONTENT_ALPHA: - return CAIRO_FORMAT_A8; - case CAIRO_CONTENT_COLOR_ALPHA: - default: - return CAIRO_FORMAT_ARGB32; - } -} - -static cairo_surface_t * -gdk_cairo_surface_coerce_to_image (cairo_surface_t *surface, - cairo_content_t content, - int src_x, - int src_y, - int width, - int height) -{ - cairo_surface_t *copy; - cairo_t *cr; - - copy = cairo_image_surface_create (gdk_cairo_format_for_content (content), - width, - height); - - cr = cairo_create (copy); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_surface (cr, surface, -src_x, -src_y); - cairo_paint (cr); - cairo_destroy (cr); - - return copy; -} - -static void -convert_alpha (guchar *dest_data, - int dest_stride, - guchar *src_data, - int src_stride, - int src_x, - int src_y, - int width, - int height) -{ - int x, y; - - src_data += src_stride * src_y + src_x * 4; - - for (y = 0; y < height; y++) { - guint32 *src = (guint32 *) src_data; - - for (x = 0; x < width; x++) { - guint alpha = src[x] >> 24; - - if (alpha == 0) - { - dest_data[x * 4 + 0] = 0; - dest_data[x * 4 + 1] = 0; - dest_data[x * 4 + 2] = 0; - } - else - { - dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; - dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; - dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; - } - dest_data[x * 4 + 3] = alpha; - } - - src_data += src_stride; - dest_data += dest_stride; - } -} - -static void -convert_no_alpha (guchar *dest_data, - int dest_stride, - guchar *src_data, - int src_stride, - int src_x, - int src_y, - int width, - int height) -{ - int x, y; - - src_data += src_stride * src_y + src_x * 4; - - for (y = 0; y < height; y++) { - guint32 *src = (guint32 *) src_data; - - for (x = 0; x < width; x++) { - dest_data[x * 3 + 0] = src[x] >> 16; - dest_data[x * 3 + 1] = src[x] >> 8; - dest_data[x * 3 + 2] = src[x]; - } - - src_data += src_stride; - dest_data += dest_stride; - } -} - -/** - * gdk_pixbuf_get_from_surface: - * @surface: surface to copy from - * @src_x: Source X coordinate within @surface - * @src_y: Source Y coordinate within @surface - * @width: Width in pixels of region to get - * @height: Height in pixels of region to get - * - * Transfers image data from a `cairo_surface_t` and converts it - * to a `GdkPixbuf`. - * - * This allows you to efficiently read individual pixels from cairo surfaces. - * - * This function will create an RGB pixbuf with 8 bits per channel. - * The pixbuf will contain an alpha channel if the @surface contains one. - * - * Returns: (nullable) (transfer full): A newly-created pixbuf with a - * reference count of 1 - */ -GdkPixbuf * -gdk_pixbuf_get_from_surface (cairo_surface_t *surface, - int src_x, - int src_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 (width > 0 && height > 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); - - if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE && - cairo_image_surface_get_format (surface) == gdk_cairo_format_for_content (content)) - surface = cairo_surface_reference (surface); - else - { - surface = gdk_cairo_surface_coerce_to_image (surface, content, - src_x, src_y, - width, height); - src_x = 0; - src_y = 0; - } - cairo_surface_flush (surface); - if (cairo_surface_status (surface) || dest == NULL) - { - cairo_surface_destroy (surface); - g_clear_object (&dest); - return NULL; - } - - if (gdk_pixbuf_get_has_alpha (dest)) - convert_alpha (gdk_pixbuf_get_pixels (dest), - gdk_pixbuf_get_rowstride (dest), - cairo_image_surface_get_data (surface), - cairo_image_surface_get_stride (surface), - src_x, src_y, - width, height); - else - convert_no_alpha (gdk_pixbuf_get_pixels (dest), - gdk_pixbuf_get_rowstride (dest), - cairo_image_surface_get_data (surface), - cairo_image_surface_get_stride (surface), - src_x, src_y, - width, height); - - cairo_surface_destroy (surface); - return dest; -} - -static void -pixbuf_texture_unref_cb (guchar *pixels, - gpointer bytes) -{ - g_bytes_unref (bytes); -} - -/** - * gdk_pixbuf_get_from_texture: - * @texture: a `GdkTexture` - * - * Creates a new pixbuf from @texture. - * - * This should generally not be used in newly written code as later - * stages will almost certainly convert the pixbuf back into a texture - * to draw it on screen. - * - * Returns: (transfer full) (nullable): a new `GdkPixbuf` - */ -GdkPixbuf * -gdk_pixbuf_get_from_texture (GdkTexture *texture) -{ - GdkTextureDownloader downloader; - GBytes *bytes; - gsize stride; - gboolean alpha; - - alpha = gdk_memory_format_alpha (gdk_texture_get_format (texture)) != GDK_MEMORY_ALPHA_OPAQUE; - - gdk_texture_downloader_init (&downloader, texture); - gdk_texture_downloader_set_format (&downloader, - alpha ? GDK_MEMORY_GDK_PIXBUF_ALPHA - : GDK_MEMORY_GDK_PIXBUF_OPAQUE); - bytes = gdk_texture_downloader_download_bytes (&downloader, &stride); - gdk_texture_downloader_finish (&downloader); - - return gdk_pixbuf_new_from_data (g_bytes_get_data (bytes, NULL), - GDK_COLORSPACE_RGB, - alpha, - 8, - gdk_texture_get_width (texture), - gdk_texture_get_height (texture), - stride, - pixbuf_texture_unref_cb, - bytes); -} diff --git a/gdk/gdkpixbuf.h b/gdk/gdkpixbuf.h deleted file mode 100644 index 8ddd1d1da6..0000000000 --- a/gdk/gdkpixbuf.h +++ /dev/null @@ -1,46 +0,0 @@ -/* GDK - The GIMP Drawing Kit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#pragma once - -#if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION) -#error "Only can be included directly." -#endif - -#include -#include - -G_BEGIN_DECLS - -GDK_AVAILABLE_IN_ALL -GdkPixbuf *gdk_pixbuf_get_from_surface (cairo_surface_t *surface, - int src_x, - int src_y, - int width, - int height); -GDK_AVAILABLE_IN_ALL -GdkPixbuf *gdk_pixbuf_get_from_texture (GdkTexture *texture); - -G_END_DECLS - diff --git a/gdk/meson.build b/gdk/meson.build index 77d0fbd293..6b2f50950d 100644 --- a/gdk/meson.build +++ b/gdk/meson.build @@ -1,3 +1,5 @@ +subdir('deprecated') + gdk_public_sources = files([ 'gdk.c', 'gdkapplaunchcontext.c', @@ -38,7 +40,6 @@ gdk_public_sources = files([ 'gdkmonitor.c', 'gdkpaintable.c', 'gdkpango.c', - 'gdkpixbuf.c', 'gdkpipeiostream.c', 'gdkrectangle.c', 'gdkrgba.c', @@ -94,7 +95,6 @@ gdk_public_headers = files([ 'gdkmonitor.h', 'gdkpaintable.h', 'gdkpango.h', - 'gdkpixbuf.h', 'gdkrectangle.h', 'gdkrgba.h', 'gdkseat.h', @@ -112,8 +112,9 @@ gdk_public_headers = files([ 'gdkdragsurface.h', ]) install_headers(gdk_public_headers, subdir: 'gtk-4.0/gdk/') +install_headers(gdk_deprecated_headers, subdir: 'gtk-4.0/gdk/deprecated') -gdk_sources = gdk_public_sources +gdk_sources = gdk_public_sources + gdk_deprecated_sources gdk_private_h_sources = files([ 'gdkeventsprivate.h',