[cairo-commit] NEWS src/cairo.h src/cairo-meta-surface.c src/cairo-meta-surface-private.h src/cairo-paginated-surface.c src/cairo-script-surface.c src/cairo-surface.c src/cairo-svg-surface.c src/cairo-type3-glyph-surface.c src/cairo-user-font.c src/cairo-vg-surface.c src/cairo-xml-surface.c test/cairo-test-trace.c util/cairo-trace

Benjamin Otte company at kemper.freedesktop.org
Tue Sep 29 23:59:48 PDT 2009


 NEWS                             |    1 -
 src/cairo-meta-surface-private.h |    5 ++++-
 src/cairo-meta-surface.c         |   39 +++++++++++++++++----------------------
 src/cairo-paginated-surface.c    |    4 ++--
 src/cairo-script-surface.c       |    6 +++---
 src/cairo-surface.c              |    4 ++--
 src/cairo-svg-surface.c          |    2 +-
 src/cairo-type3-glyph-surface.c  |    4 ++--
 src/cairo-user-font.c            |    2 +-
 src/cairo-vg-surface.c           |    2 +-
 src/cairo-xml-surface.c          |    2 +-
 src/cairo.h                      |    4 ----
 test/cairo-test-trace.c          |    8 ++++++--
 util/cairo-trace/trace.c         |   22 ----------------------
 14 files changed, 40 insertions(+), 65 deletions(-)

New commits:
commit 6809e1216119e16c5be236418dc560d2e9bf854d
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Sep 30 08:54:19 2009 +0200

    [API] Make _cairo_meta_surface_replay() private again
    
    Replaying a meta surface can be achieved by using it as a source for a
    cairo_paint() so exporting a separate API is unnecesary and confusing.
    So after consulting Chris and Carl, we decided to remove the function
    again.

diff --git a/NEWS b/NEWS
index 0acb77d..6fdd064 100644
--- a/NEWS
+++ b/NEWS
@@ -4,7 +4,6 @@ API additions:
 
   cairo_meta_surface_create()
   cairo_meta_surface_ink_extents()
-  cairo_meta_surface_replay()
 
     Finally exporting the internal meta-surface so that applications
     have a method to record and replay a sequence of drawing commands.
diff --git a/src/cairo-meta-surface-private.h b/src/cairo-meta-surface-private.h
index edfb20c..6790eab 100644
--- a/src/cairo-meta-surface-private.h
+++ b/src/cairo-meta-surface-private.h
@@ -138,12 +138,15 @@ typedef struct _cairo_meta_surface {
 } cairo_meta_surface_t;
 
 slim_hidden_proto (cairo_meta_surface_create);
-slim_hidden_proto (cairo_meta_surface_replay);
 
 cairo_private cairo_int_status_t
 _cairo_meta_surface_get_path (cairo_surface_t	 *surface,
 			      cairo_path_fixed_t *path);
 
