mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 02:40:11 +00:00
gdkcairo: Bail if surface is in error
Don't try to paint onto an error surface. This happens for example when gdk_cairo_set_source_pixbuf() is called with a pixbuf that is too big for Cairo to handle. Spotted by Christian Boxdörfer
This commit is contained in:
parent
0ab48fcc42
commit
40f2af665d
@ -185,6 +185,9 @@ gdk_cairo_surface_paint_pixbuf (cairo_surface_t *surface,
|
||||
int n_channels;
|
||||
int j;
|
||||
|
||||
if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
|
||||
return;
|
||||
|
||||
/* This function can't just copy any pixbuf to any surface, be
|
||||
* sure to read the invariants here before calling it */
|
||||
|
||||
|
@ -18,10 +18,11 @@ LDADD = \
|
||||
#TEST_PROGS += check-gdk-cairo
|
||||
|
||||
TEST_PROGS += \
|
||||
rgba \
|
||||
encoding \
|
||||
cairo \
|
||||
display \
|
||||
encoding \
|
||||
keysyms \
|
||||
rgba \
|
||||
$(NULL)
|
||||
|
||||
CLEANFILES = \
|
||||
|
40
testsuite/gdk/cairo.c
Normal file
40
testsuite/gdk/cairo.c
Normal file
@ -0,0 +1,40 @@
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
static void
|
||||
test_set_source_big_pixbuf (void)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
GdkPixbuf *pixbuf;
|
||||
cairo_t *cr;
|
||||
|
||||
#define WAY_TOO_BIG 65540
|
||||
|
||||
/* Check that too big really is to big.
|
||||
* If this check fails, somebody improved Cairo and this test is useless.
|
||||
*/
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WAY_TOO_BIG, 1);
|
||||
g_assert_cmpint (cairo_surface_status (surface), !=, CAIRO_STATUS_SUCCESS);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 10, 10);
|
||||
cr = cairo_create (surface);
|
||||
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, WAY_TOO_BIG, 1);
|
||||
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
|
||||
g_assert_cmpint (cairo_status (cr), !=, CAIRO_STATUS_SUCCESS);
|
||||
|
||||
g_object_unref (pixbuf);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
gdk_init (&argc, &argv);
|
||||
|
||||
g_test_add_func ("/drawing/set-source-big-pixbuf", test_set_source_big_pixbuf);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user