[Swfdec-commits] 5 commits - swfdec/swfdec_color.c swfdec/swfdec_color.h swfdec/swfdec_movie.c swfdec/swfdec_pattern.c swfdec/swfdec_player.c swfdec/swfdec_sprite_movie_as.c swfdec/swfdec_text_field_movie_as.c swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h test/trace

Benjamin Otte company at kemper.freedesktop.org
Tue Jul 15 09:56:45 PDT 2008


 swfdec/swfdec_color.c                          |   17 +++++++++++++
 swfdec/swfdec_color.h                          |    1 
 swfdec/swfdec_movie.c                          |   11 ++++++--
 swfdec/swfdec_pattern.c                        |   27 +++++++++++++++++++++
 swfdec/swfdec_player.c                         |    2 -
 swfdec/swfdec_sprite_movie_as.c                |   15 +++++++++--
 swfdec/swfdec_text_field_movie.c               |   32 -------------------------
 swfdec/swfdec_text_field_movie.h               |    4 ---
 swfdec/swfdec_text_field_movie_as.c            |   14 ++++++++++
 test/trace/text-field-replace-text-5.swf       |binary
 test/trace/text-field-replace-text-5.swf.trace |   21 +++++++++-------
 test/trace/text-field-replace-text-6.swf       |binary
 test/trace/text-field-replace-text-6.swf.trace |   21 +++++++++-------
 test/trace/text-field-replace-text-7.swf       |binary
 test/trace/text-field-replace-text-7.swf.trace |   21 +++++++++-------
 test/trace/text-field-replace-text-8.swf       |binary
 test/trace/text-field-replace-text-8.swf.trace |   21 +++++++++-------
 test/trace/text-field-replace-text.as          |   15 ++++++++---
 18 files changed, 138 insertions(+), 84 deletions(-)

New commits:
commit 15abdc9cc086e4226e68b676f112238a63828a9c
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jul 15 15:21:55 2008 +0200

    update testcase
    
    we now print size from getNewTextFormat(), too
    
    Also, I replaced loadMovie("fscommand:quit") with getURL call

