diff options
author | Uli Schlachter <psychon@znc.in> | 2011-12-05 22:48:56 +0100 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2011-12-05 22:48:56 +0100 |
commit | 9ec5e9fee64cb9dd835477e3565170c522863ea9 (patch) | |
tree | e5da7858994bec346b440a2f8f961155f3e0d3e3 | |
parent | 3dbb0f17a74e98ecf790e9d2c9fb8622e3928486 (diff) |
xcb: Fixup some internal state in set_{drawable,size}
Signed-off-by: Uli Schlachter <psychon@znc.in>
-rw-r--r-- | src/cairo-surface.c | 2 | ||||
-rw-r--r-- | src/cairo-xcb-surface.c | 28 | ||||
-rw-r--r-- | src/cairoint.h | 3 | ||||
-rw-r--r-- | test/api-special-cases.c | 8 |
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), |