mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 22:20:24 +00:00
Merge branch 'texture-fixes' into 'main'
Fixes for gdk_memory_texture_new_subtexture See merge request GNOME/gtk!4724
This commit is contained in:
commit
4278e91a46
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user