[Swfdec-commits] 3 commits - swfdec/swfdec_as_strings.c swfdec/swfdec_bitmap_data.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Wed Jul 23 14:58:18 PDT 2008


 swfdec/swfdec_as_strings.c                |    1 
 swfdec/swfdec_bitmap_data.c               |  142 +++++++++++++++++++++++++++---
 test/trace/Makefile.am                    |    9 +
 test/trace/bitmapdata-getters-5.swf       |binary
 test/trace/bitmapdata-getters-5.swf.trace |   40 ++++++++
 test/trace/bitmapdata-getters-6.swf       |binary
 test/trace/bitmapdata-getters-6.swf.trace |   40 ++++++++
 test/trace/bitmapdata-getters-7.swf       |binary
 test/trace/bitmapdata-getters-7.swf.trace |   40 ++++++++
 test/trace/bitmapdata-getters-8.swf       |binary
 test/trace/bitmapdata-getters-8.swf.trace |   42 ++++++++
 test/trace/bitmapdata-getters.as          |   33 ++++++
 12 files changed, 337 insertions(+), 10 deletions(-)

New commits:
commit 42d91cd2f9ade29c01ea5ab895f43793b369c386
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 23 23:57:35 2008 +0200

    add test for recent code additions

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 14e201f..3917b0a 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -396,6 +396,15 @@ EXTRA_DIST = \
 	bevel-filter-properties-7.swf.trace \
 	bevel-filter-properties-8.swf \
 	bevel-filter-properties-8.swf.trace \
+	bitmapdata-getters-5.swf \
+	bitmapdata-getters-5.swf.trace \
+	bitmapdata-getters-6.swf \
+	bitmapdata-getters-6.swf.trace \
+	bitmapdata-getters-7.swf \
+	bitmapdata-getters-7.swf.trace \
+	bitmapdata-getters-8.swf \
+	bitmapdata-getters-8.swf.trace \
+	bitmapdata-getters.as \
 	bitmap-filter-properties.as \
 	bitmap-filter-properties-5.swf \
 	bitmap-filter-properties-5.swf.trace \
