Fixes for gdk_memory_texture_new_subtexture
authorMatthias Clasen <mclasen@redhat.com>
Sun, 8 May 2022 17:53:04 +0000 (13:53 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 13 May 2022 13:30:46 +0000 (09:30 -0400)
There were several mistakes here.

The width of subtextures was set to the width of
the main texture, the data size wasn't properly
calculated, and the preconditions were inverted.
Yay us!

gdk/gdkmemorytexture.c

index c9aecd5cea0d418127d6ef8f02fc256c4f68c0c4..e241ebd0a3a864e3743a55412a253e41eb20ce41 100644 (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);