diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-08-14 01:21:42 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-08-14 12:37:57 +0100 |
commit | 8f99e926c8b1a8fa7f7e0d828a96bac6dc1fe39c (patch) | |
tree | 0362808b5d76560265db1fc4ebf4afda77637dc5 /src | |
parent | 6b3d53646eb7aa3f13a0a6d133ec2ffcd1df8fdd (diff) |
paginated: unwrap subsurfaces during context creation
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-paginated-surface.c | 8 | ||||
-rw-r--r-- | src/cairo-surface-subsurface-private.h | 12 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index 61c2815c..2a6666ad 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -50,6 +50,7 @@ #include "cairo-analysis-surface-private.h" #include "cairo-error-private.h" #include "cairo-image-surface-private.h" +#include "cairo-surface-subsurface-private.h" static const cairo_surface_backend_t cairo_paginated_surface_backend; @@ -652,7 +653,12 @@ static cairo_t * _cairo_paginated_context_create (void *target) { cairo_paginated_surface_t *surface = target; - return surface->recording_surface->backend->create_context (surface); + + if (_cairo_surface_is_subsurface (&surface->base)) + surface = (cairo_paginated_surface_t *) + _cairo_surface_subsurface_get_target (&surface->base); + + return surface->recording_surface->backend->create_context (target); } static const cairo_surface_backend_t cairo_paginated_surface_backend = { diff --git a/src/cairo-surface-subsurface-private.h b/src/cairo-surface-subsurface-private.h index 435e1eb8..2109a13e 100644 --- a/src/cairo-surface-subsurface-private.h +++ b/src/cairo-surface-subsurface-private.h @@ -46,4 +46,16 @@ struct _cairo_surface_subsurface { cairo_surface_t *target; }; +static inline cairo_surface_t * +_cairo_surface_subsurface_get_target (cairo_surface_t *surface) +{ + return ((cairo_surface_subsurface_t *) surface)->target; +} + +static inline cairo_bool_t +_cairo_surface_is_subsurface (cairo_surface_t *surface) +{ + return surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE; +} + #endif /* CAIRO_SURFACE_SUBSURFACE_PRIVATE_H */ |