[Swfdec-commits] 3 commits - swfdec/swfdec_bitmap_pattern.c swfdec/swfdec_draw.c swfdec/swfdec_draw.h swfdec/swfdec_gradient_pattern.c swfdec/swfdec_movie.c swfdec/swfdec_path.c swfdec/swfdec_path.h swfdec/swfdec_pattern.c swfdec/swfdec_stroke.c test/image

Benjamin Otte company at kemper.freedesktop.org
Sat Sep 6 09:31:04 PDT 2008


 swfdec/swfdec_bitmap_pattern.c                           |   18 +++++-
 swfdec/swfdec_draw.c                                     |   34 +++++++++--
 swfdec/swfdec_draw.h                                     |    1 
 swfdec/swfdec_gradient_pattern.c                         |    2 
 swfdec/swfdec_movie.c                                    |   25 ++++++++
 swfdec/swfdec_path.c                                     |    9 +++
 swfdec/swfdec_path.h                                     |    2 
 swfdec/swfdec_pattern.c                                  |    2 
 swfdec/swfdec_stroke.c                                   |    2 
 test/image/Makefile.am                                   |   26 ++++++---
 test/image/duplicateMovieClip-drawingstate-5.swf         |binary
 test/image/duplicateMovieClip-drawingstate-5.swf.png     |binary
 test/image/duplicateMovieClip-drawingstate-6.swf         |binary
 test/image/duplicateMovieClip-drawingstate-6.swf.org.png |binary
 test/image/duplicateMovieClip-drawingstate-6.swf.png     |binary
 test/image/duplicateMovieClip-drawingstate-7.swf         |binary
 test/image/duplicateMovieClip-drawingstate-7.swf.org.png |binary
 test/image/duplicateMovieClip-drawingstate-7.swf.png     |binary
 test/image/duplicateMovieClip-drawingstate-8.swf         |binary
 test/image/duplicateMovieClip-drawingstate-8.swf.org.png |binary
 test/image/duplicateMovieClip-drawingstate-8.swf.png     |binary
 test/image/duplicateMovieClip-drawingstate.as            |   43 +++++++++++++++
 22 files changed, 147 insertions(+), 17 deletions(-)

New commits:
commit 1698fc8b07c31ffdad9cfddfea56a939e5380c21
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Sep 6 18:26:47 2008 +0200

    add a testcase for the duplicateMovieClip behavior

diff --git a/test/image/Makefile.am b/test/image/Makefile.am
index 00809b0..c063b0d 100644
--- a/test/image/Makefile.am
+++ b/test/image/Makefile.am
@@ -166,13 +166,6 @@ EXTRA_DIST = \
 	definebits-palette-8.swf.png \
 	definebits-palette-base64.c \
 	definebits-palette.xml \
-	duplicate-depth.c \
-	duplicate-depth-5.swf \
-	duplicate-depth-5.swf.png \
-	duplicate-depth-6.swf \
-	duplicate-depth-6.swf.png \
-	duplicate-depth-7.swf \
-	duplicate-depth-7.swf.png \
 	drawing-zorder.as \
 	drawing-zorder-5.swf \
 	drawing-zorder-5.swf.png \
@@ -185,6 +178,25 @@ EXTRA_DIST = \
 	drawing-zorder-8.swf \
 	drawing-zorder-8.swf.org.png \
 	drawing-zorder-8.swf.png \
+	duplicate-depth.c \
+	duplicate-depth-5.swf \
+	duplicate-depth-5.swf.png \
+	duplicate-depth-6.swf \
+	duplicate-depth-6.swf.png \
+	duplicate-depth-7.swf \
+	duplicate-depth-7.swf.png \
+	duplicateMovieClip-drawingstate-5.swf \
+	duplicateMovieClip-drawingstate-5.swf.png \
+	duplicateMovieClip-drawingstate-6.swf \
+	duplicateMovieClip-drawingstate-6.swf.org.png \
+	duplicateMovieClip-drawingstate-6.swf.png \
+	duplicateMovieClip-drawingstate-7.swf \
+	duplicateMovieClip-drawingstate-7.swf.org.png \
+	duplicateMovieClip-drawingstate-7.swf.png \
+	duplicateMovieClip-drawingstate-8.swf \
+	duplicateMovieClip-drawingstate-8.swf.org.png \
+	duplicateMovieClip-drawingstate-8.swf.png \
+	duplicateMovieClip-drawingstate.as \
 	empty-gradient.swf \
 	empty-gradient.swf.png \
 	empty-gradient.xml \
