diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-25 00:59:31 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-25 10:35:42 +0000 |
commit | 8844d50308e03e7eb1d6e1530bb4bd98be490cea (patch) | |
tree | 655923fadb907cc692a02d8a4a452e8e3774a225 /src/cairo-script-surface.c | |
parent | 2c4f6bbfbcaacea41386c36f42210120ee815055 (diff) | |
download | cairo-8844d50308e03e7eb1d6e1530bb4bd98be490cea.tar.gz |
Convert cairo_mime_surface_t to cairo_raster_source_pattern_t
As discussed, overloading the cairo_surface_t semantics to include
sources (i.e. read-only surfaces) was duplicating the definition of
cairo_pattern_t. So rather than introduce a new surface type with
pattern semantics, start along the thorny road of extensible pattern
types.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-script-surface.c')
-rw-r--r-- | src/cairo-script-surface.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c index 811b015a4..29a6ae4b5 100644 --- a/src/cairo-script-surface.c +++ b/src/cairo-script-surface.c @@ -53,8 +53,9 @@ #include "cairo-error-private.h" #include "cairo-list-private.h" #include "cairo-image-surface-private.h" -#include "cairo-recording-surface-private.h" #include "cairo-output-stream-private.h" +#include "cairo-pattern-private.h" +#include "cairo-recording-surface-private.h" #include "cairo-scaled-font-private.h" #include "cairo-surface-clipper-private.h" #include "cairo-surface-snapshot-private.h" @@ -1469,7 +1470,6 @@ _emit_image_surface (cairo_script_surface_t *surface, _cairo_output_stream_puts (ctx->stream, "~> set-mime-data\n"); } - attach_snapshot (ctx, &image->base); return CAIRO_INT_STATUS_SUCCESS; } @@ -1574,6 +1574,30 @@ _emit_surface_pattern (cairo_script_surface_t *surface, } static cairo_int_status_t +_emit_raster_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_surface_t *source; + cairo_int_status_t status; + + source = _cairo_raster_source_pattern_acquire (pattern, &surface->base, NULL); + if (unlikely (source == NULL)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + if (unlikely (source->status)) + return source->status; + + status = _emit_image_surface_pattern (surface, source); + _cairo_raster_source_pattern_release (pattern, source); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (to_context(surface)->stream, "pattern"); + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t _emit_pattern (cairo_script_surface_t *surface, const cairo_pattern_t *pattern) { @@ -1603,6 +1627,10 @@ _emit_pattern (cairo_script_surface_t *surface, status = _emit_surface_pattern (surface, pattern); is_default_extend = pattern->extend == CAIRO_EXTEND_SURFACE_DEFAULT; break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + status = _emit_raster_pattern (surface, pattern); + is_default_extend = pattern->extend == CAIRO_EXTEND_SURFACE_DEFAULT; + break; default: ASSERT_NOT_REACHED; |