diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2007-04-20 00:45:42 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2007-04-20 00:52:04 -0400 |
commit | 97624dc488b41eb83d70b2c44a595daa5d833e7f (patch) | |
tree | fd59a544875bd81bcfad7c4079e181ba35c04d0f /boilerplate | |
parent | 2e709321d858a048731eeaaca4a13a96de739e3f (diff) |
[boilerplate] Strip test-surfaces boilerplate into cairo-boilerplate-test-surfaces*
Diffstat (limited to 'boilerplate')
-rw-r--r-- | boilerplate/Makefile.am | 5 | ||||
-rw-r--r-- | boilerplate/cairo-boilerplate-test-surfaces-private.h | 63 | ||||
-rw-r--r-- | boilerplate/cairo-boilerplate-test-surfaces.c | 170 | ||||
-rw-r--r-- | boilerplate/cairo-boilerplate.c | 146 |
4 files changed, 241 insertions, 143 deletions
diff --git a/boilerplate/Makefile.am b/boilerplate/Makefile.am index b588a200a..b541af3d6 100644 --- a/boilerplate/Makefile.am +++ b/boilerplate/Makefile.am @@ -56,6 +56,11 @@ libcairoboilerplate_la_SOURCES += cairo-boilerplate-svg.c libcairoboilerplate_la_SOURCES += cairo-boilerplate-svg-private.h endif +if CAIRO_HAS_TEST_SURFACES +libcairoboilerplate_la_SOURCES += cairo-boilerplate-test-surfaces.c +libcairoboilerplate_la_SOURCES += cairo-boilerplate-test-surfaces-private.h +endif + if CAIRO_HAS_WIN32_SURFACE libcairoboilerplate_la_SOURCES += cairo-boilerplate-win32.c libcairoboilerplate_la_SOURCES += cairo-boilerplate-win32-private.h diff --git a/boilerplate/cairo-boilerplate-test-surfaces-private.h b/boilerplate/cairo-boilerplate-test-surfaces-private.h new file mode 100644 index 000000000..1b8222618 --- /dev/null +++ b/boilerplate/cairo-boilerplate-test-surfaces-private.h @@ -0,0 +1,63 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 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 D. Worth <cworth@cworth.org> + */ + +#ifndef _CAIRO_BOILERPLATE_TEST_SURFACES_PRIVATE_H_ +#define _CAIRO_BOILERPLATE_TEST_SURFACES_PRIVATE_H_ + +cairo_surface_t * +_cairo_boilerplate_test_fallback_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure); + + +cairo_surface_t * +_cairo_boilerplate_test_meta_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure); + + +cairo_surface_t * +_cairo_boilerplate_test_paginated_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure); + +cairo_status_t +_cairo_boilerplate_test_paginated_surface_write_to_png (cairo_surface_t *surface, + const char *filename); + +void +_cairo_boilerplate_test_paginated_cleanup (void *closure); + +#endif diff --git a/boilerplate/cairo-boilerplate-test-surfaces.c b/boilerplate/cairo-boilerplate-test-surfaces.c new file mode 100644 index 000000000..ab202d51e --- /dev/null +++ b/boilerplate/cairo-boilerplate-test-surfaces.c @@ -0,0 +1,170 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 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 D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate.h" +#include "cairo-boilerplate-test-surfaces-private.h" + +#include <test-fallback-surface.h> +#include <test-meta-surface.h> +#include <test-paginated-surface.h> + +#include <assert.h> + +cairo_surface_t * +_cairo_boilerplate_test_fallback_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_fallback_surface_create (content, width, height); +} + +cairo_surface_t * +_cairo_boilerplate_test_meta_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_meta_surface_create (content, width, height); +} + +static const cairo_user_data_key_t test_paginated_closure_key; + +typedef struct { + unsigned char *data; + cairo_content_t content; + int width; + int height; + int stride; +} test_paginated_closure_t; + +cairo_surface_t * +_cairo_boilerplate_test_paginated_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + test_paginated_closure_t *tpc; + cairo_surface_t *surface; + + *closure = tpc = xmalloc (sizeof (test_paginated_closure_t)); + + tpc->content = content; + tpc->width = width; + tpc->height = height; + tpc->stride = width * 4; + + tpc->data = xcalloc (tpc->stride * height, 1); + + surface = _cairo_test_paginated_surface_create_for_data (tpc->data, + tpc->content, + tpc->width, + tpc->height, + tpc->stride); + + cairo_boilerplate_surface_set_user_data (surface, + &test_paginated_closure_key, + tpc, NULL); + + return surface; +} + +/* The only reason we go through all these machinations to write a PNG + * image is to _really ensure_ that the data actually landed in our + * buffer through the paginated surface to the test_paginated_surface. + * + * If we didn't implement this function then the default + * cairo_surface_write_to_png would result in the paginated_surface's + * acquire_source_image function replaying the meta-surface to an + * intermediate image surface. And in that case the + * test_paginated_surface would not be involved and wouldn't be + * tested. + */ +cairo_status_t +_cairo_boilerplate_test_paginated_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + cairo_surface_t *image; + cairo_format_t format; + test_paginated_closure_t *tpc; + cairo_status_t status; + + /* show page first. the automatic show_page is too late for us */ + /* XXX use cairo_surface_show_page() when that's added */ + cairo_t *cr = cairo_create (surface); + cairo_show_page (cr); + cairo_destroy (cr); + + tpc = cairo_surface_get_user_data (surface, &test_paginated_closure_key); + + switch (tpc->content) { + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + format = CAIRO_FORMAT_ARGB32; + break; + case CAIRO_CONTENT_ALPHA: + default: + assert (0); /* not reached */ + return CAIRO_STATUS_NO_MEMORY; + } + + image = cairo_image_surface_create_for_data (tpc->data, + format, + tpc->width, + tpc->height, + tpc->stride); + + status = cairo_surface_write_to_png (image, filename); + if (status) { + CAIRO_BOILERPLATE_LOG ("Error writing %s: %s. Exiting\n", + filename, + cairo_status_to_string (status)); + exit (1); + } + + cairo_surface_destroy (image); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_boilerplate_test_paginated_cleanup (void *closure) +{ + test_paginated_closure_t *tpc = closure; + + free (tpc->data); + free (tpc); +} diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index 57e8312f5..6165d7e59 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -47,6 +47,9 @@ #if CAIRO_HAS_SVG_SURFACE #include "cairo-boilerplate-svg-private.h" #endif +#ifdef CAIRO_HAS_TEST_SURFACES +#include "cairo-boilerplate-test-surfaces-private.h" +#endif #if CAIRO_HAS_WIN32_SURFACE #include "cairo-boilerplate-win32-private.h" #endif @@ -120,149 +123,6 @@ _cairo_boilerplate_image_create_surface (const char *name, return cairo_image_surface_create (format, width, height); } -#ifdef CAIRO_HAS_TEST_SURFACES - -#include <test-fallback-surface.h> -#include <test-meta-surface.h> -#include <test-paginated-surface.h> - -static cairo_surface_t * -_cairo_boilerplate_test_fallback_create_surface (const char *name, - cairo_content_t content, - int width, - int height, - cairo_boilerplate_mode_t mode, - void **closure) -{ - *closure = NULL; - return _cairo_test_fallback_surface_create (content, width, height); -} - -static cairo_surface_t * -_cairo_boilerplate_test_meta_create_surface (const char *name, - cairo_content_t content, - int width, - int height, - cairo_boilerplate_mode_t mode, - void **closure) -{ - *closure = NULL; - return _cairo_test_meta_surface_create (content, width, height); -} - -static const cairo_user_data_key_t test_paginated_closure_key; - -typedef struct { - unsigned char *data; - cairo_content_t content; - int width; - int height; - int stride; -} test_paginated_closure_t; - -static cairo_surface_t * -_cairo_boilerplate_test_paginated_create_surface (const char *name, - cairo_content_t content, - int width, - int height, - cairo_boilerplate_mode_t mode, - void **closure) -{ - test_paginated_closure_t *tpc; - cairo_surface_t *surface; - - *closure = tpc = xmalloc (sizeof (test_paginated_closure_t)); - - tpc->content = content; - tpc->width = width; - tpc->height = height; - tpc->stride = width * 4; - - tpc->data = xcalloc (tpc->stride * height, 1); - - surface = _cairo_test_paginated_surface_create_for_data (tpc->data, - tpc->content, - tpc->width, - tpc->height, - tpc->stride); - - cairo_boilerplate_surface_set_user_data (surface, - &test_paginated_closure_key, - tpc, NULL); - - return surface; -} - -/* The only reason we go through all these machinations to write a PNG - * image is to _really ensure_ that the data actually landed in our - * buffer through the paginated surface to the test_paginated_surface. - * - * If we didn't implement this function then the default - * cairo_surface_write_to_png would result in the paginated_surface's - * acquire_source_image function replaying the meta-surface to an - * intermediate image surface. And in that case the - * test_paginated_surface would not be involved and wouldn't be - * tested. - */ -static cairo_status_t -_cairo_boilerplate_test_paginated_surface_write_to_png (cairo_surface_t *surface, - const char *filename) -{ - cairo_surface_t *image; - cairo_format_t format; - test_paginated_closure_t *tpc; - cairo_status_t status; - - /* show page first. the automatic show_page is too late for us */ - /* XXX use cairo_surface_show_page() when that's added */ - cairo_t *cr = cairo_create (surface); - cairo_show_page (cr); - cairo_destroy (cr); - - tpc = cairo_surface_get_user_data (surface, &test_paginated_closure_key); - - switch (tpc->content) { - case CAIRO_CONTENT_COLOR: - format = CAIRO_FORMAT_RGB24; - break; - case CAIRO_CONTENT_COLOR_ALPHA: - format = CAIRO_FORMAT_ARGB32; - break; - case CAIRO_CONTENT_ALPHA: - default: - assert (0); /* not reached */ - return CAIRO_STATUS_NO_MEMORY; - } - - image = cairo_image_surface_create_for_data (tpc->data, - format, - tpc->width, - tpc->height, - tpc->stride); - - status = cairo_surface_write_to_png (image, filename); - if (status) { - CAIRO_BOILERPLATE_LOG ("Error writing %s: %s. Exiting\n", - filename, - cairo_status_to_string (status)); - exit (1); - } - - cairo_surface_destroy (image); - - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_boilerplate_test_paginated_cleanup (void *closure) -{ - test_paginated_closure_t *tpc = closure; - - free (tpc->data); - free (tpc); -} - -#endif static cairo_boilerplate_target_t targets[] = { |