diff --git a/test/image/duplicateMovieClip-drawingstate-5.swf b/test/image/duplicateMovieClip-drawingstate-5.swf
new file mode 100644
index 0000000..1c3073d
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-5.swf differ
diff --git a/test/image/duplicateMovieClip-drawingstate-5.swf.png b/test/image/duplicateMovieClip-drawingstate-5.swf.png
new file mode 100644
index 0000000..c01ba16
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-5.swf.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-6.swf b/test/image/duplicateMovieClip-drawingstate-6.swf
new file mode 100644
index 0000000..791cb45
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-6.swf differ
diff --git a/test/image/duplicateMovieClip-drawingstate-6.swf.org.png b/test/image/duplicateMovieClip-drawingstate-6.swf.org.png
new file mode 100644
index 0000000..04f4bec
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-6.swf.org.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-6.swf.png b/test/image/duplicateMovieClip-drawingstate-6.swf.png
new file mode 100644
index 0000000..45744ea
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-6.swf.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-7.swf b/test/image/duplicateMovieClip-drawingstate-7.swf
new file mode 100644
index 0000000..7b400da
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-7.swf differ
diff --git a/test/image/duplicateMovieClip-drawingstate-7.swf.org.png b/test/image/duplicateMovieClip-drawingstate-7.swf.org.png
new file mode 100644
index 0000000..ec3afca
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-7.swf.org.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-7.swf.png b/test/image/duplicateMovieClip-drawingstate-7.swf.png
new file mode 100644
index 0000000..45744ea
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-7.swf.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-8.swf b/test/image/duplicateMovieClip-drawingstate-8.swf
new file mode 100644
index 0000000..8da23c7
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-8.swf differ
diff --git a/test/image/duplicateMovieClip-drawingstate-8.swf.org.png b/test/image/duplicateMovieClip-drawingstate-8.swf.org.png
new file mode 100644
index 0000000..f9b8261
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-8.swf.org.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate-8.swf.png b/test/image/duplicateMovieClip-drawingstate-8.swf.png
new file mode 100644
index 0000000..7245170
Binary files /dev/null and b/test/image/duplicateMovieClip-drawingstate-8.swf.png differ
diff --git a/test/image/duplicateMovieClip-drawingstate.as b/test/image/duplicateMovieClip-drawingstate.as
new file mode 100644
index 0000000..a031474
--- /dev/null
+++ b/test/image/duplicateMovieClip-drawingstate.as
@@ -0,0 +1,43 @@
+// makeswf -v 7 -s 200x150 -r 1 -o duplicateMovieClip-drawingstate.swf duplicateMovieClip-drawingstate.as
+
+#if __SWF_VERSION__ == 6
+depth = 0;
+getNextHighestDepth = function () {
+  return depth++;
+};
+#endif
+
+rectangle_start = function (mc, x, y, w, h)
+{
+  mc.moveTo (x, y);
+  mc.lineTo (x, y + h);
+  mc.lineTo (x + w, y + h);
+};
+
+rectangle_end = function (mc, x, y, w, h)
+{
+  mc.lineTo (x + w, y);
+  mc.lineTo (x, y);
+  mc.endFill ();
+};
+
+test_count = 0;
+test = function (fun) {
+  var x = createEmptyMovieClip ("a" + getNextHighestDepth (), getNextHighestDepth ());
+  fun (x);
+  x._x = (test_count % 2) * 100;
+  x._y = int (test_count / 2) * 50;
+  rectangle_start (x, 0, 0, 50, 50);
+  y = x.duplicateMovieClip ("b" + getNextHighestDepth (), getNextHighestDepth ());
+  y._x += 50;
+  if (test_count % 2)
+    y = x;
+  trace (y);
+  rectangle_end (y, 0, 0, 50, 50);
+  test_count++;
+};
+
+test (function (mc) { m = new flash.geom.Matrix (); m.createGradientBox (50, 50); 
+                      mc.beginGradientFill ("radial", [0xFF0000, 0xFF00], [100, 100], [0, 255], m); });
+test (function (mc) { bd = new flash.display.BitmapData (50, 50, false, 0xFF0000); mc.beginBitmapFill (bd); });
+test (function (mc) { mc.beginFill (0xFF); });
commit 9327394bfd214b7ccdb4e77f2d394353016f9d47
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Sep 6 18:26:38 2008 +0200

    make sure the extents are invalid

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 68c1abf..50ba500 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -1606,6 +1606,7 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth)
   }
   copy->draw_x = movie->draw_x;
   copy->draw_y = movie->draw_y;
