[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