Merge branch 'texture-fixes' into 'main'

Fixes for gdk_memory_texture_new_subtexture

See merge request GNOME/gtk!4724
This commit is contained in:
Matthias Clasen 2022-05-13 16:38:45 +00:00
commit 4278e91a46
3 changed files with 62 additions and 9 deletions

View File

@ -178,19 +178,19 @@ gdk_memory_texture_new_subtexture (GdkMemoryTexture *source,
GBytes *bytes;
g_return_val_if_fail (GDK_IS_MEMORY_TEXTURE (source), NULL);
g_return_val_if_fail (x < 0 || x >= GDK_TEXTURE (source)->width, NULL);
g_return_val_if_fail (y < 0 || y >= GDK_TEXTURE (source)->height, NULL);
g_return_val_if_fail (width <= 0 || x + width > GDK_TEXTURE (source)->width, NULL);
g_return_val_if_fail (height <= 0 || y + height > GDK_TEXTURE (source)->height, NULL);
g_return_val_if_fail (x >= 0 || x < GDK_TEXTURE (source)->width, NULL);
g_return_val_if_fail (y >= 0 || y < GDK_TEXTURE (source)->height, NULL);
g_return_val_if_fail (width > 0 || x + width <= GDK_TEXTURE (source)->width, NULL);
g_return_val_if_fail (height > 0 || y + height <= GDK_TEXTURE (source)->height, NULL);
texture = GDK_TEXTURE (source);
bpp = gdk_memory_format_bytes_per_pixel (texture->format);
offset = y * source->stride + x * bpp;
size = source->stride * (height - 1) + x * bpp;
size = source->stride * (height - 1) + width * bpp;
bytes = g_bytes_new_from_bytes (source->bytes, offset, size);
result = gdk_memory_texture_new (texture->width,
texture->height,
result = gdk_memory_texture_new (width,
height,
texture->format,
bytes,
source->stride);

View File

@ -26,7 +26,6 @@ tests = [
{ 'name': 'rectangle' },
{ 'name': 'rgba' },
{ 'name': 'seat' },
{ 'name': 'texture' },
{ 'name': 'texture-threads' },
]
@ -54,7 +53,8 @@ foreach t : tests
endforeach
internal_tests = [
'image'
'image',
'texture',
]
foreach t : internal_tests

View File

@ -1,5 +1,7 @@
#include <gtk.h>
#include "gdk/gdkmemorytextureprivate.h"
static void
compare_pixels (int width,
int height,
@ -108,6 +110,56 @@ test_texture_save_to_png (void)
g_object_unref (texture2);
}
static void
test_texture_subtexture (void)
{
cairo_t *cr;
cairo_surface_t *surface;
cairo_pattern_t *pattern;
GdkTexture *texture, *subtexture;
guchar *data, *subdata;
gsize stride, substride;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 64, 64);
cr = cairo_create (surface);
pattern = cairo_pattern_create_linear (0, 0, 64, 64);
cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 0, 0, 0.2);
cairo_pattern_add_color_stop_rgba (pattern, 1, 1, 0, 1, 1);
cairo_set_source (cr, pattern);
cairo_paint (cr);
texture = gdk_texture_new_for_surface (surface);
cairo_pattern_destroy (pattern);
cairo_destroy (cr);
cairo_surface_destroy (surface);
subtexture = gdk_memory_texture_new_subtexture (GDK_MEMORY_TEXTURE (texture), 0, 0, 32, 32);
g_assert_cmpint (gdk_texture_get_width (subtexture), ==, 32);
g_assert_cmpint (gdk_texture_get_height (subtexture), ==, 32);
data = g_new0 (guchar, 64 * 64 * 4);
stride = 64 * 4;
gdk_texture_download (texture, data, stride);
subdata = g_new0 (guchar, 32 * 32 * 4);
substride = 32 * 4;
gdk_texture_download (subtexture, subdata, substride);
compare_pixels (32, 32,
data, stride,
subdata, substride);
g_free (data);
g_free (subdata);
g_object_unref (subtexture);
g_object_unref (texture);
}
int
main (int argc, char *argv[])
{
@ -117,6 +169,7 @@ main (int argc, char *argv[])
g_test_add_func ("/texture/from-pixbuf", test_texture_from_pixbuf);
g_test_add_func ("/texture/from-resource", test_texture_from_resource);
g_test_add_func ("/texture/save-to-png", test_texture_save_to_png);
g_test_add_func ("/texture/subtexture", test_texture_subtexture);
return g_test_run ();
}