mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 17:18:42 +02:00
boilerplate: Exercise RENDER capable windows.
Ensure that the drivers actually work when rendering to a normal window.
This commit is contained in:
parent
2dc42af942
commit
dd0866cdc8
1 changed files with 107 additions and 0 deletions
|
|
@ -241,6 +241,101 @@ _cairo_boilerplate_xlib_create_surface (const char *name,
|
|||
return surface;
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
_cairo_boilerplate_xlib_window_create_surface (const char *name,
|
||||
cairo_content_t content,
|
||||
double width,
|
||||
double height,
|
||||
double max_width,
|
||||
double max_height,
|
||||
cairo_boilerplate_mode_t mode,
|
||||
int id,
|
||||
void **closure)
|
||||
{
|
||||
xlib_target_closure_t *xtc;
|
||||
Display *dpy;
|
||||
Screen *scr;
|
||||
int screen, x, y;
|
||||
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;
|
||||
}
|
||||
|
||||
/* tile the windows so threads do not overlap */
|
||||
scr = XScreenOfDisplay (dpy, screen);
|
||||
x = y = 0;
|
||||
if (id-- > 1) do {
|
||||
x += max_width;
|
||||
if (x + max_width > WidthOfScreen (scr)) {
|
||||
x = 0;
|
||||
y += max_height;
|
||||
if (y + max_height > HeightOfScreen (scr)) {
|
||||
XCloseDisplay (dpy);
|
||||
free (xtc);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
} while (--id);
|
||||
|
||||
attr.override_redirect = True;
|
||||
xtc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy),
|
||||
x, y,
|
||||
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);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
cairo_status_t
|
||||
cairo_boilerplate_xlib_surface_disable_render (cairo_surface_t *abstract_surface)
|
||||
{
|
||||
|
|
@ -416,6 +511,18 @@ static const cairo_boilerplate_target_t targets[] = {
|
|||
},
|
||||
#endif
|
||||
#if CAIRO_HAS_XLIB_SURFACE
|
||||
{
|
||||
"xlib-window", "xlib", NULL, NULL,
|
||||
CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 1,
|
||||
"cairo_xlib_surface_create",
|
||||
_cairo_boilerplate_xlib_window_create_surface,
|
||||
NULL, NULL,
|
||||
_cairo_boilerplate_get_image_surface,
|
||||
cairo_surface_write_to_png,
|
||||
_cairo_boilerplate_xlib_cleanup,
|
||||
_cairo_boilerplate_xlib_synchronize,
|
||||
FALSE, FALSE, FALSE
|
||||
},
|
||||
/* This is a fallback surface which uses xlib fallbacks instead of
|
||||
* the Render extension. */
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue