summaryrefslogtreecommitdiff
path: root/src/cairo-script-surface.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-08-20 09:36:07 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-08-20 11:51:50 +0100
commit0efdc8d27e40c72b426407b83291a28e5553ffa7 (patch)
treec5d9155786b2f91d0af6c6d8f41b5d288491fad0 /src/cairo-script-surface.c
parent713c8069bea1f2391679cbfa611727703a78eb7e (diff)
downloadcairo-0efdc8d27e40c72b426407b83291a28e5553ffa7.tar.gz
observer: record all operations and their timings
The immediate use of this is to print out the slowest operation of each type in a replayable manner. A continuing demonstration of how we may analyse traces... 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.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c
index 856dbe3a9..f3e561bb7 100644
--- a/src/cairo-script-surface.c
+++ b/src/cairo-script-surface.c
@@ -45,6 +45,7 @@
#include "cairoint.h"
#include "cairo-script.h"
+#include "cairo-script-private.h"
#include "cairo-analysis-surface-private.h"
#include "cairo-default-context-private.h"
@@ -100,7 +101,9 @@ struct _cairo_script_context {
cairo_device_t base;
int active;
+ int attach_snapshots;
+ cairo_bool_t owns_stream;
cairo_output_stream_t *stream;
cairo_script_mode_t mode;
@@ -1070,6 +1073,9 @@ attach_snapshot (cairo_script_context_t *ctx,
{
struct script_snapshot *surface;
+ if (! ctx->attach_snapshots)
+ return;
+
surface = malloc (sizeof (*surface));
if (unlikely (surface == NULL))
return;
@@ -1983,10 +1989,12 @@ _cairo_script_surface_create_similar (void *abstract_surface,
_get_target (other);
_cairo_output_stream_printf (ctx->stream,
- "%u %u //%s similar dup /s%u exch def context\n",
+ "%u %u //%s similar",
width, height,
- _content_to_string (content),
- surface->base.unique_id);
+ _content_to_string (content));
+ attach_snapshot (ctx, &surface->base);
+ _cairo_output_stream_printf (ctx->stream, " context\n");
+
surface->emitted = TRUE;
surface->defined = TRUE;
surface->base.is_clear = TRUE;
@@ -2025,7 +2033,8 @@ _device_destroy (void *abstract_device)
_bitmap_fini (ctx->surface_id.next);
_bitmap_fini (ctx->font_id.next);
- status = _cairo_output_stream_destroy (ctx->stream);
+ if (ctx->owns_stream)
+ status = _cairo_output_stream_destroy (ctx->stream);
free (ctx);
}
@@ -3623,7 +3632,7 @@ static const cairo_device_backend_t _cairo_script_device_backend = {
_device_destroy
};
-static cairo_device_t *
+cairo_device_t *
_cairo_script_context_create_internal (cairo_output_stream_t *stream)
{
cairo_script_context_t *ctx;
@@ -3644,8 +3653,33 @@ _cairo_script_context_create_internal (cairo_output_stream_t *stream)
cairo_list_init (&ctx->fonts);
cairo_list_init (&ctx->defines);
- _cairo_output_stream_puts (ctx->stream, "%!CairoScript\n");
+ ctx->attach_snapshots = TRUE;
+
+ return &ctx->base;
+}
+
+void
+_cairo_script_context_attach_snapshots (cairo_device_t *device,
+ cairo_bool_t enable)
+{
+ cairo_script_context_t *ctx;
+ ctx = (cairo_script_context_t *) device;
+ ctx->attach_snapshots = enable;
+}
+
+static cairo_device_t *
+_cairo_script_context_create (cairo_output_stream_t *stream)
+{
+ cairo_script_context_t *ctx;
+
+ ctx = (cairo_script_context_t *)
+ _cairo_script_context_create_internal (stream);
+ if (unlikely (ctx->base.status))
+ return &ctx->base;
+
+ ctx->owns_stream = TRUE;
+ _cairo_output_stream_puts (ctx->stream, "%!CairoScript\n");
return &ctx->base;
}
@@ -3659,7 +3693,7 @@ cairo_script_create (const char *filename)
if ((status = _cairo_output_stream_get_status (stream)))
return _cairo_device_create_in_error (status);
- return _cairo_script_context_create_internal (stream);
+ return _cairo_script_context_create (stream);
}
cairo_device_t *
@@ -3673,7 +3707,7 @@ cairo_script_create_for_stream (cairo_write_func_t write_func,
if ((status = _cairo_output_stream_get_status (stream)))
return _cairo_device_create_in_error (status);
- return _cairo_script_context_create_internal (stream);
+ return _cairo_script_context_create (stream);
}
void
@@ -3733,6 +3767,7 @@ cairo_script_surface_create (cairo_device_t *device,
content, extents,
NULL)->base;
}
+slim_hidden_def (cairo_script_surface_create);
cairo_surface_t *
cairo_script_surface_create_for_target (cairo_device_t *device,