diff --git a/test/trace/bitmapdata-getters-5.swf b/test/trace/bitmapdata-getters-5.swf
new file mode 100644
index 0000000..f6fa638
Binary files /dev/null and b/test/trace/bitmapdata-getters-5.swf differ
diff --git a/test/trace/bitmapdata-getters-5.swf.trace b/test/trace/bitmapdata-getters-5.swf.trace
new file mode 100644
index 0000000..3baa47c
--- /dev/null
+++ b/test/trace/bitmapdata-getters-5.swf.trace
@@ -0,0 +1,40 @@
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
diff --git a/test/trace/bitmapdata-getters-6.swf b/test/trace/bitmapdata-getters-6.swf
new file mode 100644
index 0000000..d6154a0
Binary files /dev/null and b/test/trace/bitmapdata-getters-6.swf differ
diff --git a/test/trace/bitmapdata-getters-6.swf.trace b/test/trace/bitmapdata-getters-6.swf.trace
new file mode 100644
index 0000000..3baa47c
--- /dev/null
+++ b/test/trace/bitmapdata-getters-6.swf.trace
@@ -0,0 +1,40 @@
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData 
+undefined
+undefined
+undefined
+undefined
diff --git a/test/trace/bitmapdata-getters-7.swf b/test/trace/bitmapdata-getters-7.swf
new file mode 100644
index 0000000..f1d2d17
Binary files /dev/null and b/test/trace/bitmapdata-getters-7.swf differ
diff --git a/test/trace/bitmapdata-getters-7.swf.trace b/test/trace/bitmapdata-getters-7.swf.trace
new file mode 100644
index 0000000..4e1f25c
--- /dev/null
+++ b/test/trace/bitmapdata-getters-7.swf.trace
@@ -0,0 +1,40 @@
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
diff --git a/test/trace/bitmapdata-getters-8.swf b/test/trace/bitmapdata-getters-8.swf
new file mode 100644
index 0000000..196b4b6
Binary files /dev/null and b/test/trace/bitmapdata-getters-8.swf differ
diff --git a/test/trace/bitmapdata-getters-8.swf.trace b/test/trace/bitmapdata-getters-8.swf.trace
new file mode 100644
index 0000000..131e57a
--- /dev/null
+++ b/test/trace/bitmapdata-getters-8.swf.trace
@@ -0,0 +1,42 @@
+displaying BitmapData [object Object]
+2880
+2880
+true
+(x=0, y=0, w=2880, h=2880)
+displaying BitmapData [object Object]
+2880
+2880
+true
+0,0,2880,2880
+[object Object]
+displaying BitmapData [object Object]
+2880
+2880
+true
+0,0,2880,2880
+[object Object]
+displaying BitmapData [object Object]
+2880
+2880
+true
+-1
+displaying BitmapData [object Object]
+2880
+2880
+true
+-1
+displaying BitmapData [object Object]
+-1
+-1
+-1
+-1
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
+displaying BitmapData undefined
+undefined
+undefined
+undefined
+undefined
diff --git a/test/trace/bitmapdata-getters.as b/test/trace/bitmapdata-getters.as
new file mode 100644
index 0000000..1729203
--- /dev/null
+++ b/test/trace/bitmapdata-getters.as
@@ -0,0 +1,33 @@
+// makeswf -v 7 -s 200x150 -r 1 -o bitmapdata-getters.swf bitmapdata-getters.as
+
+function show (bd) {
+  trace ("displaying BitmapData " + bd);
+  trace (bd.width);
+  trace (bd.height);
+  trace (bd.transparent);
+  trace (bd.rectangle);
+};
+
+bd = new flash.display.BitmapData (2880, 2880, true, 0xff);
+show (bd);
+flash.geom.Rectangle = function (x, y, w, h) {
+  trace (arguments);
+  this.x = x;
+  this.y = y;
+  this.width = w;
+  this.height = h;
+};
+show (bd);
+show (bd);
+flash.geom.Rectangle = 42;
+show (bd);
+_global.flash = 42;
+show (bd);
+bd.dispose ();
+show (bd);
+
+show (new flash.display.BitmapData (0, 10, true, 0xff));
+show (new flash.display.BitmapData (-1, 10, false, 0xff));
+
+getURL ("fscommand:quit", "");
+
commit 51224eb4461317629806509782dff72bf7338149
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 23 23:34:33 2008 +0200

    account for memory of BitmapData structure

diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 4e91126..8217308 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -33,14 +33,24 @@
 G_DEFINE_TYPE (SwfdecBitmapData, swfdec_bitmap_data, SWFDEC_TYPE_AS_OBJECT)
 
 static void
+swfdec_bitmap_data_clear (SwfdecBitmapData *bitmap)
+{
+  if (bitmap->surface == NULL)
+    return;
+
+  swfdec_as_context_unuse_mem (SWFDEC_AS_OBJECT (bitmap)->context, 4 * 
+      cairo_image_surface_get_width (bitmap->surface) *
+      cairo_image_surface_get_height (bitmap->surface));
+  cairo_surface_destroy (bitmap->surface);
+  bitmap->surface = NULL;
+}
+
+static void
 swfdec_bitmap_data_dispose (GObject *object)
 {
   SwfdecBitmapData *bitmap = SWFDEC_BITMAP_DATA (object);
 
-  if (bitmap->surface) {
-    cairo_surface_destroy (bitmap->surface);
-    bitmap->surface = NULL;
-  }
+  swfdec_bitmap_data_clear (bitmap);
 
   G_OBJECT_CLASS (swfdec_bitmap_data_parent_class)->dispose (object);
 }
@@ -362,10 +372,7 @@ swfdec_bitmap_data_do_dispose (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
 
-  if (bitmap->surface) {
-    cairo_surface_destroy (bitmap->surface);
-    bitmap->surface = NULL;
-  }
+  swfdec_bitmap_data_clear (bitmap);
 }
 
 SWFDEC_AS_NATIVE (1100, 23, swfdec_bitmap_data_generateFilterRect)