+cairo_private cairo_status_t
+_cairo_meta_surface_replay (cairo_surface_t *surface,
+			    cairo_surface_t *target);
+
 
 cairo_private cairo_status_t
 _cairo_meta_surface_replay_analyze_meta_pattern (cairo_surface_t *surface,
diff --git a/src/cairo-meta-surface.c b/src/cairo-meta-surface.c
index dcff816..8abb9ab 100644
--- a/src/cairo-meta-surface.c
+++ b/src/cairo-meta-surface.c
@@ -40,15 +40,21 @@
 /* A meta surface is a surface that records all drawing operations at
  * the highest level of the surface backend interface, (that is, the
  * level of paint, mask, stroke, fill, and show_text_glyphs). The meta
- * surface can then be "replayed" against any target surface with:
+ * surface can then be "replayed" against any target surface by using it
+ * as a source surface.
  *
+ * If you want to replay a surface so that the results in target will be
+ * identical to the results that would have been obtained if the original
+ * operations applied to the meta surface had instead been applied to the
+ * target surface, you can use code like this:
  * <informalexample><programlisting>
- *	cairo_meta_surface_replay (meta, target);
- * </programlisting></informalexample>
+ *      cairo_t *cr;
  *
- * after which the results in target will be identical to the results
- * that would have been obtained if the original operations applied to
- * the meta surface had instead been applied to the target surface.
+ *	cr = cairo_create (target);
+ *	cairo_set_source_surface (cr, meta, 0.0, 0.0);
+ *	cairo_paint (cr);
+ *	cairo_destroy (cr);
+ * </programlisting></informalexample>
  *
  * A meta surface is logically unbounded, i.e. it has no implicit constraint
  * on the size of the drawing surface. However, in practice this is rarely
@@ -97,15 +103,7 @@ static const cairo_surface_backend_t cairo_meta_surface_backend;
  * Creates a meta-surface which can be used to record all drawing operations
  * at the highest level (that is, the level of paint, mask, stroke, fill
  * and show_text_glyphs). The meta surface can then be "replayed" against
- * any target surface with:
- *
- * <informalexample><programlisting>
- *	cairo_meta_surface_replay (meta, target);
- * </programlisting></informalexample>
- *
- * after which the results in target will be identical to the results
- * that would have been obtained if the original operations applied to
- * the meta surface had instead been applied to the target surface.
+ * any target surface by using it as a source to drawing operations.
  *
  * The recording phase of the meta surface is careful to snapshot all
  * necessary objects (paths, patterns, etc.), in order to achieve
@@ -264,7 +262,7 @@ _cairo_meta_surface_acquire_source_image (void			 *abstract_surface,
 				     -surface->extents.x,
 				     -surface->extents.y);
 
-    status = cairo_meta_surface_replay (&surface->base, image);
+    status = _cairo_meta_surface_replay (&surface->base, image);
     if (unlikely (status)) {
 	cairo_surface_destroy (image);
 	return status;
@@ -958,7 +956,7 @@ _cairo_meta_surface_replay_internal (cairo_surface_t	     *surface,
 }
 
 /**
- * cairo_meta_surface_replay:
+ * _cairo_meta_surface_replay:
  * @surface: the #cairo_meta_surface_t
  * @target: a target #cairo_surface_t onto which to replay the operations
  * @width_pixels: width of the surface, in pixels
@@ -968,11 +966,9 @@ _cairo_meta_surface_replay_internal (cairo_surface_t	     *surface,
  * after which the results in target will be identical to the results
  * that would have been obtained if the original operations applied to
  * the meta surface had instead been applied to the target surface.
- *
- * Since 1.10
  **/
 cairo_status_t
-cairo_meta_surface_replay (cairo_surface_t *surface,
+_cairo_meta_surface_replay (cairo_surface_t *surface,
 			   cairo_surface_t *target)
 {
     return _cairo_meta_surface_replay_internal (surface,
@@ -980,7 +976,6 @@ cairo_meta_surface_replay (cairo_surface_t *surface,
 						CAIRO_META_REPLAY,
 						CAIRO_META_REGION_ALL);
 }
-slim_hidden_def (cairo_meta_surface_replay);
 
 /* Replay meta to surface. When the return status of each operation is
  * one of %CAIRO_STATUS_SUCCESS, %CAIRO_INT_STATUS_UNSUPPORTED, or
@@ -1029,7 +1024,7 @@ _meta_surface_get_ink_bbox (cairo_meta_surface_t *surface,
     if (transform != NULL)
 	_cairo_analysis_surface_set_ctm (analysis_surface, transform);
 
-    status = cairo_meta_surface_replay (&surface->base, analysis_surface);
+    status = _cairo_meta_surface_replay (&surface->base, analysis_surface);
     _cairo_analysis_surface_get_bounding_box (analysis_surface, bbox);
     cairo_surface_destroy (analysis_surface);
 
diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c
index 34c4676..680bcf5 100644
--- a/src/cairo-paginated-surface.c
+++ b/src/cairo-paginated-surface.c
@@ -217,7 +217,7 @@ _cairo_paginated_surface_acquire_source_image (void	       *abstract_surface,
 							   extents.width,
 							   extents.height);
 
-    status = cairo_meta_surface_replay (surface->meta, image);
+    status = _cairo_meta_surface_replay (surface->meta, image);
     if (unlikely (status)) {
 	cairo_surface_destroy (image);
 	return status;
@@ -261,7 +261,7 @@ _paint_fallback_image (cairo_paginated_surface_t *surface,
      * so we have to do the scaling manually. */
     cairo_surface_set_device_offset (image, -x*x_scale, -y*y_scale);
 
-    status = cairo_meta_surface_replay (surface->meta, image);
+    status = _cairo_meta_surface_replay (surface->meta, image);
     if (unlikely (status))
 	goto CLEANUP_IMAGE;
 
diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c
index 29d2da0..93b09da 100644
--- a/src/cairo-script-surface.c
+++ b/src/cairo-script-surface.c
@@ -972,7 +972,7 @@ _emit_meta_surface_pattern (cairo_script_surface_t *surface,
 
     old_cr = surface->cr;
     _cairo_script_implicit_context_init (&surface->cr);
-    status = cairo_meta_surface_replay (&source->base, &similar->base);
+    status = _cairo_meta_surface_replay (&source->base, &similar->base);
     surface->cr = old_cr;
 
     if (unlikely (status)) {
@@ -2655,7 +2655,7 @@ _emit_scaled_glyph_vector (cairo_script_surface_t *surface,
 
     old_cr = surface->cr;
     _cairo_script_implicit_context_init (&surface->cr);
-    status = cairo_meta_surface_replay (scaled_glyph->meta_surface,
+    status = _cairo_meta_surface_replay (scaled_glyph->meta_surface,
 					&surface->base);
     surface->cr = old_cr;
 
@@ -3430,7 +3430,7 @@ cairo_script_from_meta_surface (cairo_script_context_t *context,
 	return surface->status;
 
     cairo_surface_set_device_offset (surface, -extents.x, -extents.y);
-    status = cairo_meta_surface_replay (meta, surface);
+    status = _cairo_meta_surface_replay (meta, surface);
     cairo_surface_destroy (surface);
 
     return status;
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index d66e930..fd4e01b 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -1450,7 +1450,7 @@ _cairo_meta_surface_clone_similar (cairo_surface_t  *surface,
 
 	cairo_surface_set_device_offset (similar, -src_x, -src_y);
 
-	status = cairo_meta_surface_replay (src, similar);
+	status = _cairo_meta_surface_replay (src, similar);
 	if (unlikely (status)) {
 	    cairo_surface_destroy (similar);
 	    return status;
@@ -1465,7 +1465,7 @@ _cairo_meta_surface_clone_similar (cairo_surface_t  *surface,
 	if (unlikely (similar->status))
 	    return similar->status;
 
-	status = cairo_meta_surface_replay (src, similar);
+	status = _cairo_meta_surface_replay (src, similar);
 	if (unlikely (status)) {
 	    cairo_surface_destroy (similar);
 	    return status;
diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c
index 8be5eed..26ae3d9 100644
--- a/src/cairo-svg-surface.c
+++ b/src/cairo-svg-surface.c
@@ -1300,7 +1300,7 @@ _cairo_svg_surface_emit_meta_surface (cairo_svg_document_t *document,
 				     -source->extents_pixels.x,
 				     -source->extents_pixels.y);
 
-    status = cairo_meta_surface_replay (&source->base, paginated_surface);
+    status = _cairo_meta_surface_replay (&source->base, paginated_surface);
     if (unlikely (status)) {
 	cairo_surface_destroy (paginated_surface);
 	return status;
diff --git a/src/cairo-type3-glyph-surface.c b/src/cairo-type3-glyph-surface.c
index f55b12a..f7699b8 100644
--- a/src/cairo-type3-glyph-surface.c
+++ b/src/cairo-type3-glyph-surface.c
@@ -449,7 +449,7 @@ _cairo_type3_glyph_surface_analyze_glyph (void		     *abstract_surface,
 	goto cleanup;
     }
 
-    status = cairo_meta_surface_replay (scaled_glyph->meta_surface,
+    status = _cairo_meta_surface_replay (scaled_glyph->meta_surface,
 					&surface->base);
     if (unlikely (status))
 	goto cleanup;
@@ -544,7 +544,7 @@ _cairo_type3_glyph_surface_emit_glyph (void		     *abstract_surface,
 	_cairo_type3_glyph_surface_set_stream (surface, mem_stream);
 
 	_cairo_output_stream_printf (surface->stream, "q\n");
-	status = cairo_meta_surface_replay (scaled_glyph->meta_surface,
+	status = _cairo_meta_surface_replay (scaled_glyph->meta_surface,
 					    &surface->base);
 
 	status2 = _cairo_pdf_operators_flush (&surface->pdf_operators);
diff --git a/src/cairo-user-font.c b/src/cairo-user-font.c
index 42e8bae..1cd5ffc 100644
--- a/src/cairo-user-font.c
+++ b/src/cairo-user-font.c
@@ -202,7 +202,7 @@ _cairo_user_scaled_glyph_init (void			 *abstract_font,
 	cairo_surface_set_device_offset (surface,
 	                                 - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x),
 	                                 - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y));
-	status = cairo_meta_surface_replay (meta_surface, surface);
+	status = _cairo_meta_surface_replay (meta_surface, surface);
 
 	if (unlikely (status)) {
 	    cairo_surface_destroy(surface);
diff --git a/src/cairo-vg-surface.c b/src/cairo-vg-surface.c
index 232450d..de22c10 100644
--- a/src/cairo-vg-surface.c
+++ b/src/cairo-vg-surface.c
@@ -870,7 +870,7 @@ _vg_clone_meta_surface (cairo_vg_context_t *context,
 				     extents.width, extents.height);
     cairo_surface_set_device_offset (&clone->base, -extents.x, -extents.y);
 
-    status = cairo_meta_surface_replay (surface, &clone->base);
+    status = _cairo_meta_surface_replay (surface, &clone->base);
     if (unlikely (status)) {
 	cairo_surface_destroy (&clone->base);
 	return (cairo_vg_surface_t *) _cairo_surface_create_in_error (status);
diff --git a/src/cairo-xml-surface.c b/src/cairo-xml-surface.c
index 61e8f61..c40f61f 100644
--- a/src/cairo-xml-surface.c
+++ b/src/cairo-xml-surface.c
@@ -1131,7 +1131,7 @@ cairo_xml_for_meta_surface (cairo_xml_t *xml,
     _cairo_xml_indent (xml, 2);
 
     cairo_surface_set_device_offset (surface, -extents.x, -extents.y);
-    status = cairo_meta_surface_replay (meta, surface);
+    status = _cairo_meta_surface_replay (meta, surface);
     cairo_surface_destroy (surface);
 
     _cairo_xml_indent (xml, -2);
diff --git a/src/cairo.h b/src/cairo.h
index 3b5eb36..c239dea 100644
--- a/src/cairo.h
+++ b/src/cairo.h
@@ -2189,10 +2189,6 @@ cairo_meta_surface_ink_extents (cairo_surface_t *surface,
 				double *width,
 				double *height);
 
-cairo_public cairo_status_t
-cairo_meta_surface_replay (cairo_surface_t *surface,
-			   cairo_surface_t *target);
-
 /* Tee-surface functions */
 
 cairo_public cairo_surface_t *
diff --git a/test/cairo-test-trace.c b/test/cairo-test-trace.c
index c35d6a7..1d12f53 100644
--- a/test/cairo-test-trace.c
+++ b/test/cairo-test-trace.c
@@ -867,7 +867,7 @@ write_trace (const char *trace, struct slave *slave)
     cairo_script_context_t *ctx;
     cairo_surface_t *script;
     char *filename;
-    cairo_status_t status;
+    cairo_t *cr;
 
     xasprintf (&filename, "%s-fail.trace", trace);
     ctx = cairo_script_context_create (filename);
@@ -877,7 +877,11 @@ write_trace (const char *trace, struct slave *slave)
     cairo_script_context_destroy (ctx);
     free (filename);
 
-    status = cairo_meta_surface_replay (slave->image, script);
+    cr = cairo_create (slave->image);
+    cairo_set_source_surface (cr, script, 0, 0);
+    cairo_paint (cr);
+    cairo_destroy (cr);
+
     cairo_surface_destroy (script);
 #endif
 }
diff --git a/util/cairo-trace/trace.c b/util/cairo-trace/trace.c
index ac88e43..79cd6a2 100644
--- a/util/cairo-trace/trace.c
+++ b/util/cairo-trace/trace.c
@@ -4755,28 +4755,6 @@ cairo_meta_surface_create (cairo_content_t content,
     return ret;
 }
 
-cairo_status_t
-cairo_meta_surface_replay (cairo_surface_t *meta, cairo_surface_t *target)
-{
-    cairo_status_t ret;
-
-    _enter_trace ();
-
-    ret = DLCALL (cairo_meta_surface_replay, meta, target);
-
-    _emit_line_info ();
-    if (_write_lock ()) {
-
-	_emit_surface (target);
-	_emit_surface (meta);
-	_trace_printf ("replay");
-	_consume_operand ();
-    }
-
-    _exit_trace ();
-    return ret;
-}
-
 #if CAIRO_HAS_VG_SURFACE
 #include <cairo-vg.h>
 cairo_surface_t *


More information about the cairo-commit mailing list