summaryrefslogtreecommitdiff
path: root/src/cairo-script-surface.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-11-25 00:59:31 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-11-25 10:35:42 +0000
commit8844d50308e03e7eb1d6e1530bb4bd98be490cea (patch)
tree655923fadb907cc692a02d8a4a452e8e3774a225 /src/cairo-script-surface.c
parent2c4f6bbfbcaacea41386c36f42210120ee815055 (diff)
downloadcairo-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.c32
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;