diff --git a/test/trace/text-field-replace-text-5.swf b/test/trace/text-field-replace-text-5.swf
index 7d427b3..21d2396 100644
Binary files a/test/trace/text-field-replace-text-5.swf and b/test/trace/text-field-replace-text-5.swf differ
diff --git a/test/trace/text-field-replace-text-5.swf.trace b/test/trace/text-field-replace-text-5.swf.trace
index e3c0074..9966bb5 100644
--- a/test/trace/text-field-replace-text-5.swf.trace
+++ b/test/trace/text-field-replace-text-5.swf.trace
@@ -1,9 +1,12 @@
-
-
-
-
-
-
-
-
-
+: 
+: 
+: 
+: 
+: 
+: 
+: 
+: 
+: 
+: 
+: 
+: 
diff --git a/test/trace/text-field-replace-text-6.swf b/test/trace/text-field-replace-text-6.swf
index db176b1..9d65b1b 100644
Binary files a/test/trace/text-field-replace-text-6.swf and b/test/trace/text-field-replace-text-6.swf differ
diff --git a/test/trace/text-field-replace-text-6.swf.trace b/test/trace/text-field-replace-text-6.swf.trace
index 6ef5cf6..d3d638d 100644
--- a/test/trace/text-field-replace-text-6.swf.trace
+++ b/test/trace/text-field-replace-text-6.swf.trace
@@ -1,9 +1,12 @@
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
diff --git a/test/trace/text-field-replace-text-7.swf b/test/trace/text-field-replace-text-7.swf
index 8569a94..d555e39 100644
Binary files a/test/trace/text-field-replace-text-7.swf and b/test/trace/text-field-replace-text-7.swf differ
diff --git a/test/trace/text-field-replace-text-7.swf.trace b/test/trace/text-field-replace-text-7.swf.trace
index f9b8139..eb50a90 100644
--- a/test/trace/text-field-replace-text-7.swf.trace
+++ b/test/trace/text-field-replace-text-7.swf.trace
@@ -1,9 +1,12 @@
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l12Hiw13o14r15l16d17!
-6H7e8l12Hiw13o15Hil16d17!
-6H7e8l12Hiw13o15Hil16d17!6Hi
-6H7e8l12Hiw13o15Hil6Hi
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+6: 6H7e8l9l10o11 12w13o14r15l16d17!
+6: 6H7e8l12Hiw13o14r15l16d17!
+6: 6H7e8l12Hiw13o14r15l16d17!
+6: 6H7e8l12Hiw13o15Hil16d17!
+6: 6H7e8l12Hiw13o15Hil16d17!6Hi
+6: 6H7e8l12Hiw13o15Hil6Hi
+12: 12Yo!Hiw13o15Hil6Hi
diff --git a/test/trace/text-field-replace-text-8.swf b/test/trace/text-field-replace-text-8.swf
index 65de215..b425a5c 100644
Binary files a/test/trace/text-field-replace-text-8.swf and b/test/trace/text-field-replace-text-8.swf differ
diff --git a/test/trace/text-field-replace-text-8.swf.trace b/test/trace/text-field-replace-text-8.swf.trace
index f9b8139..050a7a0 100644
--- a/test/trace/text-field-replace-text-8.swf.trace
+++ b/test/trace/text-field-replace-text-8.swf.trace
@@ -1,9 +1,12 @@
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l9l10o11 12w13o14r15l16d17!
-6H7e8l12Hiw13o14r15l16d17!
-6H7e8l12Hiw13o15Hil16d17!
-6H7e8l12Hiw13o15Hil16d17!6Hi
-6H7e8l12Hiw13o15Hil6Hi
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+5: 6H7e8l9l10o11 12w13o14r15l16d17!
+6: 6H7e8l9l10o11 12w13o14r15l16d17!
+6: 6H7e8l12Hiw13o14r15l16d17!
+6: 6H8l12Hiw13o14r15l16d17!
+6: 6H8l12Hiw13o14r16Hid17!
+6: 6H8l12Hiw13o14r16Hid17!6Hi
+6: 6H8l12Hiw13o14r16Hid6Hi
+12: 12Yo!iw13o14r16Hid6Hi
diff --git a/test/trace/text-field-replace-text.as b/test/trace/text-field-replace-text.as
index f4c53e0..fefbd2e 100644
--- a/test/trace/text-field-replace-text.as
+++ b/test/trace/text-field-replace-text.as
@@ -1,10 +1,11 @@
 // makeswf -v 7 -r 1 -o text-field-replace-text-7.swf text-field-replace-text.as
 
 function check() {
-  str = "";
-  size = -1;
+  var fmt = t.getNewTextFormat();
+  var str = fmt.size + ": ";
+  var size = -1;
   for (var i = 0; i < t.length; i++) {
-    var fmt = t.getTextFormat (i);
+    fmt = t.getTextFormat (i);
     if (fmt.size != size) {
       size = fmt.size;
       str = str + size;
@@ -39,15 +40,21 @@ t.replaceText (-1, 5, "Hi");
 check ();
 t.replaceText (50, 45, "Hi");
 check ();
+t.replaceText (10, 10, "");
+check ();
 
 // will work:
 t.replaceText (3, 6, "Hi");
 check ();
+t.replaceText (1, 2, "");
+check ();
 t.replaceText (7, 8, "Hi");
 check ();
 t.replaceText (50, 55, "Hi");
 check ();
 t.replaceText (10, 20, "Hi");
 check ();
+t.replaceText (0, 3, "Yo!");
+check ();
 
-loadMovie ("FSCommand:quit", "");
+getURL ("FSCommand:quit", "");
commit f40dc7b1aaded7de539e811038d158d3467e6bce
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jul 15 15:20:35 2008 +0200

    rework TextField.replaceText()
    
    This makes the text-field-replace-text testcase work again

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index f0cc3f0..6d501dd 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -1068,38 +1068,6 @@ swfdec_text_field_movie_get_text (SwfdecTextFieldMovie *text)
 }
 
 void
-swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
-    guint start_index, guint end_index, const char *str)
-{
-  g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
-  g_return_if_fail (end_index <= swfdec_text_buffer_get_length (text->text));
-  g_return_if_fail (start_index <= end_index);
-  g_return_if_fail (str != NULL);
-
-  /* if there was a style sheet set when setting the text, modifications are
-   * not allowed */
-  if (text->style_sheet_input)
-    return;
-
-  if (end_index > start_index)
-    swfdec_text_buffer_delete_text (text->text, start_index, end_index - start_index);
-
-  if (start_index == swfdec_text_buffer_get_length (text->text) &&
-      start_index > 0) {
-    const SwfdecTextAttributes *attr = swfdec_text_buffer_get_attributes (text->text, 0);
-    if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
-      SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
-    }
-    swfdec_text_buffer_insert_text (text->text, start_index, str);
-    swfdec_text_buffer_set_attributes (text->text, start_index, 
-	swfdec_text_buffer_get_length (text->text) - start_index, attr, 
-	SWFDEC_TEXT_ATTRIBUTES_MASK);
-  } else {
-    swfdec_text_buffer_insert_text (text->text, start_index, str);
-  }
-}
-
-void
 swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
     gboolean html)
 {
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index a5740c1..fabab63 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -110,10 +110,6 @@ void		swfdec_text_field_movie_set_listen_variable
 void		swfdec_text_field_movie_set_listen_variable_text 
 							(SwfdecTextFieldMovie *	text,
 							 const char *		value);
-void		swfdec_text_field_movie_replace_text	(SwfdecTextFieldMovie *	text,
-							 guint			start_index,
-							 guint			end_index,
-							 const char *		str);
 
 guint		swfdec_text_field_movie_get_hscroll_max (SwfdecTextFieldMovie *	text);
 
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 3ec30fa..a7dad16 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -1242,6 +1242,10 @@ swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
     return;
   if (end_index < start_index)
     return;
+  /* if there was a style sheet set when setting the text, modifications are
+   * not allowed */
+  if (text->style_sheet_input)
+    return;
 
   string = swfdec_text_buffer_get_text (text->text);
   start = end = g_utf8_strlen (string, -1);
@@ -1250,7 +1254,15 @@ swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
   start = g_utf8_offset_to_pointer (string, start) - string;
   end = g_utf8_offset_to_pointer (string, end) - string;
 
-  swfdec_text_field_movie_replace_text (text, start, end, str);
+  /* anyone explain to me why Flash 7 has this special case plz */
+  if (end > start && (str != SWFDEC_AS_STR_EMPTY || cx->version != 7))
+    swfdec_text_buffer_delete_text (text->text, start, end - start);
+
+  swfdec_text_buffer_insert_text (text->text, start, str);
+  /* yes, modifying text changes the default format */
+  swfdec_text_buffer_set_default_attributes (text->text,
+      swfdec_text_buffer_get_attributes (text->text, 0),
+      SWFDEC_TEXT_ATTRIBUTES_MASK);
 }
 
 // static
