static cairo_surface_t * _cairo_boilerplate_xlib_render_0_0_create_surface (const char *name, cairo_content_t content, double width, double height, double max_width, double max_height, cairo_boilerplate_mode_t mode, void **closure) { xlib_target_closure_t *xtc; Display *dpy; int screen; Pixmap pixmap; cairo_surface_t *surface, *dummy; *closure = xtc = xcalloc (1, sizeof (xlib_target_closure_t)); width = ceil (width); if (width < 1) width = 1; height = ceil (height); if (height < 1) height = 1; xtc->dpy = dpy = XOpenDisplay (NULL); if (xtc->dpy == NULL) { free (xtc); CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); return NULL; } screen = DefaultScreen (dpy); pixmap = XCreatePixmap (dpy, DefaultRootWindow (dpy), 1, 1, DefaultDepth (dpy, screen)); dummy = cairo_xlib_surface_create (dpy, pixmap, DefaultVisual (dpy, screen), 1, 1); cairo_xlib_device_debug_cap_xrender_version (cairo_surface_get_device (dummy), 0, 0); if (mode == CAIRO_BOILERPLATE_MODE_TEST) surface = _cairo_boilerplate_xlib_test_create_surface (dpy, content, width, height, xtc); else /* mode == CAIRO_BOILERPLATE_MODE_PERF */ surface = _cairo_boilerplate_xlib_perf_create_surface (dpy, content, width, height, xtc); cairo_surface_destroy (dummy); XFreePixmap (dpy, pixmap); if (surface == NULL || cairo_surface_status (surface)) _cairo_boilerplate_xlib_cleanup (xtc); return surface; }
static cairo_surface_t * _cairo_boilerplate_xlib_create_surface (const char *name, cairo_content_t content, double width, double height, double max_width, double max_height, cairo_boilerplate_mode_t mode, void **closure) { xlib_target_closure_t *xtc; Display *dpy; cairo_surface_t *surface; *closure = xtc = xcalloc (1, sizeof (xlib_target_closure_t)); width = ceil (width); if (width < 1) width = 1; height = ceil (height); if (height < 1) height = 1; xtc->dpy = dpy = XOpenDisplay (NULL); if (xtc->dpy == NULL) { free (xtc); CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); return NULL; } if (mode == CAIRO_BOILERPLATE_MODE_TEST) surface = _cairo_boilerplate_xlib_test_create_surface (dpy, content, width, height, xtc); else /* mode == CAIRO_BOILERPLATE_MODE_PERF */ surface = _cairo_boilerplate_xlib_perf_create_surface (dpy, content, width, height, xtc); if (surface == NULL || cairo_surface_status (surface)) _cairo_boilerplate_xlib_cleanup (xtc); return surface; }
/* The xlib-fallback target differs from the xlib target in two ways: * * 1. It creates its surfaces without relying on the Render extension * * 2. It disables use of the Render extension for its surfaces * * This provides testing of the non-Render fallback paths we have in * cairo-xlib-surface.c */ static cairo_surface_t * _cairo_boilerplate_xlib_fallback_create_surface (const char *name, cairo_content_t content, double width, double height, double max_width, double max_height, cairo_boilerplate_mode_t mode, void **closure) { xlib_target_closure_t *xtc; Display *dpy; int screen; XSetWindowAttributes attr; cairo_surface_t *surface; /* We're not yet bothering to support perf mode for the * xlib-fallback surface. */ if (mode == CAIRO_BOILERPLATE_MODE_PERF) return NULL; /* We also don't support drawing with destination-alpha in the * xlib-fallback surface. */ if (content == CAIRO_CONTENT_COLOR_ALPHA) return NULL; *closure = xtc = xmalloc (sizeof (xlib_target_closure_t)); width = ceil (width); if (width < 1) width = 1; height = ceil (height); if (height < 1) height = 1; xtc->dpy = dpy = XOpenDisplay (NULL); if (xtc->dpy == NULL) { CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); free (xtc); return NULL; } /* This kills performance, but it makes debugging much * easier. That's why we have it here only after explicitly not * supporting PERF mode.*/ XSynchronize (dpy, 1); screen = DefaultScreen (dpy); if (! _cairo_boilerplate_xlib_check_screen_size (dpy, screen, width, height)) { CAIRO_BOILERPLATE_DEBUG (("Surface is larger than the Screen.\n")); XCloseDisplay (dpy); free (xtc); return NULL; } attr.override_redirect = True; xtc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, width, height, 0, DefaultDepth (dpy, screen), InputOutput, DefaultVisual (dpy, screen), CWOverrideRedirect, &attr); XMapWindow (dpy, xtc->drawable); xtc->drawable_is_pixmap = FALSE; surface = cairo_xlib_surface_create (dpy, xtc->drawable, DefaultVisual (dpy, screen), width, height); if (cairo_surface_status (surface)) _cairo_boilerplate_xlib_cleanup (xtc); else cairo_boilerplate_xlib_surface_disable_render (surface); _cairo_boilerplate_xlib_setup_test_surface(surface); return surface; }