summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUli Schlachter <psychon@znc.in>2011-12-05 22:48:56 +0100
committerUli Schlachter <psychon@znc.in>2011-12-05 22:48:56 +0100
commit9ec5e9fee64cb9dd835477e3565170c522863ea9 (patch)
treee5da7858994bec346b440a2f8f961155f3e0d3e3
parent3dbb0f17a74e98ecf790e9d2c9fb8622e3928486 (diff)
xcb: Fixup some internal state in set_{drawable,size}
Signed-off-by: Uli Schlachter <psychon@znc.in>
-rw-r--r--src/cairo-surface.c2
-rw-r--r--src/cairo-xcb-surface.c28
-rw-r--r--src/cairoint.h3
-rw-r--r--test/api-special-cases.c8
4 files changed, 37 insertions, 4 deletions
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index a7e04306..88f306a6 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -380,7 +380,7 @@ _cairo_surface_has_snapshot (cairo_surface_t *surface,
return NULL;
}
-static void
+void
_cairo_surface_begin_modification (cairo_surface_t *surface)
{
assert (surface->status == CAIRO_STATUS_SUCCESS);
diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
index fd825149..282b8f86 100644
--- a/src/cairo-xcb-surface.c
+++ b/src/cairo-xcb-surface.c
@@ -1379,6 +1379,18 @@ cairo_xcb_surface_create_with_xrender_format (xcb_connection_t *connection,
slim_hidden_def (cairo_xcb_surface_create_with_xrender_format);
#endif
+/* This does the necessary fixup when a surface's drawable or size changed. */
+static void
+_drawable_changed (cairo_xcb_surface_t *surface)
+{
+ _cairo_surface_begin_modification (&surface->base);
+ _cairo_boxes_clear (&surface->fallback_damage);
+ cairo_surface_destroy (&surface->fallback->base);
+
+ surface->deferred_clear = FALSE;
+ surface->fallback = NULL;
+}
+
/**
* cairo_xcb_surface_set_size:
* @surface: a #cairo_surface_t for the XCB backend
@@ -1394,6 +1406,9 @@ slim_hidden_def (cairo_xcb_surface_create_with_xrender_format);
*
* A pixmap can never change size, so it is never necessary to call
* this function on a surface created for a pixmap.
+ *
+ * If cairo_surface_flush() wasn't called, some pending operations
+ * might be discarded.
**/
void
cairo_xcb_surface_set_size (cairo_surface_t *abstract_surface,
@@ -1424,6 +1439,8 @@ cairo_xcb_surface_set_size (cairo_surface_t *abstract_surface,
}
surface = (cairo_xcb_surface_t *) abstract_surface;
+
+ _drawable_changed(surface);
surface->width = width;
surface->height = height;
}
@@ -1441,11 +1458,13 @@ slim_hidden_def (cairo_xcb_surface_set_size);
* Informs cairo of the new drawable and size of the XCB drawable underlying the
* surface.
*
+ * If cairo_surface_flush() wasn't called, some pending operations
+ * might be discarded.
**/
void
-cairo_xcb_surface_set_drawable (cairo_surface_t *abstract_surface,
- xcb_drawable_t drawable,
- int width,
+cairo_xcb_surface_set_drawable (cairo_surface_t *abstract_surface,
+ xcb_drawable_t drawable,
+ int width,
int height)
{
cairo_xcb_surface_t *surface;
@@ -1473,9 +1492,12 @@ cairo_xcb_surface_set_drawable (cairo_surface_t *abstract_surface,
surface = (cairo_xcb_surface_t *) abstract_surface;
+ /* XXX: and what about this case? */
if (surface->owns_pixmap)
return;
+ _drawable_changed (surface);
+
if (surface->drawable != drawable) {
cairo_status_t status;
status = _cairo_xcb_connection_acquire (surface->connection);
diff --git a/src/cairoint.h b/src/cairoint.h
index 1885a5b9..8f4c3702 100644
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -1374,6 +1374,9 @@ _cairo_surface_has_snapshot (cairo_surface_t *surface,
cairo_private void
_cairo_surface_detach_snapshot (cairo_surface_t *snapshot);
+cairo_private void
+_cairo_surface_begin_modification (cairo_surface_t *surface);
+
cairo_private_no_warn cairo_bool_t
_cairo_surface_get_extents (cairo_surface_t *surface,
cairo_rectangle_int_t *extents);
diff --git a/test/api-special-cases.c b/test/api-special-cases.c
index dbe9eb2c..53891bd7 100644
--- a/test/api-special-cases.c
+++ b/test/api-special-cases.c
@@ -561,6 +561,13 @@ test_cairo_xcb_surface_set_size (cairo_surface_t *surface)
return CAIRO_TEST_SUCCESS;
}
+static cairo_test_status_t
+test_cairo_xcb_surface_set_drawable (cairo_surface_t *surface)
+{
+ cairo_xcb_surface_set_drawable (surface, 0, 5, 5);
+ return CAIRO_TEST_SUCCESS;
+}
+
#endif
#if CAIRO_HAS_XLIB_SURFACE
@@ -704,6 +711,7 @@ struct {
#endif
#if CAIRO_HAS_XCB_SURFACE
TEST (cairo_xcb_surface_set_size, CAIRO_SURFACE_TYPE_XCB, TRUE),
+ TEST (cairo_xcb_surface_set_drawable, CAIRO_SURFACE_TYPE_XCB, TRUE),
#endif
#if CAIRO_HAS_XLIB_SURFACE
TEST (cairo_xlib_surface_set_size, CAIRO_SURFACE_TYPE_XLIB, TRUE),