commit 449794eaf851be464c84e3f024a33e47c48d908d
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jul 15 14:58:11 2008 +0200

    change initialization order in attachMovie for versions <= 6
    
    fixes testsuite

diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index df864d3..35f5d05 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -710,10 +710,19 @@ swfdec_sprite_movie_init_from_object (SwfdecMovie *movie,
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
   g_return_if_fail (initObject == NULL || SWFDEC_IS_AS_OBJECT (initObject));
 
-  swfdec_movie_initialize (movie);
   if (initObject != NULL) {
-    swfdec_as_object_foreach (initObject,
-	swfdec_sprite_movie_foreach_copy_properties, SWFDEC_AS_OBJECT (movie));
+    SwfdecAsContext *cx = SWFDEC_AS_OBJECT (movie)->context;
+    if (cx->version <= 6) {
+      swfdec_as_object_foreach (initObject,
+	  swfdec_sprite_movie_foreach_copy_properties, SWFDEC_AS_OBJECT (movie));
+      swfdec_movie_initialize (movie);
+    } else {
+      swfdec_movie_initialize (movie);
+      swfdec_as_object_foreach (initObject,
+	  swfdec_sprite_movie_foreach_copy_properties, SWFDEC_AS_OBJECT (movie));
+    }
+  } else {
+    swfdec_movie_initialize (movie);
   }
 
   if (SWFDEC_IS_SPRITE_MOVIE (movie)) {
commit b9d1c593330fd026ae93576e3d350547ede05693
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jul 15 13:44:43 2008 +0200

    fix default cache size

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index d736acc..3e9c63d 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2115,7 +2115,7 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
 	  -1, G_MAXLONG, -1, G_PARAM_READABLE));
   g_object_class_install_property (object_class, PROP_CACHE_SIZE,
       g_param_spec_ulong ("cache-size", "cache size", "maximum cache size in bytes",
-	  0, G_MAXULONG, 50 * 1024 * 1024, G_PARAM_READWRITE));
+	  0, G_MAXULONG, 32 * 1024 * 1024, G_PARAM_READWRITE));
   g_object_class_install_property (object_class, PROP_BACKGROUND_COLOR,
       g_param_spec_uint ("background-color", "background color", "ARGB color used to draw the background",
          0, G_MAXUINT, SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF), G_PARAM_READABLE));
