diff --git a/ChangeLog b/ChangeLog index f3b84da69..7ebb9236f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-07-27 Carl Worth + + * src/cairo-png.c: (cairo_image_surface_create_from_png_stream): + Fix typo that caused cairo_image_surface_create_from_png_stream to + segfault. Closes bug #3863 (thanks to Steve Chaplin). + + * test/.cvsignore: + * test/Makefile.am: + * test/create-from-png-stream-ref.png: + * test/create-from-png-stream.c: + * test/create-from-png.c: Add a test to actually call + cairo_image_surface_create_from_png_stream. + 2005-07-27 Owen Taylor * src/cairo-xlib-surface.c (_xlib_glyphset_cache_create_entry): Deal diff --git a/src/cairo-png.c b/src/cairo-png.c index 532054e51..0d8643034 100644 --- a/src/cairo-png.c +++ b/src/cairo-png.c @@ -489,6 +489,6 @@ cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, png_closure.read_func = read_func; png_closure.closure = closure; - return read_png (stream_read_func, &closure); + return read_png (stream_read_func, &png_closure); } diff --git a/test/.cvsignore b/test/.cvsignore index 00ed2feca..737214930 100644 --- a/test/.cvsignore +++ b/test/.cvsignore @@ -9,6 +9,7 @@ composite-integer-translate-over composite-integer-translate-over-repeat coverage create-from-png +create-from-png-stream fill-and-stroke fill-rule filter-nearest-offset diff --git a/test/Makefile.am b/test/Makefile.am index edafa6850..b2b9e630f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -6,6 +6,7 @@ composite-integer-translate-source \ composite-integer-translate-over \ composite-integer-translate-over-repeat \ create-from-png \ +create-from-png-stream \ fill-and-stroke \ fill-rule \ filter-nearest-offset \ @@ -59,6 +60,7 @@ composite-integer-translate-source-ref.png \ composite-integer-translate-over-ref.png \ composite-integer-translate-over-repeat-ref.png \ create-from-png-ref.png \ +create-from-png-stream-ref.png \ fill-and-stroke-ref.png \ fill-rule-ref.png \ filter-nearest-offset-ref.png \ @@ -143,6 +145,7 @@ composite_integer_translate_source_LDADD = $(LDADDS) composite_integer_translate_over_LDADD = $(LDADDS) composite_integer_translate_over_repeat_LDADD = $(LDADDS) create_from_png_LDADD = $(LDADDS) +create_from_png_stream_LDADD = $(LDADDS) fill_and_stroke_LDADD = $(LDADDS) fill_rule_LDADD = $(LDADDS) filter_nearest_offset_LDADD = $(LDADDS) diff --git a/test/create-from-png-stream-ref.png b/test/create-from-png-stream-ref.png new file mode 100644 index 000000000..765adc4a4 Binary files /dev/null and b/test/create-from-png-stream-ref.png differ diff --git a/test/create-from-png-stream.c b/test/create-from-png-stream.c new file mode 100644 index 000000000..75c70a563 --- /dev/null +++ b/test/create-from-png-stream.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +#include +#include + +#define WIDTH 2 +#define HEIGHT 2 + +cairo_test_t test = { + "create-from-png", + "Tests the creation of an image surface from a PNG file", + WIDTH, HEIGHT +}; + +static cairo_status_t +read_png_from_file (void *closure, unsigned char *data, unsigned int length) +{ + FILE *file = closure; + size_t bytes_read; + + bytes_read = fread (data, 1, length, file); + if (bytes_read != length) + return CAIRO_STATUS_READ_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + char *srcdir = getenv ("srcdir"); + char *filename; + FILE *file; + cairo_surface_t *surface; + + xasprintf (&filename, "%s/%s", srcdir ? srcdir : ".", + "create-from-png-stream-ref.png"); + + file = fopen (filename, "r"); + if (file == NULL) { + cairo_test_log ("Error: failed to open file: %s\n", filename); + return CAIRO_TEST_FAILURE; + } + + surface = cairo_image_surface_create_from_png_stream (read_png_from_file, + file); + + fclose (file); + + if (surface == NULL) { + cairo_test_log ("Error: failed to create surface from PNG: %s\n", filename); + free (filename); + return CAIRO_TEST_FAILURE; + } + + free (filename); + + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +int +main (void) +{ + return cairo_test (&test, draw); +} diff --git a/test/create-from-png.c b/test/create-from-png.c index f4fd1b934..f0eb0688c 100644 --- a/test/create-from-png.c +++ b/test/create-from-png.c @@ -47,13 +47,15 @@ draw (cairo_t *cr, int width, int height) "create-from-png-ref.png"); surface = cairo_image_surface_create_from_png (filename); - free (filename); if (surface == NULL) { cairo_test_log ("Error: failed to open file %s\n", filename); + free (filename); return CAIRO_TEST_FAILURE; } + free (filename); + cairo_set_source_surface (cr, surface, 0, 0); cairo_paint (cr);