+  g_assert (movie->cache_state >= SWFDEC_MOVIE_INVALID_EXTENTS);
 
   sandbox = SWFDEC_SANDBOX (swfdec_gc_object_get_context (movie)->global);
   swfdec_sandbox_unuse (sandbox);
commit 7cc7e7d1ea11d7c6cd92fd8f9300309991412e1d
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Sep 6 17:23:02 2008 +0200

    make duplicateMovieClip copy drawing state
    
    This requires being able to copy SwfdecDraw objects, which I implemented using
    the morph function.

diff --git a/swfdec/swfdec_bitmap_pattern.c b/swfdec/swfdec_bitmap_pattern.c
index 872266c..3fc722b 100644
--- a/swfdec/swfdec_bitmap_pattern.c
+++ b/swfdec/swfdec_bitmap_pattern.c
@@ -53,6 +53,19 @@ swfdec_bitmap_pattern_get_pattern (SwfdecPattern *pat, SwfdecRenderer *renderer,
 }
 
 static void
+swfdec_bitmap_pattern_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio)
+{
+  SwfdecBitmapPattern *dpattern = SWFDEC_BITMAP_PATTERN (dest);
+  SwfdecBitmapPattern *spattern = SWFDEC_BITMAP_PATTERN (source);
+
+  dpattern->bitmap = g_object_ref (spattern->bitmap);
+  dpattern->extend = spattern->extend;
+  dpattern->filter = spattern->filter;
+
+  SWFDEC_DRAW_CLASS (swfdec_bitmap_pattern_parent_class)->morph (dest, source, ratio);
+}
+
+static void
 swfdec_bitmap_pattern_invalidate (SwfdecBitmapPattern *bitmap)
 {
   g_signal_emit (bitmap, signals[INVALIDATE], 0);
@@ -74,6 +87,7 @@ static void
 swfdec_bitmap_pattern_class_init (SwfdecBitmapPatternClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  SwfdecDrawClass *draw_class = SWFDEC_DRAW_CLASS (klass);
   SwfdecPatternClass *pattern_class = SWFDEC_PATTERN_CLASS (klass);
 
   object_class->dispose = swfdec_bitmap_pattern_dispose;
@@ -83,6 +97,8 @@ swfdec_bitmap_pattern_class_init (SwfdecBitmapPatternClass *klass)
       G_TYPE_NONE, 0);
 
   pattern_class->get_pattern = swfdec_bitmap_pattern_get_pattern;
+
+  draw_class->morph = swfdec_bitmap_pattern_morph;
 }
 
 static void
@@ -101,7 +117,7 @@ swfdec_bitmap_pattern_new (SwfdecBitmapData *bitmap)
 
   pattern = g_object_new (SWFDEC_TYPE_BITMAP_PATTERN, NULL);
   pattern->bitmap = bitmap;
-  /* we ref the bitmap here to enforce the order for destruction, which makes our signals work */
+  /* we ref the bitmap here as we are not garbage-collected, and we wanna keep a reference */
   g_object_ref (bitmap);
   g_signal_connect_swapped (pattern->bitmap, "invalidate", 
       G_CALLBACK (swfdec_bitmap_pattern_invalidate), pattern);
diff --git a/swfdec/swfdec_draw.c b/swfdec/swfdec_draw.c
index 7da5374..4fe9c26 100644
--- a/swfdec/swfdec_draw.c
+++ b/swfdec/swfdec_draw.c
@@ -32,10 +32,20 @@
 
 G_DEFINE_ABSTRACT_TYPE (SwfdecDraw, swfdec_draw, G_TYPE_OBJECT);
 
+static gboolean
+swfdec_draw_can_morph (SwfdecDraw *draw)
+{
+  return draw->end_path.num_data > 0;
+}
+
 static void
 swfdec_draw_do_morph (SwfdecDraw* dest, SwfdecDraw *source, guint ratio)
 {
-  swfdec_path_merge (&dest->path, &source->path, &source->end_path, ratio / 65535.);
+  if (swfdec_draw_can_morph (source)) {
+    swfdec_path_merge (&dest->path, &source->path, &source->end_path, ratio / 65535.);
+  } else {
+    swfdec_path_copy (&dest->path, &source->path);
+  }
 }
 
 static void