commit 755034d467dea6bc4b5af4198fd4f8b3106099bc
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jul 15 13:38:22 2008 +0200

    Optimize alpha-blends of images
    
    Previously we transformed the image using the (slow) SwfdecColorTransform code.
    Now we use cairo_paint_with_alpha() instead.
    
    Speeds up rockyou carousel significantly.

diff --git a/swfdec/swfdec_color.c b/swfdec/swfdec_color.c
index 9ef554a..625cf70 100644
--- a/swfdec/swfdec_color.c
+++ b/swfdec/swfdec_color.c
@@ -177,6 +177,23 @@ swfdec_color_transform_is_identity (const SwfdecColorTransform * trans)
 }
 
 /**
+ * swfdec_color_transform_is_alpha:
+ * @trans: a color transform
+ *
+ * Checks if the color transform is an alpha transform. Note that the identity
+ * transform is not considered an alpha transform.
+ *
+ * Returns: %TRUE if the color transform is an alpha transform
+ **/
+gboolean
+swfdec_color_transform_is_alpha (const SwfdecColorTransform * trans)
+{
+  return trans->mask == FALSE && 
+      trans->ra == 256 && trans->ga == 256 && trans->ba == 256 && trans->aa != 256 &&
+      trans->rb == 0 && trans->gb == 0 && trans->bb == 0 && trans->ab == 0;
+}
+
+/**
  * swfdec_color_transform_chain:
  * @dest: #SwfdecColorTransform to take the result
  * @last: a #SwfdecColorTransform
diff --git a/swfdec/swfdec_color.h b/swfdec/swfdec_color.h
index dbe91e1..597dcae 100644
--- a/swfdec/swfdec_color.h
+++ b/swfdec/swfdec_color.h
@@ -61,6 +61,7 @@ void swfdec_color_transform_init_identity (SwfdecColorTransform * trans);
 void swfdec_color_transform_init_mask (SwfdecColorTransform * trans);
 void swfdec_color_transform_init_color (SwfdecColorTransform *trans, SwfdecColor color);
 gboolean swfdec_color_transform_is_identity (const SwfdecColorTransform * trans);
+gboolean swfdec_color_transform_is_alpha (const SwfdecColorTransform * trans);
 #define swfdec_color_transform_is_mask(trans) ((trans)->mask)
 void swfdec_color_transform_chain (SwfdecColorTransform *dest,
     const SwfdecColorTransform *last, const SwfdecColorTransform *first);
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 1ac3f7d..e957cd6 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -1197,12 +1197,17 @@ swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
       SwfdecRenderer *renderer = swfdec_renderer_get (cr);
       cairo_surface_t *surface;
       cairo_pattern_t *pattern;
+      double alpha = 1.0;
       
-      if (swfdec_color_transform_is_mask (ctrans))
+      if (swfdec_color_transform_is_mask (ctrans)) {
 	surface = NULL;
-      else
+      } else if (swfdec_color_transform_is_alpha (ctrans)) {
+	surface = swfdec_image_create_surface (movie->image, renderer);
+	alpha = ctrans->aa / 256.0;
+      } else {
 	surface = swfdec_image_create_surface_transformed (movie->image,
 	  renderer, ctrans);
+      }
       if (surface) {
 	static const cairo_matrix_t matrix = { 1.0 / SWFDEC_TWIPS_SCALE_FACTOR, 0, 0, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR, 0, 0 };
 	pattern = cairo_pattern_create_for_surface (surface);
@@ -1212,7 +1217,7 @@ swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
 	pattern = cairo_pattern_create_rgb (1.0, 0.0, 0.0);
       }
       cairo_set_source (cr, pattern);
-      cairo_paint (cr);
+      cairo_paint_with_alpha (cr, alpha);
       cairo_pattern_destroy (pattern);
       cairo_surface_destroy (surface);
     }
diff --git a/swfdec/swfdec_pattern.c b/swfdec/swfdec_pattern.c
index 66ce0bd..8ec67f3 100644
--- a/swfdec/swfdec_pattern.c
+++ b/swfdec/swfdec_pattern.c
@@ -211,6 +211,32 @@ swfdec_image_pattern_morph (SwfdecDraw *dest, SwfdecDraw *source, guint ratio)
   SWFDEC_DRAW_CLASS (swfdec_image_pattern_parent_class)->morph (dest, source, ratio);
 }
 
+static void
+swfdec_image_pattern_paint (SwfdecDraw *draw, cairo_t *cr, const SwfdecColorTransform *trans)
+{
+  cairo_pattern_t *pattern;
+
+  if (swfdec_color_transform_is_alpha (trans)) {
+    SwfdecColorTransform identity;
+    swfdec_color_transform_init_identity (&identity);
+    pattern = swfdec_pattern_get_pattern (SWFDEC_PATTERN (draw),
+	swfdec_renderer_get (cr), &identity);
+    if (pattern == NULL)
+      return;
+    cairo_save (cr);
+    cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+    cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
+    cairo_append_path (cr, &draw->path);
+    cairo_clip (cr);
+    cairo_set_source (cr, pattern);
+    cairo_pattern_destroy (pattern);
+    cairo_paint_with_alpha (cr, trans->aa / 256.0);
+    cairo_restore (cr);
+  } else {
+    SWFDEC_DRAW_CLASS (swfdec_image_pattern_parent_class)->paint (draw, cr, trans);
+  }
+}
+
 static cairo_pattern_t *
 swfdec_image_pattern_get_pattern (SwfdecPattern *pat, SwfdecRenderer *renderer,
     const SwfdecColorTransform *trans)
@@ -236,6 +262,7 @@ static void
 swfdec_image_pattern_class_init (SwfdecImagePatternClass *klass)
 {
   SWFDEC_DRAW_CLASS (klass)->morph = swfdec_image_pattern_morph;
+  SWFDEC_DRAW_CLASS (klass)->paint = swfdec_image_pattern_paint;
 
   SWFDEC_PATTERN_CLASS (klass)->get_pattern = swfdec_image_pattern_get_pattern;
 }


More information about the Swfdec-commits mailing list