From 06b657ccf129f6f154c0db7886e5cca6191f93ca Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 19 Apr 2007 22:20:38 -0400 Subject: [PATCH] [boilerplate] Strip xcb boilerplate into cairo-boilerplate-xcb* --- boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-xcb-private.h | 44 ++++++++ boilerplate/cairo-boilerplate-xcb.c | 115 ++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 90 +-------------- 4 files changed, 167 insertions(+), 87 deletions(-) create mode 100644 boilerplate/cairo-boilerplate-xcb-private.h create mode 100644 boilerplate/cairo-boilerplate-xcb.c diff --git a/boilerplate/Makefile.am b/boilerplate/Makefile.am index 296864848..1e85c4049 100644 --- a/boilerplate/Makefile.am +++ b/boilerplate/Makefile.am @@ -39,6 +39,11 @@ libcairoboilerplate_la_SOURCES += cairo-boilerplate-svg.c libcairoboilerplate_la_SOURCES += cairo-boilerplate-svg-private.h endif +if CAIRO_HAS_XCB_SURFACE +libcairoboilerplate_la_SOURCES += cairo-boilerplate-xcb.c +libcairoboilerplate_la_SOURCES += cairo-boilerplate-xcb-private.h +endif + if CAIRO_HAS_XLIB_XRENDER_SURFACE libcairoboilerplate_la_SOURCES += cairo-boilerplate-xlib.c libcairoboilerplate_la_SOURCES += cairo-boilerplate-xlib-private.h diff --git a/boilerplate/cairo-boilerplate-xcb-private.h b/boilerplate/cairo-boilerplate-xcb-private.h new file mode 100644 index 000000000..80717e989 --- /dev/null +++ b/boilerplate/cairo-boilerplate-xcb-private.h @@ -0,0 +1,44 @@ +/* -*- 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 + */ + +#ifndef _CAIRO_BOILERPLATE_XCB_PRIVATE_H_ +#define _CAIRO_BOILERPLATE_XCB_PRIVATE_H_ + +cairo_surface_t * +_cairo_boilerplate_xcb_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure); + +void +_cairo_boilerplate_xcb_cleanup (void *closure); + +void +_cairo_boilerplate_xcb_synchronize (void *closure); + +#endif diff --git a/boilerplate/cairo-boilerplate-xcb.c b/boilerplate/cairo-boilerplate-xcb.c new file mode 100644 index 000000000..2cc88cdea --- /dev/null +++ b/boilerplate/cairo-boilerplate-xcb.c @@ -0,0 +1,115 @@ +/* -*- 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 + */ + +#include "cairo-boilerplate.h" +#include "cairo-boilerplate-xcb-private.h" + +#include "cairo-xcb-xrender.h" + +#include + +typedef struct _xcb_target_closure +{ + xcb_connection_t *c; + xcb_pixmap_t pixmap; +} xcb_target_closure_t; + +void +_cairo_boilerplate_xcb_synchronize (void *closure) +{ + xcb_target_closure_t *xtc = closure; + free (xcb_get_image_reply (xtc->c, + xcb_get_image (xtc->c, XCB_IMAGE_FORMAT_Z_PIXMAP, + xtc->pixmap, 0, 0, 1, 1, /* AllPlanes */ ~0UL), + 0)); +} + +cairo_surface_t * +_cairo_boilerplate_xcb_create_surface (const char *name, + cairo_content_t content, + int width, + int height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_screen_t *root; + xcb_target_closure_t *xtc; + cairo_surface_t *surface; + xcb_connection_t *c; + xcb_render_pictforminfo_t *render_format; + xcb_pict_standard_t format; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect(NULL,NULL); + if (xcb_connection_has_error(c)) { + CAIRO_BOILERPLATE_LOG ("Failed to connect to X server through XCB\n"); + return NULL; + } + + root = xcb_setup_roots_iterator(xcb_get_setup(c)).data; + + xtc->pixmap = xcb_generate_id (c); + xcb_create_pixmap (c, 32, xtc->pixmap, root->root, + width, height); + + switch (content) { + case CAIRO_CONTENT_COLOR: + format = XCB_PICT_STANDARD_RGB_24; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + format = XCB_PICT_STANDARD_ARGB_32; + break; + case CAIRO_CONTENT_ALPHA: /* would be XCB_PICT_STANDARD_A_8 */ + default: + CAIRO_BOILERPLATE_LOG ("Invalid content for XCB test: %d\n", content); + return NULL; + } + + render_format = xcb_render_util_find_standard_format (xcb_render_util_query_formats (c), format); + if (render_format->id == 0) + return NULL; + surface = cairo_xcb_surface_create_with_xrender_format (c, xtc->pixmap, root, + render_format, + width, height); + + return surface; +} + +void +_cairo_boilerplate_xcb_cleanup (void *closure) +{ + xcb_target_closure_t *xtc = closure; + + xcb_free_pixmap (xtc->c, xtc->pixmap); + xcb_disconnect (xtc->c); + free (xtc); +} diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index 6a8449eb7..b6174de9d 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -65,6 +65,9 @@ #if CAIRO_HAS_XLIB_XRENDER_SURFACE #include "cairo-boilerplate-xlib-private.h" #endif +#if CAIRO_HAS_XCB_SURFACE +#include "cairo-boilerplate-xcb-private.h" +#endif /* This is copied from cairoint.h. That makes it painful to keep in * sync, but the slim stuff makes cairoint.h "hard" to include when @@ -754,93 +757,6 @@ cleanup_win32 (void *closure) } #endif -#if CAIRO_HAS_XCB_SURFACE -#include "cairo-xcb-xrender.h" -#include -typedef struct _xcb_target_closure -{ - xcb_connection_t *c; - xcb_pixmap_t pixmap; -} xcb_target_closure_t; - -static void -_cairo_boilerplate_xcb_synchronize (void *closure) -{ - xcb_target_closure_t *xtc = closure; - free (xcb_get_image_reply (xtc->c, - xcb_get_image (xtc->c, XCB_IMAGE_FORMAT_Z_PIXMAP, - xtc->pixmap, 0, 0, 1, 1, /* AllPlanes */ ~0UL), - 0)); -} - -static cairo_surface_t * -_cairo_boilerplate_xcb_create_surface (const char *name, - cairo_content_t content, - int width, - int height, - cairo_boilerplate_mode_t mode, - void **closure) -{ - xcb_screen_t *root; - xcb_target_closure_t *xtc; - cairo_surface_t *surface; - xcb_connection_t *c; - xcb_render_pictforminfo_t *render_format; - xcb_pict_standard_t format; - - *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); - - if (width == 0) - width = 1; - if (height == 0) - height = 1; - - xtc->c = c = xcb_connect(NULL,NULL); - if (xcb_connection_has_error(c)) { - CAIRO_BOILERPLATE_LOG ("Failed to connect to X server through XCB\n"); - return NULL; - } - - root = xcb_setup_roots_iterator(xcb_get_setup(c)).data; - - xtc->pixmap = xcb_generate_id (c); - xcb_create_pixmap (c, 32, xtc->pixmap, root->root, - width, height); - - switch (content) { - case CAIRO_CONTENT_COLOR: - format = XCB_PICT_STANDARD_RGB_24; - break; - case CAIRO_CONTENT_COLOR_ALPHA: - format = XCB_PICT_STANDARD_ARGB_32; - break; - case CAIRO_CONTENT_ALPHA: /* would be XCB_PICT_STANDARD_A_8 */ - default: - CAIRO_BOILERPLATE_LOG ("Invalid content for XCB test: %d\n", content); - return NULL; - } - - render_format = xcb_render_util_find_standard_format (xcb_render_util_query_formats (c), format); - if (render_format->id == 0) - return NULL; - surface = cairo_xcb_surface_create_with_xrender_format (c, xtc->pixmap, root, - render_format, - width, height); - - return surface; -} - -static void -_cairo_boilerplate_xcb_cleanup (void *closure) -{ - xcb_target_closure_t *xtc = closure; - - xcb_free_pixmap (xtc->c, xtc->pixmap); - xcb_disconnect (xtc->c); - free (xtc); -} -#endif - static cairo_boilerplate_target_t targets[] = { /* I'm uncompromising about leaving the image backend as 0