@@ -66,12 +76,6 @@ swfdec_draw_init (SwfdecDraw *draw)
   swfdec_path_init (&draw->end_path);
 }
 
-static gboolean
-swfdec_draw_can_morph (SwfdecDraw *draw)
-{
-  return draw->end_path.num_data > 0;
-}
-
 /**
  * swfdec_draw_morph:
  * @draw: a #SwfdecDraw
@@ -106,6 +110,22 @@ swfdec_draw_morph (SwfdecDraw *draw, guint ratio)
   return copy;
 }
 
+SwfdecDraw *
+swfdec_draw_copy (SwfdecDraw *draw)
+{
+  SwfdecDrawClass *klass;
+  SwfdecDraw *copy;
+
+  g_return_val_if_fail (SWFDEC_IS_DRAW (draw), NULL);
+
+  klass = SWFDEC_DRAW_GET_CLASS (draw);
+  g_assert (klass->morph);
+  copy = g_object_new (G_OBJECT_CLASS_TYPE (klass), NULL);
+  klass->morph (copy, draw, 0);
+  swfdec_draw_recompute (copy);
+  return copy;
+}
+
 /**
  * swfdec_draw_paint:
  * @draw: drawing operation to perform
diff --git a/swfdec/swfdec_draw.h b/swfdec/swfdec_draw.h
index a892e47..ddb2688 100644
--- a/swfdec/swfdec_draw.h
+++ b/swfdec/swfdec_draw.h
@@ -73,6 +73,7 @@ GType		swfdec_draw_get_type		(void);
 
 SwfdecDraw *	swfdec_draw_morph		(SwfdecDraw *			draw,
 						 guint				ratio);
+SwfdecDraw *	swfdec_draw_copy		(SwfdecDraw *			draw);
 void		swfdec_draw_paint		(SwfdecDraw *			draw, 
 						 cairo_t *			cr,
 						 const SwfdecColorTransform *	trans);
diff --git a/swfdec/swfdec_gradient_pattern.c b/swfdec/swfdec_gradient_pattern.c
index b449d3f..d5467f0 100644
--- a/swfdec/swfdec_gradient_pattern.c
+++ b/swfdec/swfdec_gradient_pattern.c
@@ -48,6 +48,8 @@ swfdec_gradient_pattern_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio
 	spattern->end_gradient[i].color, ratio);
     dpattern->gradient[i].ratio = (spattern->gradient[i].ratio * (65535 - ratio) +
 	spattern->end_gradient[i].ratio * ratio) / 65535;
+    dpattern->end_gradient[i].color = dpattern->gradient[i].color;
+    dpattern->end_gradient[i].color = dpattern->gradient[i].color;
   }
 
   SWFDEC_DRAW_CLASS (swfdec_gradient_pattern_parent_class)->morph (dest, source, ratio);
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 396d5f1..68c1abf 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -1566,6 +1566,7 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth)
 {
   SwfdecMovie *parent, *copy;
   SwfdecSandbox *sandbox;
+  GSList *walk;
 
   g_return_val_if_fail (SWFDEC_IS_MOVIE (movie), NULL);
   g_return_val_if_fail (name != NULL, NULL);
@@ -1582,11 +1583,30 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth)
   }
   copy = swfdec_movie_new (SWFDEC_PLAYER (swfdec_gc_object_get_context (movie)), depth, 
       parent, movie->resource, movie->graphic, name);
-  if (copy == NULL)
-    return NULL;
+  /* copy properties */
   swfdec_movie_set_static_properties (copy, &movie->original_transform,
       &movie->color_transform, movie->original_ratio, movie->clip_depth, 
       movie->blend_mode, SWFDEC_IS_ACTOR (movie) ? SWFDEC_ACTOR (movie)->events : NULL);
