summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-display.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-22 10:41:37 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-22 10:41:37 +0000
commit3d499ea901b3a76cd765ddce9f4e7d3acebd1bd3 (patch)
treee49b7204c313bc2f0387a74e8df08f643f0204be /src/cairo-xlib-display.c
parent73df8eb8db521585f1ac6abb053843b5717cd27e (diff)
downloadcairo-3d499ea901b3a76cd765ddce9f4e7d3acebd1bd3.tar.gz
xlib: Replace obsolete disable-xrender with shiny new device debug interface
As prototyped with xcb. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-xlib-display.c')
-rw-r--r--src/cairo-xlib-display.c57
1 files changed, 50 insertions, 7 deletions
diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c
index fd7253cc2..65cd3fbea 100644
--- a/src/cairo-xlib-display.c
+++ b/src/cairo-xlib-display.c
@@ -146,6 +146,17 @@ static const cairo_device_backend_t _cairo_xlib_device_backend = {
_cairo_xlib_display_destroy,
};
+
+static void _cairo_xlib_display_select_compositor (cairo_xlib_display_t *display)
+{
+ if (display->render_major > 0 || display->render_minor >= 4)
+ display->compositor = _cairo_xlib_traps_compositor_get ();
+ else if (display->render_major > 0 || display->render_minor >= 0)
+ display->compositor = _cairo_xlib_mask_compositor_get ();
+ else
+ display->compositor = _cairo_xlib_core_compositor_get ();
+}
+
/**
* cairo_xlib_device_create:
* @dpy: the display to create the device for
@@ -221,6 +232,8 @@ _cairo_xlib_device_create (Display *dpy)
}
}
+ _cairo_xlib_display_select_compositor (display);
+
codes = XAddExtension (dpy);
if (unlikely (codes == NULL)) {
device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY);
@@ -331,13 +344,6 @@ _cairo_xlib_device_create (Display *dpy)
display->buggy_pad_reflect = TRUE;
}
- if (display->render_major > 0 || display->render_minor >= 4)
- display->compositor = _cairo_xlib_traps_compositor_get ();
- else if (display->render_major > 0 || display->render_minor >= 0)
- display->compositor = _cairo_xlib_mask_compositor_get ();
- else
- display->compositor = _cairo_xlib_core_compositor_get ();
-
display->next = _cairo_xlib_display_list;
_cairo_xlib_display_list = display;
@@ -552,6 +558,43 @@ _cairo_xlib_display_has_gradients (cairo_device_t *device)
return ! ((cairo_xlib_display_t *) device)->buggy_gradients;
}
+/**
+ * cairo_xlib_device_debug_cap_xrender_version:
+ * @device: a #cairo_device_t for the XCB backend
+ * @major_version: major version to restrict to
+ * @minor_version: minor version to restrict to
+ *
+ * Restricts all future XCB surfaces for this devices to the specified version
+ * of the RENDER extension. This function exists solely for debugging purpose.
+ * It let's you find out how cairo would behave with an older version of
+ * the RENDER extension.
+ *
+ * Use the special values -1 and -1 for disabling the RENDER extension.
+ **/
+void
+cairo_xlib_device_debug_cap_xrender_version (cairo_device_t *device,
+ int major_version,
+ int minor_version)
+{
+ cairo_xlib_display_t *display = (cairo_xlib_display_t *) device;
+
+ if (device == NULL || device->status)
+ return;
+
+ if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB)
+ return;
+
+ if (major_version < display->render_major ||
+ (major_version == display->render_major &&
+ minor_version < display->render_minor))
+ {
+ display->render_major = major_version;
+ display->render_minor = minor_version;
+ }
+
+ _cairo_xlib_display_select_compositor (display);
+}
+
void
cairo_xlib_device_debug_set_precision (cairo_device_t *device,
int precision)