@@ -402,7 +409,12 @@ swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "ii|bi", 
       &w, &h, &transparent, &color);
   
-  if (w > 2880 || h > 2880)
+  if (w > 2880 || w <= 0 || h > 2880 || h <= 0) {
+    SWFDEC_FIXME ("the constructor should return undefined here");
+    return;
+  }
+
+  if (!swfdec_as_context_try_use_mem (cx, w * h * 4))
     return;
 
   bitmap->surface = cairo_image_surface_create (
commit bf56b2c9a6e6b824adc6bf99b478f719051ec952
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 23 22:58:43 2008 +0200

    implement constructor and getters for BitmapData

diff --git a/swfdec/swfdec_as_strings.c b/swfdec/swfdec_as_strings.c
index b09f0c3..3d07ab2 100644
--- a/swfdec/swfdec_as_strings.c
+++ b/swfdec/swfdec_as_strings.c
@@ -524,5 +524,6 @@ const char swfdec_as_strings[] =
   SWFDEC_AS_CONSTANT_STRING ("videoCodec")
   SWFDEC_AS_CONSTANT_STRING ("System")
   SWFDEC_AS_CONSTANT_STRING ("__resolve")
+  SWFDEC_AS_CONSTANT_STRING ("Rectangle")
   /* add more here */
 ;
diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 4686140..4e91126 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -1,5 +1,6 @@
 /* Swfdec
  * Copyright (C) 2007 Pekka Lampila <pekka.lampila at iki.fi>
+ *		 2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -21,9 +22,42 @@
 #include "config.h"
 #endif
 
+#include "swfdec_bitmap_data.h"
+#include "swfdec_as_context.h"
 #include "swfdec_as_internal.h"
+#include "swfdec_as_native_function.h"
+#include "swfdec_as_strings.h"
+#include "swfdec_color.h"
 #include "swfdec_debug.h"
 
+G_DEFINE_TYPE (SwfdecBitmapData, swfdec_bitmap_data, SWFDEC_TYPE_AS_OBJECT)
+
+static void
+swfdec_bitmap_data_dispose (GObject *object)
+{
+  SwfdecBitmapData *bitmap = SWFDEC_BITMAP_DATA (object);
+
+  if (bitmap->surface) {
+    cairo_surface_destroy (bitmap->surface);
+    bitmap->surface = NULL;
+  }
+
+  G_OBJECT_CLASS (swfdec_bitmap_data_parent_class)->dispose (object);
+}
+
+static void
+swfdec_bitmap_data_class_init (SwfdecBitmapDataClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose = swfdec_bitmap_data_dispose;
+}
+
+static void
+swfdec_bitmap_data_init (SwfdecBitmapData *transform)
+{
+}
+
 // static
 SWFDEC_AS_NATIVE (1100, 40, swfdec_bitmap_data_loadBitmap)
 void
@@ -39,7 +73,12 @@ void
 swfdec_bitmap_data_get_width (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.width (get)");
+  SwfdecBitmapData *bitmap;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
+
+  SWFDEC_AS_VALUE_SET_INT (ret, bitmap->surface ? 
+      cairo_image_surface_get_width (bitmap->surface) : -1);
 }
 
 SWFDEC_AS_NATIVE (1100, 101, swfdec_bitmap_data_set_width)
@@ -55,7 +94,12 @@ void
 swfdec_bitmap_data_get_height (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.height (get)");
+  SwfdecBitmapData *bitmap;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
+
+  SWFDEC_AS_VALUE_SET_INT (ret, bitmap->surface ? 
+      cairo_image_surface_get_width (bitmap->surface) : -1);
 }
 
 SWFDEC_AS_NATIVE (1100, 103, swfdec_bitmap_data_set_height)
@@ -71,7 +115,37 @@ void
 swfdec_bitmap_data_get_rectangle (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.rectangle (get)");
+  SwfdecBitmapData *bitmap;
+  SwfdecAsObject *o;
+  SwfdecAsValue args[4];
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
+
+  SWFDEC_AS_VALUE_SET_INT (ret, -1);
+  if (bitmap->surface == NULL)
+    return;
+  
+  swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_flash, args);
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (args))
+    return;
+  o = SWFDEC_AS_VALUE_GET_OBJECT (args);
+  swfdec_as_object_get_variable (o, SWFDEC_AS_STR_geom, args);
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (args))
+    return;
+  o = SWFDEC_AS_VALUE_GET_OBJECT (args);
+  swfdec_as_object_get_variable (o, SWFDEC_AS_STR_Rectangle, args);
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (args))
+    return;
+  o = SWFDEC_AS_VALUE_GET_OBJECT (args);
+  if (!SWFDEC_IS_AS_FUNCTION (o))
+    return;
+
+  SWFDEC_AS_VALUE_SET_INT (&args[0], 0);
+  SWFDEC_AS_VALUE_SET_INT (&args[1], 0);
+  SWFDEC_AS_VALUE_SET_INT (&args[2], cairo_image_surface_get_width (bitmap->surface));
+  SWFDEC_AS_VALUE_SET_INT (&args[3], cairo_image_surface_get_width (bitmap->surface));
+  swfdec_as_object_create (SWFDEC_AS_FUNCTION (o), 4, args, ret);
+  swfdec_as_context_run (cx);
 }
 
 SWFDEC_AS_NATIVE (1100, 105, swfdec_bitmap_data_set_rectangle)
@@ -88,7 +162,16 @@ swfdec_bitmap_data_get_transparent (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
     SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.transparent (get)");
+  SwfdecBitmapData *bitmap;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
+
+  if (bitmap->surface) {
+    SWFDEC_AS_VALUE_SET_BOOLEAN (ret, 
+	cairo_image_surface_get_format (bitmap->surface) != CAIRO_FORMAT_RGB24);
+  } else {
+    SWFDEC_AS_VALUE_SET_INT (ret, -1);
+  }
 }
 
 SWFDEC_AS_NATIVE (1100, 107, swfdec_bitmap_data_set_transparent)
@@ -270,12 +353,19 @@ swfdec_bitmap_data_clone (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_STUB ("BitmapData.clone");
 }
 
-SWFDEC_AS_NATIVE (1100, 22, swfdec_bitmap_data_dispose)
+SWFDEC_AS_NATIVE (1100, 22, swfdec_bitmap_data_do_dispose)
 void
-swfdec_bitmap_data_dispose (SwfdecAsContext *cx, SwfdecAsObject *object,
+swfdec_bitmap_data_do_dispose (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.dispose");
+  SwfdecBitmapData *bitmap;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "");
+
+  if (bitmap->surface) {
+    cairo_surface_destroy (bitmap->surface);
+    bitmap->surface = NULL;
+  }
 }
 
 SWFDEC_AS_NATIVE (1100, 23, swfdec_bitmap_data_generateFilterRect)
@@ -296,11 +386,31 @@ swfdec_bitmap_data_compare (SwfdecAsContext *cx,
   SWFDEC_STUB ("BitmapData.compare");
 }
 
-// constructor
-SWFDEC_AS_NATIVE (1100, 0, swfdec_bitmap_data_construct)
+SWFDEC_AS_CONSTRUCTOR (1100, 0, swfdec_bitmap_data_construct, swfdec_bitmap_data_get_type)
 void
 swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData");
+  SwfdecBitmapData *bitmap;
+  int w, h;
+  gboolean transparent;
+  int color;
+
+  if (!swfdec_as_context_is_constructing (cx))
+    return;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "ii|bi", 
+      &w, &h, &transparent, &color);
+  
+  if (w > 2880 || h > 2880)
+    return;
+
+  bitmap->surface = cairo_image_surface_create (
+      transparent ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, w, h);
+  if (color) {
+    cairo_t *cr = cairo_create (bitmap->surface);
+    swfdec_color_set_source (cr, color);
+    cairo_paint (cr);
+    cairo_destroy (cr);
+  }
 }


More information about the Swfdec-commits mailing list