+  /* Copy drawing state.
+   * We can keep refs to all finalized draw objects, but need to create copies
+   * of the still active ones as their path can still change */
+  copy->draws = g_slist_copy (movie->draws);
+  g_slist_foreach (copy->draws, (GFunc) g_object_ref, NULL);
+  copy->draw_extents = movie->draw_extents;
+  for (walk = copy->draws; walk; walk = walk->next) {
+    if (walk->data == movie->draw_line) {
+      copy->draw_line = swfdec_draw_copy (walk->data);
+      g_object_unref (walk->data);
+      walk->data = copy->draw_line;
+    } else if (walk->data == movie->draw_fill) {
+      copy->draw_fill = swfdec_draw_copy (walk->data);
+      g_object_unref (walk->data);
+      walk->data = copy->draw_fill;
+    }
+  }
+  copy->draw_x = movie->draw_x;
+  copy->draw_y = movie->draw_y;
+
   sandbox = SWFDEC_SANDBOX (swfdec_gc_object_get_context (movie)->global);
   swfdec_sandbox_unuse (sandbox);
   if (SWFDEC_IS_SPRITE_MOVIE (copy)) {
diff --git a/swfdec/swfdec_path.c b/swfdec/swfdec_path.c
index d2da710..e5af14a 100644
--- a/swfdec/swfdec_path.c
+++ b/swfdec/swfdec_path.c
@@ -46,6 +46,15 @@ swfdec_path_reset (cairo_path_t *path)
 }
 
 void
+swfdec_path_copy (cairo_path_t *dest, const cairo_path_t *source)
+{
+  dest->status = source->status;
+  swfdec_path_ensure_size (dest, source->num_data);
+  memcpy (dest->data, source->data, sizeof (cairo_path_data_t) * source->num_data);
+  dest->num_data = source->num_data;
+}
+
+void
 swfdec_path_ensure_size (cairo_path_t *path, int size)
 {
 #define SWFDEC_PATH_STEPS 32
diff --git a/swfdec/swfdec_path.h b/swfdec/swfdec_path.h
index bfe0607..3a5d1e8 100644
--- a/swfdec/swfdec_path.h
+++ b/swfdec/swfdec_path.h
@@ -30,6 +30,8 @@ G_BEGIN_DECLS
 void		swfdec_path_init		(cairo_path_t *		path);
 void		swfdec_path_reset		(cairo_path_t *		path);
 
+void		swfdec_path_copy		(cairo_path_t *		dest,
+						 const cairo_path_t *	source);
 #define swfdec_path_require_size(path, steps) \
   swfdec_path_ensure_size ((path), (path)->num_data + steps)
 void		swfdec_path_ensure_size		(cairo_path_t *		path,
diff --git a/swfdec/swfdec_pattern.c b/swfdec/swfdec_pattern.c
index 9a3b280..e2f6e87 100644
--- a/swfdec/swfdec_pattern.c
+++ b/swfdec/swfdec_pattern.c
@@ -69,6 +69,7 @@ swfdec_pattern_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio)
 
   swfdec_matrix_morph (&dpattern->start_transform,
       &spattern->start_transform, &spattern->end_transform, ratio);
+  dpattern->end_transform = dpattern->start_transform;
   dpattern->transform = dpattern->start_transform;
   if (cairo_matrix_invert (&dpattern->transform)) {
     SWFDEC_ERROR ("morphed paint transform matrix not invertible, using default");
@@ -140,6 +141,7 @@ swfdec_color_pattern_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio)
   SwfdecColorPattern *spattern = SWFDEC_COLOR_PATTERN (source);
 
   dpattern->start_color = swfdec_color_apply_morph (spattern->start_color, spattern->end_color, ratio);
+  dpattern->end_color = dpattern->start_color;
 
   SWFDEC_DRAW_CLASS (swfdec_color_pattern_parent_class)->morph (dest, source, ratio);
 }
diff --git a/swfdec/swfdec_stroke.c b/swfdec/swfdec_stroke.c
index 0e966eb..ef56022 100644
--- a/swfdec/swfdec_stroke.c
+++ b/swfdec/swfdec_stroke.c
@@ -134,8 +134,10 @@ swfdec_stroke_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio)
 
   dstroke->start_color = swfdec_color_apply_morph (sstroke->start_color,
       sstroke->end_color, ratio);
+  dstroke->end_color = dstroke->start_color;
   dstroke->start_width = (sstroke->start_width * ratio + 
       sstroke->end_width * (65535 - ratio)) / 65535;
+  dstroke->end_width = dstroke->start_width;
   if (sstroke->pattern) {
     dstroke->pattern = SWFDEC_PATTERN (swfdec_draw_morph (
 	  SWFDEC_DRAW (sstroke->pattern), ratio));


More information about the Swfdec-commits mailing list