[Swfdec-commits] 8 commits - swfdec/swfdec_as_relay.c swfdec/swfdec_as_relay.h swfdec/swfdec_bitmap_data.c swfdec/swfdec_bitmap_data.h swfdec/swfdec_blur_filter_as.c swfdec/swfdec_color_matrix_filter_as.c swfdec/swfdec_color_transform_as.c swfdec/swfdec_color_transform_as.h swfdec/swfdec_filter.c swfdec/swfdec_filter.h swfdec/swfdec_initialize.as swfdec/swfdec_initialize.h swfdec/swfdec_movie_as_drawing.c swfdec/swfdec_net_connection.c swfdec/swfdec_net_connection.h swfdec/swfdec_sound_object.c swfdec/swfdec_sound_object.h swfdec/swfdec_sprite_movie_as.c swfdec/swfdec_style_sheet.c swfdec/swfdec_style_sheet.h swfdec/swfdec_text_field_movie_as.c swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie_html.c swfdec/swfdec_text_format.c swfdec/swfdec_text_format.h swfdec/swfdec_transform_as.c swfdec/swfdec_transform_as.h

Benjamin Otte company at kemper.freedesktop.org
Tue Oct 21 14:31:51 PDT 2008


 swfdec/swfdec_as_relay.c               |   14 +---
 swfdec/swfdec_as_relay.h               |    1 
 swfdec/swfdec_bitmap_data.c            |   43 ++++++++------
 swfdec/swfdec_bitmap_data.h            |    8 +-
 swfdec/swfdec_blur_filter_as.c         |    7 +-
 swfdec/swfdec_color_matrix_filter_as.c |    8 ++
 swfdec/swfdec_color_transform_as.c     |   34 +++++------
 swfdec/swfdec_color_transform_as.h     |    8 +-
 swfdec/swfdec_filter.c                 |    2 
 swfdec/swfdec_filter.h                 |    6 +-
 swfdec/swfdec_initialize.as            |    2 
 swfdec/swfdec_initialize.h             |    2 
 swfdec/swfdec_movie_as_drawing.c       |    6 +-
 swfdec/swfdec_net_connection.c         |   22 +++++--
 swfdec/swfdec_net_connection.h         |    8 +-
 swfdec/swfdec_sound_object.c           |   11 ++-
 swfdec/swfdec_sound_object.h           |    5 +
 swfdec/swfdec_sprite_movie_as.c        |   15 ++---
 swfdec/swfdec_style_sheet.c            |   23 ++++---
 swfdec/swfdec_style_sheet.h            |   24 +++-----
 swfdec/swfdec_text_field_movie.c       |    4 -
 swfdec/swfdec_text_field_movie_as.c    |   32 +++++------
 swfdec/swfdec_text_field_movie_html.c  |   10 +--
 swfdec/swfdec_text_format.c            |   96 ++++++++++++++++-----------------
 swfdec/swfdec_text_format.h            |   34 +++++------
 swfdec/swfdec_transform_as.c           |   56 +++++++++++++------
 swfdec/swfdec_transform_as.h           |    8 +-
 27 files changed, 264 insertions(+), 225 deletions(-)

New commits:
commit b17ebc1e5a060beda6cd83400bd5f9e928a6067b
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 23:05:44 2008 +0200

    NetConnection is a relay now

diff --git a/swfdec/swfdec_net_connection.c b/swfdec/swfdec_net_connection.c
index d826502..29f0a04 100644
--- a/swfdec/swfdec_net_connection.c
+++ b/swfdec/swfdec_net_connection.c
@@ -33,15 +33,15 @@
 
 /*** SwfdecNetConnection ***/
 
-G_DEFINE_TYPE (SwfdecNetConnection, swfdec_net_connection, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecNetConnection, swfdec_net_connection, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_net_connection_dispose (GObject *object)
 {
-  SwfdecNetConnection *net_connection = SWFDEC_NET_CONNECTION (object);
+  SwfdecNetConnection *conn = SWFDEC_NET_CONNECTION (object);
 
-  g_free (net_connection->url);
-  net_connection->url = NULL;
+  g_free (conn->url);
+  conn->url = NULL;
 
   G_OBJECT_CLASS (swfdec_net_connection_parent_class)->dispose (object);
 }
@@ -76,7 +76,7 @@ swfdec_net_connection_onstatus (SwfdecNetConnection *conn, const char *code,
     swfdec_as_object_set_variable (info, SWFDEC_AS_STR_description, &value);
   }
   SWFDEC_AS_VALUE_SET_OBJECT (&value, info);
-  swfdec_as_object_call (SWFDEC_AS_OBJECT (conn), SWFDEC_AS_STR_onStatus, 1, &value, NULL);
+  swfdec_as_relay_call (SWFDEC_AS_RELAY(conn), SWFDEC_AS_STR_onStatus, 1, &value, NULL);
 }
 
 void
@@ -111,7 +111,8 @@ swfdec_net_connection_do_connect (SwfdecAsContext *cx, SwfdecAsObject *object,
   } else if (SWFDEC_AS_VALUE_IS_NULL (&val)) {
     url = NULL;
   } else {
-    SWFDEC_FIXME ("untested argument to NetConnection.connect: type %u", val.type);
+    SWFDEC_FIXME ("untested argument to NetConnection.connect: type %u",
+	SWFDEC_AS_VALUE_GET_TYPE (&val));
     url = NULL;
   }
   swfdec_net_connection_connect (conn, url);
@@ -160,10 +161,17 @@ swfdec_net_connection_get_usingTLS (SwfdecAsContext *cx,
 }
 
 // not actually the constructor, but called from the constructor
-SWFDEC_AS_CONSTRUCTOR (2100, 200, swfdec_net_connection_construct, swfdec_net_connection_get_type)
+SWFDEC_AS_NATIVE (2100, 200, swfdec_net_connection_construct)
 void
 swfdec_net_connection_construct (SwfdecAsContext *cx, SwfdecAsObject *obj,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
+  SwfdecNetConnection *conn;
+
+  if (obj == NULL)
+    return;
+
+  conn = g_object_new (SWFDEC_TYPE_NET_CONNECTION, "context", cx, NULL);
   // FIXME: Set contentType and possible do some other stuff too
+  swfdec_as_object_set_relay (obj, SWFDEC_AS_RELAY (conn));
 }
diff --git a/swfdec/swfdec_net_connection.h b/swfdec/swfdec_net_connection.h
index 6ab26b8..79d5ee8 100644
--- a/swfdec/swfdec_net_connection.h
+++ b/swfdec/swfdec_net_connection.h
@@ -1,5 +1,5 @@
 /* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-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
@@ -20,7 +20,7 @@
 #ifndef _SWFDEC_NET_CONNECTION_H_
 #define _SWFDEC_NET_CONNECTION_H_
 
-#include <swfdec/swfdec_as_object.h>
+#include <swfdec/swfdec_as_relay.h>
 
 G_BEGIN_DECLS
 
@@ -36,13 +36,13 @@ typedef struct _SwfdecNetConnectionClass SwfdecNetConnectionClass;
 #define SWFDEC_NET_CONNECTION_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_NET_CONNECTION, SwfdecNetConnectionClass))
 
 struct _SwfdecNetConnection {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   char *		url;		/* url for this net_connection or NULL for none */
 };
 
 struct _SwfdecNetConnectionClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_net_connection_get_type	(void);
commit 491afcf5cf98c2268abb9fbd98a23584415aa859
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 22:01:10 2008 +0200

    make Transform a relay, too

diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 761e4ef..c146ca4 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -178,12 +178,13 @@ void
 swfdec_sprite_movie_get_transform (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
+  SwfdecTransformAs *trans;
   SwfdecMovie *movie;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, &movie, "");
 
-  SWFDEC_AS_VALUE_SET_OBJECT (rval,
-      SWFDEC_AS_OBJECT (swfdec_transform_as_new (cx, movie)));
+  trans = swfdec_transform_as_new (cx, movie);
+  SWFDEC_AS_VALUE_SET_OBJECT (rval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (trans)));
 }
 
 SWFDEC_AS_NATIVE (900, 420, swfdec_sprite_movie_set_transform)
diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index f70b3d3..eed7401 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -1,5 +1,6 @@
 /* Swfdec
  * Copyright (C) 2007-2008 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
@@ -24,17 +25,30 @@
 #include "swfdec_transform_as.h"
 
 #include "swfdec_color_transform_as.h"
-#include "swfdec_as_strings.h"
 #include "swfdec_as_internal.h"
-#include "swfdec_as_frame_internal.h"
+#include "swfdec_as_strings.h"
 #include "swfdec_debug.h"
 #include "swfdec_utils.h"
 
-G_DEFINE_TYPE (SwfdecTransformAs, swfdec_transform_as, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecTransformAs, swfdec_transform_as, SWFDEC_TYPE_AS_RELAY)
+
+static void
+swfdec_transform_as_mark (SwfdecGcObject *object)
+{
+  SwfdecTransformAs *trans = SWFDEC_TRANSFORM_AS (object);
+
+  if (trans->target != NULL)
+    swfdec_gc_object_mark (trans->target);
+
+  SWFDEC_GC_OBJECT_CLASS (swfdec_transform_as_parent_class)->mark (object);
+}
 
 static void
 swfdec_transform_as_class_init (SwfdecTransformAsClass *klass)
 {
+  SwfdecGcObjectClass *gc_class = SWFDEC_GC_OBJECT_CLASS (klass);
+
+  gc_class->mark = swfdec_transform_as_mark;
 }
 
 static void
@@ -225,12 +239,14 @@ swfdec_transform_as_set_pixelBounds (SwfdecAsContext *cx,
 }
 
 // constructor
-SWFDEC_AS_CONSTRUCTOR (1106, 0, swfdec_transform_as_construct, swfdec_transform_as_get_type)
+SWFDEC_AS_NATIVE (1106, 0, swfdec_transform_as_construct)
 void
 swfdec_transform_as_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  if (!cx->frame->construct)
+  SwfdecTransformAs *trans;
+
+  if (!swfdec_as_context_is_constructing (cx))
     return;
 
   if (argc < 1 ||
@@ -240,23 +256,29 @@ swfdec_transform_as_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     return;
   }
 
-  SWFDEC_TRANSFORM_AS (object)->target =
-    SWFDEC_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]));
+  trans = g_object_new (SWFDEC_TYPE_TRANSFORM_AS, "context", cx, NULL);
+  trans->target = SWFDEC_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]));
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (trans));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
 
 SwfdecTransformAs *
 swfdec_transform_as_new (SwfdecAsContext *context, SwfdecMovie *target)
 {
   SwfdecTransformAs *transform;
+  SwfdecAsObject *object;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   g_return_val_if_fail (SWFDEC_IS_MOVIE (target), NULL);
 
   transform = g_object_new (SWFDEC_TYPE_TRANSFORM_AS, "context", context, NULL);
+  transform->target = target;
 
-  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (transform),
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_constructor_by_name (object,
       SWFDEC_AS_STR_flash, SWFDEC_AS_STR_geom, SWFDEC_AS_STR_Transform, NULL);
-  transform->target = target;
+
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (transform));
 
   return transform;
 }
diff --git a/swfdec/swfdec_transform_as.h b/swfdec/swfdec_transform_as.h
index 8d21f49..1b4b93e 100644
--- a/swfdec/swfdec_transform_as.h
+++ b/swfdec/swfdec_transform_as.h
@@ -1,5 +1,6 @@
 /* Swfdec
  * Copyright (C) 2008 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,8 +22,7 @@
 #define _SWFDEC_TRANSFORM_H_
 
 #include <swfdec/swfdec_movie.h>
-#include <swfdec/swfdec_as_object.h>
-#include <swfdec/swfdec_as_types.h>
+#include <swfdec/swfdec_as_relay.h>
 
 G_BEGIN_DECLS
 
@@ -37,13 +37,13 @@ typedef struct _SwfdecTransformAsClass SwfdecTransformAsClass;
 #define SWFDEC_TRANSFORM_AS_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_TRANSFORM_AS, SwfdecTransformAsClass))
 
 struct _SwfdecTransformAs {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   SwfdecMovie *		target;
 };
 
 struct _SwfdecTransformAsClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_transform_as_get_type	(void);
commit 14b41ffa05b81358f101d1e3dfaa8789b311b044
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 21:27:34 2008 +0200

    make TextFormat a relay

diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 954024e..606a56d 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -1065,16 +1065,14 @@ swfdec_text_field_movie_getNewTextFormat (SwfdecAsContext *cx,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (cx));
-  if (format == NULL)
-    return;
+  format = swfdec_text_format_new (cx);
 
   swfdec_text_attributes_copy (&format->attr, 
       swfdec_text_buffer_get_default_attributes (text->text),
       SWFDEC_TEXT_ATTRIBUTES_MASK);
   format->values_set = SWFDEC_TEXT_ATTRIBUTES_MASK;
 
-  SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (format));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (format)));
 }
 
 SWFDEC_AS_NATIVE (104, 105, swfdec_text_field_movie_setNewTextFormat)
@@ -1084,13 +1082,15 @@ swfdec_text_field_movie_setNewTextFormat (SwfdecAsContext *cx,
     SwfdecAsValue *ret)
 {
   SwfdecTextFieldMovie *text;
+  SwfdecAsObject *format_object;
   SwfdecTextFormat *format;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "o", &format);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "o", &format_object);
 
-  if (!SWFDEC_IS_TEXT_FORMAT (format))
+  if (!SWFDEC_IS_TEXT_FORMAT (format_object->relay))
     return;
 
+  format = SWFDEC_TEXT_FORMAT (format_object->relay);
   swfdec_text_buffer_set_default_attributes (text->text, 
       &format->attr, format->values_set);
 }
@@ -1142,10 +1142,10 @@ swfdec_text_field_movie_setTextFormat (SwfdecAsContext *cx,
 
   if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[i]))
     return;
-  if (!SWFDEC_IS_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i])))
+  if (!SWFDEC_IS_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i])->relay))
     return;
 
-  format = SWFDEC_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i]));
+  format = SWFDEC_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i])->relay);
   start = g_utf8_offset_to_pointer (string, start) - string;
   end = g_utf8_offset_to_pointer (string, end) - string;
 
@@ -1182,8 +1182,8 @@ swfdec_text_field_movie_getTextFormat (SwfdecAsContext *cx,
   string = swfdec_text_buffer_get_text (text->text);
   length = g_utf8_strlen (string, -1);
 
-  format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (cx));
-  SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (format));
+  format = swfdec_text_format_new (cx);
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (format)));
 
   if (argc == 0) {
     start = 0;
diff --git a/swfdec/swfdec_text_field_movie_html.c b/swfdec/swfdec_text_field_movie_html.c
index b670062..81e68e2 100644
--- a/swfdec/swfdec_text_field_movie_html.c
+++ b/swfdec/swfdec_text_field_movie_html.c
@@ -128,7 +128,7 @@ swfdec_text_field_movie_html_tag_set_attribute (ParserData *data,
   if (!tag->format)
     return;
 
-  object = SWFDEC_AS_OBJECT (tag->format);
+  object = swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (tag->format));
   cx = swfdec_gc_object_get_context (object);
   SWFDEC_AS_VALUE_SET_STRING (&val, swfdec_as_context_give_string (
 	cx, g_strndup (value, value_length)));
@@ -381,14 +381,14 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
     tag = g_new0 (ParserTag, 1);
     tag->name = name;
     tag->name_length = name_length;
-    tag->format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (data->cx));
+    tag->format = swfdec_text_format_new (data->cx);
     tag->index = swfdec_text_buffer_get_length (data->text);
 
     data->tags_open = g_slist_prepend (data->tags_open, tag);
 
     // set format based on tag
     if (tag->format != NULL) {
-      object = SWFDEC_AS_OBJECT (tag->format);
+      object = swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (tag->format));
       SWFDEC_AS_VALUE_SET_BOOLEAN (&val, TRUE);
 
       if (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2)) {
diff --git a/swfdec/swfdec_text_format.c b/swfdec/swfdec_text_format.c
index c45379d..281e512 100644
--- a/swfdec/swfdec_text_format.c
+++ b/swfdec/swfdec_text_format.c
@@ -39,7 +39,7 @@
 #include "swfdec_text_buffer.h"
 #include "swfdec_text_layout.h"
 
-G_DEFINE_TYPE (SwfdecTextFormat, swfdec_text_format, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecTextFormat, swfdec_text_format, SWFDEC_TYPE_AS_RELAY)
 
 static int property_offsets[] = {
   G_STRUCT_OFFSET (SwfdecTextFormat, attr.align),
@@ -93,9 +93,9 @@ swfdec_text_format_get_string (SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, property)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -114,9 +114,9 @@ swfdec_text_format_set_string (SwfdecAsObject *object,
   SwfdecAsContext *context;
   const char *s;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -143,9 +143,9 @@ swfdec_text_format_get_boolean (SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, property)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -166,9 +166,9 @@ swfdec_text_format_set_boolean (SwfdecAsObject *object,
   SwfdecTextFormat *format;
   SwfdecAsContext *context;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -194,9 +194,9 @@ swfdec_text_format_get_integer (SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, property)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -254,9 +254,9 @@ swfdec_text_format_set_integer (SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -278,9 +278,9 @@ swfdec_text_format_do_get_align (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, SWFDEC_TEXT_ATTRIBUTE_ALIGN)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -312,9 +312,9 @@ swfdec_text_format_do_set_align (SwfdecAsContext *cx, SwfdecAsObject *object,
   SwfdecTextFormat *format;
   const char *s;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -389,9 +389,9 @@ swfdec_text_format_do_get_color (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, SWFDEC_TEXT_ATTRIBUTE_COLOR)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -407,9 +407,9 @@ swfdec_text_format_do_set_color (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -432,9 +432,9 @@ swfdec_text_format_do_get_display (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, SWFDEC_TEXT_ATTRIBUTE_DISPLAY))
   {
@@ -464,9 +464,9 @@ swfdec_text_format_do_set_display (SwfdecAsContext *cx, SwfdecAsObject *object,
   SwfdecTextFormat *format;
   const char *s;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   swfdec_as_value_to_integer (cx, &argv[0]);
   swfdec_as_value_to_number (cx, &argv[0]);
@@ -579,9 +579,9 @@ swfdec_text_format_do_get_letter_spacing (SwfdecAsContext *cx,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, SWFDEC_TEXT_ATTRIBUTE_LETTER_SPACING)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -599,9 +599,9 @@ swfdec_text_format_do_set_letter_spacing (SwfdecAsContext *cx,
   SwfdecTextFormat *format;
   double d;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -665,9 +665,9 @@ swfdec_text_format_do_get_tab_stops (SwfdecAsContext *cx,
   SwfdecAsValue val;
   SwfdecAsObject *array;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (!SWFDEC_TEXT_ATTRIBUTE_IS_SET (format->values_set, SWFDEC_TEXT_ATTRIBUTE_TAB_STOPS)) {
     SWFDEC_AS_VALUE_SET_NULL (ret);
@@ -689,9 +689,9 @@ swfdec_text_format_do_set_tab_stops (SwfdecAsContext *cx,
 {
   SwfdecTextFormat *format;
 
-  if (!SWFDEC_IS_TEXT_FORMAT (object))
+  if (object == NULL || !SWFDEC_IS_TEXT_FORMAT (object->relay))
     return;
-  format = SWFDEC_TEXT_FORMAT (object);
+  format = SWFDEC_TEXT_FORMAT (object->relay);
 
   if (argc < 1)
     return;
@@ -994,7 +994,7 @@ swfdec_text_format_init_properties (SwfdecAsContext *cx)
       swfdec_text_format_do_get_url, swfdec_text_format_do_set_url);
 }
 
-SWFDEC_AS_CONSTRUCTOR (110, 0, swfdec_text_format_construct, swfdec_text_format_get_type)
+SWFDEC_AS_NATIVE (110, 0, swfdec_text_format_construct)
 void
 swfdec_text_format_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
@@ -1015,6 +1015,7 @@ swfdec_text_format_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     SWFDEC_AS_STR_leading,
     NULL
   };
+  SwfdecTextFormat *format;
   SwfdecAsFunction *function;
   SwfdecAsObject *tmp;
   SwfdecAsValue val;
@@ -1025,11 +1026,11 @@ swfdec_text_format_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     return;
   }
 
-  g_assert (SWFDEC_IS_TEXT_FORMAT (object));
-
   swfdec_text_format_init_properties (cx);
 
-  swfdec_text_format_clear (SWFDEC_TEXT_FORMAT (object));
+  format = g_object_new (SWFDEC_TYPE_TEXT_FORMAT, "context", cx, NULL);
+  swfdec_text_format_clear (format);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (format));
 
   // FIXME: Need better way to create function without prototype/constructor
   tmp = cx->Function;
@@ -1050,16 +1051,12 @@ swfdec_text_format_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 SwfdecTextFormat *
 swfdec_text_format_copy (SwfdecTextFormat *copy_from)
 {
-  SwfdecAsObject *object_to;
   SwfdecTextFormat *copy_to;
 
   g_return_val_if_fail (SWFDEC_IS_TEXT_FORMAT (copy_from), NULL);
 
-  object_to = swfdec_text_format_new_no_properties (
+  copy_to = swfdec_text_format_new_no_properties (
       swfdec_gc_object_get_context (copy_from));
-  if (object_to == NULL)
-    return NULL;
-  copy_to = SWFDEC_TEXT_FORMAT (object_to);
 
   swfdec_text_attributes_copy (&copy_to->attr, &copy_from->attr, -1);
   copy_to->values_set = copy_from->values_set;
@@ -1067,10 +1064,11 @@ swfdec_text_format_copy (SwfdecTextFormat *copy_from)
   return copy_to;
 }
 
-SwfdecAsObject *
+SwfdecTextFormat *
 swfdec_text_format_new_no_properties (SwfdecAsContext *context)
 {
-  SwfdecAsObject *tmp, *ret;
+  SwfdecAsObject *tmp, *object;
+  SwfdecTextFormat *ret;
   SwfdecAsFunction *function;
   SwfdecAsValue val;
 
@@ -1078,8 +1076,10 @@ swfdec_text_format_new_no_properties (SwfdecAsContext *context)
 
   ret = g_object_new (SWFDEC_TYPE_TEXT_FORMAT, "context", context, NULL);
 
-  swfdec_text_format_clear (SWFDEC_TEXT_FORMAT (ret));
-  swfdec_as_object_set_constructor_by_name (ret, SWFDEC_AS_STR_TextFormat, NULL);
+  swfdec_text_format_clear (ret);
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_constructor_by_name (object, SWFDEC_AS_STR_TextFormat, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (ret));
 
   // FIXME: Need better way to create function without prototype/constructor
   tmp = context->Function;
@@ -1089,13 +1089,13 @@ swfdec_text_format_new_no_properties (SwfdecAsContext *context)
   context->Function = tmp;
   if (function != NULL) {
     SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (function));
-    swfdec_as_object_set_variable (ret, SWFDEC_AS_STR_getTextExtent, &val);
+    swfdec_as_object_set_variable (object, SWFDEC_AS_STR_getTextExtent, &val);
   }
 
   return ret;
 }
 
-SwfdecAsObject *
+SwfdecTextFormat *
 swfdec_text_format_new (SwfdecAsContext *context)
 {
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
diff --git a/swfdec/swfdec_text_format.h b/swfdec/swfdec_text_format.h
index a5f32a4..c4ba7ad 100644
--- a/swfdec/swfdec_text_format.h
+++ b/swfdec/swfdec_text_format.h
@@ -21,11 +21,9 @@
 #ifndef _SWFDEC_TEXT_FORMAT_H_
 #define _SWFDEC_TEXT_FORMAT_H_
 
-#include <swfdec/swfdec_as_object.h>
-#include <swfdec/swfdec_as_array.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_text_attributes.h>
 #include <swfdec/swfdec_types.h>
-#include <swfdec/swfdec_script.h>
 
 G_BEGIN_DECLS
 
@@ -40,7 +38,7 @@ typedef struct _SwfdecTextFormatClass SwfdecTextFormatClass;
 #define SWFDEC_TEXT_FORMAT_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_TEXT_FORMAT, SwfdecTextFormatClass))
 
 struct _SwfdecTextFormat {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   SwfdecTextAttributes	attr;
 
@@ -48,24 +46,24 @@ struct _SwfdecTextFormat {
 };
 
 struct _SwfdecTextFormatClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType		swfdec_text_format_get_type	(void);
 
-SwfdecAsObject * swfdec_text_format_new		(SwfdecAsContext *	context);
-SwfdecAsObject * swfdec_text_format_new_no_properties (SwfdecAsContext *	context);
-void		swfdec_text_format_set_defaults	(SwfdecTextFormat *	format);
-SwfdecTextFormat * swfdec_text_format_copy	(SwfdecTextFormat *	copy_from);
-void		swfdec_text_format_add		(SwfdecTextFormat *	format,
-						 const SwfdecTextFormat *from);
-gboolean	swfdec_text_format_equal	(const SwfdecTextFormat *a,
-						 const SwfdecTextFormat *b);
-gboolean	swfdec_text_format_equal_or_undefined	(const SwfdecTextFormat *a,
-						 const SwfdecTextFormat *b);
-void		swfdec_text_format_remove_different (SwfdecTextFormat *		format,
-						 const SwfdecTextFormat *	from);
-void		swfdec_text_format_init_properties (SwfdecAsContext *		cx);
+SwfdecTextFormat *	swfdec_text_format_new			(SwfdecAsContext *	context);
+SwfdecTextFormat *	swfdec_text_format_new_no_properties	(SwfdecAsContext *	context);
+void			swfdec_text_format_set_defaults		(SwfdecTextFormat *	format);
+SwfdecTextFormat *	swfdec_text_format_copy			(SwfdecTextFormat *	copy_from);
+void	 		swfdec_text_format_add			(SwfdecTextFormat *	format,
+								 const SwfdecTextFormat *from);
+gboolean		swfdec_text_format_equal		(const SwfdecTextFormat *a,
+								 const SwfdecTextFormat *b);
+gboolean		swfdec_text_format_equal_or_undefined	(const SwfdecTextFormat *a,
+								 const SwfdecTextFormat *b);
+void			swfdec_text_format_remove_different	(SwfdecTextFormat *	format,
+								 const SwfdecTextFormat *from);
+void			swfdec_text_format_init_properties	(SwfdecAsContext *	cx);
 
 G_END_DECLS
 #endif
commit 51db426c52ccc9f586c573941c5aea5833e62ddc
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 19:18:31 2008 +0200

    make ColorTransform a relay

diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 6f5ba03..17023ff 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -499,8 +499,8 @@ swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
   } else {
     cairo_matrix_init_identity (&mat);
   }
-  if (SWFDEC_IS_COLOR_TRANSFORM_AS (trans)) {
-    swfdec_color_transform_get_transform (SWFDEC_COLOR_TRANSFORM_AS (trans), &ctrans);
+  if (trans && SWFDEC_IS_COLOR_TRANSFORM_AS (trans->relay)) {
+    swfdec_color_transform_get_transform (SWFDEC_COLOR_TRANSFORM_AS (trans->relay), &ctrans);
   } else {
     swfdec_color_transform_init_identity (&ctrans);
   }
@@ -633,8 +633,8 @@ swfdec_bitmap_data_colorTransform (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   if (!swfdec_rectangle_from_as_object (&area, rect))
     return;
-  if (SWFDEC_IS_COLOR_TRANSFORM_AS (trans))
-    swfdec_color_transform_get_transform (SWFDEC_COLOR_TRANSFORM_AS (trans), &ctrans);
+  if (trans &&  SWFDEC_IS_COLOR_TRANSFORM_AS (trans->relay))
+    swfdec_color_transform_get_transform (SWFDEC_COLOR_TRANSFORM_AS (trans->relay), &ctrans);
   else
     return;
 
diff --git a/swfdec/swfdec_color_transform_as.c b/swfdec/swfdec_color_transform_as.c
index 1b7b6ff..953217a 100644
--- a/swfdec/swfdec_color_transform_as.c
+++ b/swfdec/swfdec_color_transform_as.c
@@ -27,7 +27,7 @@
 #include "swfdec_as_frame_internal.h"
 #include "swfdec_debug.h"
 
-G_DEFINE_TYPE (SwfdecColorTransformAs, swfdec_color_transform_as, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecColorTransformAs, swfdec_color_transform_as, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_color_transform_as_class_init (SwfdecColorTransformAsClass *klass)
@@ -316,9 +316,9 @@ swfdec_color_transform_as_concat (SwfdecAsContext *cx,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_COLOR_TRANSFORM_AS, &transform, "o",
       &other_object);
 
-  if (!SWFDEC_IS_COLOR_TRANSFORM_AS (other_object))
+  if (!SWFDEC_IS_COLOR_TRANSFORM_AS (other_object->relay))
     return;
-  other = SWFDEC_COLOR_TRANSFORM_AS (other_object);
+  other = SWFDEC_COLOR_TRANSFORM_AS (other_object->relay);
 
   transform->rb += (transform->ra * other->rb);
   transform->gb += (transform->ga * other->gb);
@@ -331,32 +331,27 @@ swfdec_color_transform_as_concat (SwfdecAsContext *cx,
 }
 
 // constructor
-SWFDEC_AS_CONSTRUCTOR (1105, 0, swfdec_color_transform_as_construct, swfdec_color_transform_as_get_type)
+SWFDEC_AS_NATIVE (1105, 0, swfdec_color_transform_as_construct)
 void
 swfdec_color_transform_as_construct (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
     SwfdecAsValue *ret)
 {
   SwfdecColorTransformAs *transform;
-  guint i;
 
   if (!cx->frame->construct)
     return;
 
+  transform = g_object_new (SWFDEC_TYPE_COLOR_TRANSFORM_AS, "context", cx, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (transform));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
+
   if (argc < 8)
     return;
 
-  transform = SWFDEC_COLOR_TRANSFORM_AS (object);
-
-  i = 0;
-  transform->ra = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->ga = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->ba = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->aa = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->rb = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->gb = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->bb = swfdec_as_value_to_number (cx, &argv[i++]);
-  transform->ab = swfdec_as_value_to_number (cx, &argv[i++]);
+  SWFDEC_AS_CHECK (0, NULL, "nnnnnnnn", 
+      &transform->ra, &transform->ga, &transform->ba, &transform->aa,
+      &transform->rb, &transform->gb, &transform->bb, &transform->ab);
 }
 
 SwfdecColorTransformAs *
@@ -364,13 +359,16 @@ swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context,
     const SwfdecColorTransform *transform)
 {
   SwfdecColorTransformAs *transform_as;
+  SwfdecAsObject *object;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   g_return_val_if_fail (transform != NULL, NULL);
 
   transform_as = g_object_new (SWFDEC_TYPE_COLOR_TRANSFORM_AS, "context", context, NULL);
-
-  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (transform_as),
+  /* do it this way so the constructor isn't called */
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (transform_as));
+  swfdec_as_object_set_constructor_by_name (object, 
       SWFDEC_AS_STR_flash, SWFDEC_AS_STR_geom, SWFDEC_AS_STR_ColorTransform, NULL);
 
   transform_as->ra = transform->ra / 256.0;
diff --git a/swfdec/swfdec_color_transform_as.h b/swfdec/swfdec_color_transform_as.h
index 6a0704e..d281152 100644
--- a/swfdec/swfdec_color_transform_as.h
+++ b/swfdec/swfdec_color_transform_as.h
@@ -20,9 +20,7 @@
 #ifndef _SWFDEC_COLOR_TRANSFORM_H_
 #define _SWFDEC_COLOR_TRANSFORM_H_
 
-#include <swfdec/swfdec_as_object.h>
-#include <swfdec/swfdec_as_types.h>
-#include <swfdec/swfdec_types.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_color.h>
 
 G_BEGIN_DECLS
@@ -38,13 +36,13 @@ typedef struct _SwfdecColorTransformAsClass SwfdecColorTransformAsClass;
 #define SWFDEC_COLOR_TRANSFORM_AS_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_COLOR_TRANSFORM_AS, SwfdecColorTransformAsClass))
 
 struct _SwfdecColorTransformAs {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   double		ra, rb, ga, gb, ba, bb, aa, ab;
 };
 
 struct _SwfdecColorTransformAsClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_color_transform_as_get_type		(void);
diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index c27b465..f70b3d3 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -136,15 +136,16 @@ swfdec_transform_as_get_colorTransform (SwfdecAsContext *cx,
     SwfdecAsValue *ret)
 {
   SwfdecTransformAs *transform;
+  SwfdecColorTransformAs *ctrans;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TRANSFORM_AS, &transform, "");
 
   if (transform->target == NULL)
     return;
 
-  SWFDEC_AS_VALUE_SET_OBJECT (ret,
-    SWFDEC_AS_OBJECT (swfdec_color_transform_as_new_from_transform (cx,
-	&transform->target->color_transform)));
+  ctrans = swfdec_color_transform_as_new_from_transform (cx,
+      &transform->target->color_transform);
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (ctrans)));
 }
 
 SWFDEC_AS_NATIVE (1106, 106, swfdec_transform_as_set_colorTransform)
@@ -162,10 +163,10 @@ swfdec_transform_as_set_colorTransform (SwfdecAsContext *cx,
   if (self->target == NULL)
     return;
 
-  if (!SWFDEC_IS_COLOR_TRANSFORM_AS (color))
+  if (color == NULL || !SWFDEC_IS_COLOR_TRANSFORM_AS (color->relay))
     return;
 
-  transform_as = SWFDEC_COLOR_TRANSFORM_AS (color);
+  transform_as = SWFDEC_COLOR_TRANSFORM_AS (color->relay);
 
   swfdec_color_transform_get_transform (transform_as, &self->target->color_transform);
 }
@@ -178,6 +179,7 @@ swfdec_transform_as_get_concatenatedColorTransform (SwfdecAsContext *cx,
 {
   SwfdecTransformAs *self;
   SwfdecColorTransform chain;
+  SwfdecColorTransformAs *ctrans;
   SwfdecMovie *movie;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TRANSFORM_AS, &self, "");
@@ -191,8 +193,8 @@ swfdec_transform_as_get_concatenatedColorTransform (SwfdecAsContext *cx,
     swfdec_color_transform_chain (&chain, &movie->color_transform, &chain);
   }
 
-  SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (
-      swfdec_color_transform_as_new_from_transform (cx, &chain)));
+  ctrans = swfdec_color_transform_as_new_from_transform (cx, &chain);
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (ctrans)));
 }
 
 SWFDEC_AS_NATIVE (1106, 108, swfdec_transform_as_set_concatenatedColorTransform)
commit edbb7312f505b2abe9148ea7d3b72e5eb91ab8a4
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 18:07:44 2008 +0200

    make StyleSheet a relay

diff --git a/swfdec/swfdec_style_sheet.c b/swfdec/swfdec_style_sheet.c
index 94e0e29..300bbd8 100644
--- a/swfdec/swfdec_style_sheet.c
+++ b/swfdec/swfdec_style_sheet.c
@@ -41,7 +41,7 @@ enum {
   LAST_SIGNAL
 };
 
-G_DEFINE_TYPE (SwfdecStyleSheet, swfdec_style_sheet, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecStyleSheet, swfdec_style_sheet, SWFDEC_TYPE_AS_RELAY)
 static guint signals[LAST_SIGNAL] = { 0, };
 
 static void
@@ -234,7 +234,7 @@ swfdec_style_sheet_update (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   SwfdecStyleSheet *style;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_STYLESHEET, &style, "");
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_STYLE_SHEET, &style, "");
 
   g_signal_emit (style, signals[UPDATE], 0);
 }
@@ -246,12 +246,11 @@ swfdec_style_sheet_parseCSSInternal (SwfdecAsContext *cx,
     SwfdecAsValue *rval)
 {
   SwfdecAsObject *values;
+  const char *s;
 
-  if (argc < 1)
-    return;
+  SWFDEC_AS_CHECK (0, NULL, "s", &s);
 
-  values =
-    swfdec_style_sheet_parse (cx, swfdec_as_value_to_string (cx, &argv[0]));
+  values = swfdec_style_sheet_parse (cx, s);
 
   if (values == NULL) {
     SWFDEC_AS_VALUE_SET_NULL (rval);
@@ -307,17 +306,21 @@ swfdec_style_sheet_parseColor (SwfdecAsContext *cx, SwfdecAsObject *object,
   swfdec_as_value_set_integer (cx, rval, result);
 }
 
-SWFDEC_AS_CONSTRUCTOR (113, 0, swfdec_style_sheet_construct, swfdec_style_sheet_get_type)
+SWFDEC_AS_NATIVE (113, 0, swfdec_style_sheet_construct)
 void
 swfdec_style_sheet_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
+  SwfdecStyleSheet *sheet;
+
   if (!swfdec_as_context_is_constructing (cx)) {
     SWFDEC_FIXME ("What do we do if not constructing?");
     return;
   }
 
-  g_assert (SWFDEC_IS_STYLESHEET (object));
+  sheet = g_object_new (SWFDEC_TYPE_STYLE_SHEET, "context", cx, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (sheet));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
 
 static SwfdecTextFormat *
@@ -326,7 +329,7 @@ swfdec_style_sheet_get_format (SwfdecStyleSheet *style, const char *name)
   SwfdecAsObject *styles;
   SwfdecAsValue val;
 
-  g_return_val_if_fail (SWFDEC_IS_STYLESHEET (style), NULL);
+  g_return_val_if_fail (SWFDEC_IS_STYLE_SHEET (style), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
   swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (style),
@@ -355,7 +358,7 @@ swfdec_style_sheet_get_class_format (SwfdecStyleSheet *style, const char *name)
 {
   char *name_full;
 
-  g_return_val_if_fail (SWFDEC_IS_STYLESHEET (style), NULL);
+  g_return_val_if_fail (SWFDEC_IS_STYLE_SHEET (style), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
   name_full = g_malloc (1 + strlen (name) + 1);
diff --git a/swfdec/swfdec_style_sheet.h b/swfdec/swfdec_style_sheet.h
index 226ff87..d1d7292 100644
--- a/swfdec/swfdec_style_sheet.h
+++ b/swfdec/swfdec_style_sheet.h
@@ -18,12 +18,10 @@
  * Boston, MA  02110-1301  USA
  */
 
-#ifndef _SWFDEC_STYLESHEET_H_
-#define _SWFDEC_STYLESHEET_H_
+#ifndef _SWFDEC_STYLE_SHEET_H_
+#define _SWFDEC_STYLE_SHEET_H_
 
-#include <swfdec/swfdec_as_object.h>
-#include <swfdec/swfdec_types.h>
-#include <swfdec/swfdec_script.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_text_format.h>
 
 G_BEGIN_DECLS
@@ -31,19 +29,19 @@ G_BEGIN_DECLS
 typedef struct _SwfdecStyleSheet SwfdecStyleSheet;
 typedef struct _SwfdecStyleSheetClass SwfdecStyleSheetClass;
 
-#define SWFDEC_TYPE_STYLESHEET                    (swfdec_style_sheet_get_type())
-#define SWFDEC_IS_STYLESHEET(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_STYLESHEET))
-#define SWFDEC_IS_STYLESHEET_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_STYLESHEET))
-#define SWFDEC_STYLESHEET(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_STYLESHEET, SwfdecStyleSheet))
-#define SWFDEC_STYLESHEET_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_STYLESHEET, SwfdecStyleSheetClass))
-#define SWFDEC_STYLESHEET_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_STYLESHEET, SwfdecStyleSheetClass))
+#define SWFDEC_TYPE_STYLE_SHEET                    (swfdec_style_sheet_get_type())
+#define SWFDEC_IS_STYLE_SHEET(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_STYLE_SHEET))
+#define SWFDEC_IS_STYLE_SHEET_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_STYLE_SHEET))
+#define SWFDEC_STYLE_SHEET(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_STYLE_SHEET, SwfdecStyleSheet))
+#define SWFDEC_STYLE_SHEET_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_STYLE_SHEET, SwfdecStyleSheetClass))
+#define SWFDEC_STYLE_SHEET_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_STYLE_SHEET, SwfdecStyleSheetClass))
 
 struct _SwfdecStyleSheet {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 };
 
 struct _SwfdecStyleSheetClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType		swfdec_style_sheet_get_type	(void);
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index bbebe17..e36d581 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -288,8 +288,8 @@ swfdec_text_field_movie_dispose (GObject *object)
   text = SWFDEC_TEXT_FIELD_MOVIE (object);
 
   if (text->style_sheet) {
-    if (SWFDEC_IS_STYLESHEET (text->style_sheet)) {
-      g_signal_handlers_disconnect_matched (text->style_sheet, 
+    if (SWFDEC_IS_STYLE_SHEET (text->style_sheet->relay)) {
+      g_signal_handlers_disconnect_matched (text->style_sheet->relay, 
 	  G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, text);
     }
     text->style_sheet = NULL;
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 18c4c35..954024e 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -914,19 +914,19 @@ swfdec_text_field_movie_set_styleSheet (SwfdecAsContext *cx,
   if (text->style_sheet == value)
     return;
 
-  if (text->style_sheet != NULL && SWFDEC_IS_STYLESHEET (text->style_sheet)) {
-    g_signal_handlers_disconnect_by_func (text->style_sheet,
+  if (text->style_sheet != NULL && SWFDEC_IS_STYLE_SHEET (text->style_sheet->relay)) {
+    g_signal_handlers_disconnect_by_func (text->style_sheet->relay,
 	 swfdec_text_field_movie_style_sheet_update, text);
-    g_object_remove_weak_pointer (G_OBJECT (text->style_sheet), 
+    g_object_remove_weak_pointer (G_OBJECT (text->style_sheet->relay), 
 	(gpointer) &text->style_sheet);
   }
 
   text->style_sheet = value;
 
-  if (SWFDEC_IS_STYLESHEET (value)) {
-    g_signal_connect_swapped (value, "update",
+  if (value && SWFDEC_IS_STYLE_SHEET (value->relay)) {
+    g_signal_connect_swapped (value->relay, "update",
 	G_CALLBACK (swfdec_text_field_movie_style_sheet_update), text);
-    g_object_add_weak_pointer (G_OBJECT (text->style_sheet), 
+    g_object_add_weak_pointer (G_OBJECT (text->style_sheet->relay), 
 	(gpointer) &text->style_sheet);
 
     swfdec_text_field_movie_style_sheet_update (text);
diff --git a/swfdec/swfdec_text_field_movie_html.c b/swfdec/swfdec_text_field_movie_html.c
index a68bb1c..b670062 100644
--- a/swfdec/swfdec_text_field_movie_html.c
+++ b/swfdec/swfdec_text_field_movie_html.c
@@ -499,8 +499,8 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
   data.cx = swfdec_gc_object_get_context (text);
   data.multiline = (data.cx->version < 7 || text->multiline);
   data.condense_white = text->condense_white;
-  if (text->style_sheet != NULL && SWFDEC_IS_STYLESHEET (text->style_sheet)) {
-    data.style_sheet = SWFDEC_STYLESHEET (text->style_sheet);
+  if (text->style_sheet != NULL && SWFDEC_IS_STYLE_SHEET (text->style_sheet->relay)) {
+    data.style_sheet = SWFDEC_STYLE_SHEET (text->style_sheet->relay);
   } else {
     data.style_sheet = NULL;
   }
commit eb9dcf44d90e8efbd7309fcbac85ba71a500ee06
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 17:00:16 2008 +0200

    make Sound a relay
    
    also fix the fact that the Sound constructor and areSoundsInaccessible
    occupy the same ASnative slot

diff --git a/swfdec/swfdec_initialize.as b/swfdec/swfdec_initialize.as
index 1c44a98..be23547 100644
--- a/swfdec/swfdec_initialize.as
+++ b/swfdec/swfdec_initialize.as
@@ -256,7 +256,7 @@ ASSetPropFlags(LoadVars.prototype, null, 131);
 
 /*** Sound ***/
 
-Sound = ASconstructor (500, 16);
+Sound = ASconstructor (500, 17);
 ASSetNative (Sound.prototype, 500, "getPan,getTransform,getVolume,setPan,setTransform,setVolume,stop,attachSound,start,6getDuration,6setDuration,6getPosition,6setPosition,6loadSound,6getBytesLoaded,6getBytesTotal,9areSoundsInaccessible");
 ASSetNativeAccessor (Sound.prototype, 500, "checkPolicyFile", 18);
 ASSetPropFlags (Sound.prototype, null, 7);
diff --git a/swfdec/swfdec_initialize.h b/swfdec/swfdec_initialize.h
index b2b7fe5..aa4b79b 100644
--- a/swfdec/swfdec_initialize.h
+++ b/swfdec/swfdec_initialize.h
@@ -809,7 +809,7 @@ static const unsigned char swfdec_initialize[] = {
   0x08, 0x0A, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x63,  0x4E, 0x96, 0x02, 0x00,  0x08, 0x16, 0x52, 0x17,
   0x4F, 0x96, 0x08, 0x00,  0x07, 0x83, 0x00, 0x00,  0x00, 0x02, 0x08, 0x68,  0x1C, 0x96, 0x02, 0x00,
   0x08, 0x0D, 0x4E, 0x96,  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x00, 0x3D, 0x17, 0x96,
-  0x13, 0x00, 0x08, 0x71,  0x07, 0x10, 0x00, 0x00,  0x00, 0x07, 0xF4, 0x01,  0x00, 0x00, 0x07, 0x02,
+  0x13, 0x00, 0x08, 0x71,  0x07, 0x11, 0x00, 0x00,  0x00, 0x07, 0xF4, 0x01,  0x00, 0x00, 0x07, 0x02,
   0x00, 0x00, 0x00, 0x08,  0x3A, 0x3D, 0x1D, 0x96,  0x09, 0x00, 0x08, 0x72,  0x07, 0xF4, 0x01, 0x00,
   0x00, 0x08, 0x71, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x0D, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,
   0x00, 0x00, 0x08, 0x02,  0x3D, 0x17, 0x96, 0x0E,  0x00, 0x07, 0x12, 0x00,  0x00, 0x00, 0x08, 0x48,
diff --git a/swfdec/swfdec_sound_object.c b/swfdec/swfdec_sound_object.c
index f7dc144..ac553da 100644
--- a/swfdec/swfdec_sound_object.c
+++ b/swfdec/swfdec_sound_object.c
@@ -36,7 +36,7 @@
 
 /*** SwfdecSoundObject ***/
 
-G_DEFINE_TYPE (SwfdecSoundObject, swfdec_sound_object, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecSoundObject, swfdec_sound_object, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_sound_object_mark (SwfdecGcObject *object)
@@ -438,24 +438,25 @@ swfdec_sound_object_stop (SwfdecAsContext *cx, SwfdecAsObject *object, guint arg
   }
 }
 
-SWFDEC_AS_CONSTRUCTOR (500, 16, swfdec_sound_object_construct, swfdec_sound_object_get_type)
+SWFDEC_AS_NATIVE (500, 17, swfdec_sound_object_construct)
 void
 swfdec_sound_object_construct (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
     SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
   SwfdecSoundObject *sound;
-  SwfdecPlayer *player;
     
   if (!swfdec_as_context_is_constructing (cx))
     return;
 
-  sound = SWFDEC_SOUND_OBJECT (object);
-  player = SWFDEC_PLAYER (cx);
+  sound = g_object_new (SWFDEC_TYPE_SOUND_OBJECT, "context", cx, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (sound));
 
   if (argc == 0 || SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0])) {
     sound->target = NULL;
   } else {
     sound->target = swfdec_as_value_to_string (cx, &argv[0]);
   }
+
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
 
diff --git a/swfdec/swfdec_sound_object.h b/swfdec/swfdec_sound_object.h
index c543410..453a883 100644
--- a/swfdec/swfdec_sound_object.h
+++ b/swfdec/swfdec_sound_object.h
@@ -20,6 +20,7 @@
 #ifndef _SWFDEC_SOUND_OBJECT_H_
 #define _SWFDEC_SOUND_OBJECT_H_
 
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_audio.h>
 #include <swfdec/swfdec_load_sound.h>
 #include <swfdec/swfdec_movie.h>
@@ -39,14 +40,14 @@ typedef struct _SwfdecSoundObjectClass SwfdecSoundObjectClass;
 #define SWFDEC_SOUND_OBJECT_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SOUND_OBJECT, SwfdecSoundObjectClass))
 
 struct _SwfdecSoundObject {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   const char *		target;		/* target or NULL if global */
   SwfdecSoundProvider *	provider;	/* sound that we play */
 };
 
 struct _SwfdecSoundObjectClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_sound_object_get_type	(void);
commit f2e5524f63678c48b2d6d89319c39114e59e4ef3
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 16:21:25 2008 +0200

    make filters relays

diff --git a/swfdec/swfdec_blur_filter_as.c b/swfdec/swfdec_blur_filter_as.c
index e0ddc13..162f7f4 100644
--- a/swfdec/swfdec_blur_filter_as.c
+++ b/swfdec/swfdec_blur_filter_as.c
@@ -105,7 +105,7 @@ swfdec_blur_filter_set_quality (SwfdecAsContext *cx, SwfdecAsObject *object,
 }
 
 // constructor
-SWFDEC_AS_CONSTRUCTOR (1102, 0, swfdec_blur_filter_construct, swfdec_blur_filter_get_type)
+SWFDEC_AS_NATIVE (1102, 0, swfdec_blur_filter_construct)
 void
 swfdec_blur_filter_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
@@ -114,13 +114,16 @@ swfdec_blur_filter_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
   double x = 4, y = 4;
   int quality = 1;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_BLUR_FILTER, &filter, "|nni", &x, &y, &quality);
+  SWFDEC_AS_CHECK (0, NULL, "|nni", &x, &y, &quality);
 
   if (!swfdec_as_context_is_constructing (cx))
     return;
 
+  filter = g_object_new (SWFDEC_TYPE_BLUR_FILTER, "context", cx, NULL);
   filter->x = CLAMP (x, 0, 255);
   filter->y = CLAMP (y, 0, 255);
   filter->quality = CLAMP (quality, 0, 15);
+
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (filter));
   SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
diff --git a/swfdec/swfdec_color_matrix_filter_as.c b/swfdec/swfdec_color_matrix_filter_as.c
index 5c38d68..726e123 100644
--- a/swfdec/swfdec_color_matrix_filter_as.c
+++ b/swfdec/swfdec_color_matrix_filter_as.c
@@ -88,7 +88,7 @@ swfdec_color_matrix_filter_set_matrix (SwfdecAsContext *cx,
   swfdec_color_matrix_filter_do_set_matrix (cm, array);
 }
 
-SWFDEC_AS_CONSTRUCTOR (1110, 0, swfdec_color_matrix_filter_contruct, swfdec_color_matrix_filter_get_type)
+SWFDEC_AS_NATIVE (1110, 0, swfdec_color_matrix_filter_contruct)
 void
 swfdec_color_matrix_filter_contruct (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -100,7 +100,11 @@ swfdec_color_matrix_filter_contruct (SwfdecAsContext *cx,
   if (!swfdec_as_context_is_constructing (cx))
     return;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_COLOR_MATRIX_FILTER, &cm, "o", &array);
+  SWFDEC_AS_CHECK (0, NULL, "o", &array);
 
+  cm = g_object_new (SWFDEC_TYPE_COLOR_MATRIX_FILTER, "context", cx, NULL);
   swfdec_color_matrix_filter_do_set_matrix (cm, array);
+
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (cm));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
diff --git a/swfdec/swfdec_filter.c b/swfdec/swfdec_filter.c
index de4544d..6fa26d0 100644
--- a/swfdec/swfdec_filter.c
+++ b/swfdec/swfdec_filter.c
@@ -27,7 +27,7 @@
 #include "swfdec_color_matrix_filter.h"
 #include "swfdec_debug.h"
 
-G_DEFINE_ABSTRACT_TYPE (SwfdecFilter, swfdec_filter, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_ABSTRACT_TYPE (SwfdecFilter, swfdec_filter, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_filter_class_init (SwfdecFilterClass *klass)
diff --git a/swfdec/swfdec_filter.h b/swfdec/swfdec_filter.h
index 65d6ae7..e362754 100644
--- a/swfdec/swfdec_filter.h
+++ b/swfdec/swfdec_filter.h
@@ -21,7 +21,7 @@
 #define _SWFDEC_FILTER_H_
 
 #include <swfdec/swfdec.h>
-#include <swfdec/swfdec_as_object.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_bits.h>
 #include <swfdec/swfdec_types.h>
 
@@ -37,11 +37,11 @@ typedef struct _SwfdecFilterClass SwfdecFilterClass;
 #define SWFDEC_FILTER_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_FILTER, SwfdecFilterClass))
 
 struct _SwfdecFilter {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 };
 
 struct _SwfdecFilterClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsObjectClass	relay_class;
 
   void			(* clone)		(SwfdecFilter *		dest,
 						 SwfdecFilter *		source);
diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 1d421df..761e4ef 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -163,9 +163,9 @@ swfdec_sprite_movie_set_filters (SwfdecAsContext *cx, SwfdecAsObject *object,
     if (!swfdec_as_object_get_variable (array, 
 	  swfdec_as_integer_to_string (cx, i), &val) ||
 	!SWFDEC_AS_VALUE_IS_OBJECT (&val) ||
-	!SWFDEC_IS_FILTER (SWFDEC_AS_VALUE_GET_OBJECT (&val)))
+	!SWFDEC_IS_FILTER (SWFDEC_AS_VALUE_GET_OBJECT (&val)->relay))
       continue;
-    filter = SWFDEC_FILTER (SWFDEC_AS_VALUE_GET_OBJECT (&val));
+    filter = SWFDEC_FILTER (SWFDEC_AS_VALUE_GET_OBJECT (&val)->relay);
     filter = swfdec_filter_clone (filter);
     list = g_slist_prepend (list, filter);
   }
commit f18cb195ca07b0c11e2418bceb83fffb8a28baa7
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Oct 21 16:04:09 2008 +0200

    make BitmapData a relay

diff --git a/swfdec/swfdec_as_relay.c b/swfdec/swfdec_as_relay.c
index 1339275..b0ee439 100644
--- a/swfdec/swfdec_as_relay.c
+++ b/swfdec/swfdec_as_relay.c
@@ -51,28 +51,22 @@ swfdec_as_relay_init (SwfdecAsRelay *object)
 {
 }
 
-#if 0
 /**
  * swfdec_as_relay_get_as_object:
- * @object: a #SwfdecAsRelay. This function takes a gpointer argument only to
- *          save you from having to cast it manually. For language bindings, 
- *          please treat this argument as having the #SwfdecAsRelay type.
+ * @object: a #SwfdecAsRelay.
  *
  * Gets the Actionscript object associated with this object.
  *
  * Returns: The #SwfdecAsObject associated with this relay.
  **/
-static SwfdecAsObject *
-swfdec_as_relay_get_as_object (gpointer object)
+SwfdecAsObject *
+swfdec_as_relay_get_as_object (SwfdecAsRelay *relay)
 {
-  SwfdecAsRelay *relay = object;
-
-  g_return_val_if_fail (SWFDEC_IS_AS_RELAY (object), NULL);
+  g_return_val_if_fail (SWFDEC_IS_AS_RELAY (relay), NULL);
   g_return_val_if_fail (relay->relay != NULL, NULL);
 
   return relay->relay;
 }
-#endif
 
 /**
  * swfdec_as_relay_call:
diff --git a/swfdec/swfdec_as_relay.h b/swfdec/swfdec_as_relay.h
index 6afa9c5..d574088 100644
--- a/swfdec/swfdec_as_relay.h
+++ b/swfdec/swfdec_as_relay.h
@@ -47,6 +47,7 @@ struct _SwfdecAsRelayClass {
 
 GType		swfdec_as_relay_get_type	(void);
 
+SwfdecAsObject *swfdec_as_relay_get_as_object	(SwfdecAsRelay *	relay);
 
 gboolean	swfdec_as_relay_call		(SwfdecAsRelay *	relay,
 						 const char *		name,
diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 4aaf3c2..6f5ba03 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -47,7 +47,7 @@ enum {
 };
 
 static guint signals[LAST_SIGNAL];
-G_DEFINE_TYPE (SwfdecBitmapData, swfdec_bitmap_data, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecBitmapData, swfdec_bitmap_data, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_bitmap_data_invalidate (SwfdecBitmapData *bitmap, guint x, guint y, guint w, guint h)
@@ -108,6 +108,7 @@ SwfdecBitmapData *
 swfdec_bitmap_data_new (SwfdecAsContext *context, gboolean transparent, guint width, guint height)
 {
   SwfdecBitmapData *bitmap;
+  SwfdecAsObject *object;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   g_return_val_if_fail (width > 0, NULL);
@@ -122,8 +123,10 @@ swfdec_bitmap_data_new (SwfdecAsContext *context, gboolean transparent, guint wi
   bitmap->surface = cairo_image_surface_create (
       transparent ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, width, height);
 
-  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (bitmap),
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_constructor_by_name (object,
       SWFDEC_AS_STR_flash, SWFDEC_AS_STR_display, SWFDEC_AS_STR_BitmapData, NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (bitmap));
 
   return bitmap;
 }
@@ -168,7 +171,7 @@ swfdec_bitmap_data_loadBitmap (SwfdecAsContext *cx, SwfdecAsObject *object,
   cairo_paint (cr);
   cairo_destroy (cr);
   cairo_surface_destroy (isurface);
-  SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (bitmap));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (bitmap)));
 }
 
 // properties
@@ -383,7 +386,7 @@ swfdec_bitmap_data_copyPixels (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
   SwfdecBitmapData *bitmap, *source, *alpha = NULL;
-  SwfdecAsObject *recto, *pt, *apt = NULL;
+  SwfdecAsObject *recto, *pt, *apt = NULL, *so, *ao = NULL;
   SwfdecRectangle rect;
   gboolean copy_alpha = FALSE;
   SwfdecColorTransform ctrans;
@@ -391,13 +394,14 @@ swfdec_bitmap_data_copyPixels (SwfdecAsContext *cx, SwfdecAsObject *object,
   cairo_t *cr;
   int x, y;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "ooo|OOb", &source, &recto, &pt,
-      &alpha, &apt, &copy_alpha);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "ooo|OOb", &so, &recto, &pt,
+      &ao, &apt, &copy_alpha);
 
   if (bitmap->surface == NULL ||
-      !SWFDEC_IS_BITMAP_DATA (source) ||
-      source->surface == NULL ||
-      (argc > 3 && (!SWFDEC_IS_BITMAP_DATA (alpha) || alpha->surface == NULL)) ||
+      !SWFDEC_IS_BITMAP_DATA (so->relay) ||
+      (source = SWFDEC_BITMAP_DATA (so->relay))->surface == NULL ||
+      (argc > 3 && (!SWFDEC_IS_BITMAP_DATA (ao->relay) || 
+		    (alpha = SWFDEC_BITMAP_DATA (ao->relay))->surface == NULL)) ||
       !swfdec_rectangle_from_as_object (&rect, recto))
     return;
 
@@ -516,9 +520,9 @@ swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
   swfdec_renderer_attach (renderer, cr);
   cairo_transform (cr, &mat);
 
-  if (SWFDEC_IS_BITMAP_DATA (o)) {
+  if (SWFDEC_IS_BITMAP_DATA (o->relay)) {
     cairo_pattern_t *pattern = swfdec_bitmap_data_get_pattern (
-	SWFDEC_BITMAP_DATA (o), renderer, &ctrans);
+	SWFDEC_BITMAP_DATA (o->relay), renderer, &ctrans);
     if (pattern) {
       cairo_set_source (cr, pattern);
       cairo_paint (cr);
@@ -729,7 +733,7 @@ swfdec_bitmap_data_clone (SwfdecAsContext *cx, SwfdecAsObject *object,
   cairo_set_source_surface (cr, bitmap->surface, 0, 0);
   cairo_paint (cr);
   cairo_destroy (cr);
-  SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (clone));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (clone)));
 }
 
 SWFDEC_AS_NATIVE (1100, 22, swfdec_bitmap_data_do_dispose)
@@ -762,7 +766,7 @@ swfdec_bitmap_data_compare (SwfdecAsContext *cx,
   SWFDEC_STUB ("BitmapData.compare");
 }
 
-SWFDEC_AS_CONSTRUCTOR (1100, 0, swfdec_bitmap_data_construct, swfdec_bitmap_data_get_type)
+SWFDEC_AS_NATIVE (1100, 0, swfdec_bitmap_data_construct)
 void
 swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
@@ -775,7 +779,7 @@ swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
   if (!swfdec_as_context_is_constructing (cx))
     return;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "ii|bi", 
+  SWFDEC_AS_CHECK (0, NULL, "ii|bi", 
       &w, &h, &transparent, &color);
   
   if (w > 2880 || w <= 0 || h > 2880 || h <= 0) {
@@ -785,6 +789,7 @@ swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   if (!swfdec_as_context_try_use_mem (cx, w * h * 4))
     return;
+  bitmap = g_object_new (SWFDEC_TYPE_BITMAP_DATA, "context", cx, NULL);
   bitmap->width = w;
   bitmap->height = h;
   bitmap->surface = cairo_image_surface_create (
@@ -796,6 +801,8 @@ swfdec_bitmap_data_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     cairo_paint (cr);
     cairo_destroy (cr);
   }
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (bitmap));
+  SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }
 
 /*** PUBLIC API ***/
diff --git a/swfdec/swfdec_bitmap_data.h b/swfdec/swfdec_bitmap_data.h
index b1417c7..cd356ce 100644
--- a/swfdec/swfdec_bitmap_data.h
+++ b/swfdec/swfdec_bitmap_data.h
@@ -21,9 +21,9 @@
 #define _SWFDEC_BITMAP_DATA_H_
 
 #include <cairo.h>
-#include <swfdec/swfdec_as_object.h>
+#include <swfdec/swfdec_as_relay.h>
+#include <swfdec/swfdec_color.h>
 #include <swfdec/swfdec_renderer.h>
-#include <swfdec/swfdec_types.h>
 
 G_BEGIN_DECLS
 
@@ -37,7 +37,7 @@ typedef struct _SwfdecBitmapDataClass SwfdecBitmapDataClass;
 #define SWFDEC_BITMAP_DATA_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_BITMAP_DATA, SwfdecBitmapDataClass))
 
 struct _SwfdecBitmapData {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   cairo_surface_t *	surface;	/* An image surface or NULL */
   guint			width;		/* width of surface */
@@ -45,7 +45,7 @@ struct _SwfdecBitmapData {
 };
 
 struct _SwfdecBitmapDataClass {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_bitmap_data_get_type		(void);
diff --git a/swfdec/swfdec_movie_as_drawing.c b/swfdec/swfdec_movie_as_drawing.c
index 7cc28a1..491b5a5 100644
--- a/swfdec/swfdec_movie_as_drawing.c
+++ b/swfdec/swfdec_movie_as_drawing.c
@@ -433,7 +433,7 @@ swfdec_sprite_movie_beginBitmapFill (SwfdecAsContext *cx,
     SwfdecAsValue *rval)
 {
   SwfdecMovie *movie;
-  SwfdecBitmapData *bitmap;
+  SwfdecAsObject *bitmap;
   SwfdecPattern *pattern;
   SwfdecDraw *draw;
   SwfdecAsObject *mat = NULL;
@@ -443,10 +443,10 @@ swfdec_sprite_movie_beginBitmapFill (SwfdecAsContext *cx,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, &movie, "O|Obb", 
       &bitmap, &mat, &repeat, &smoothing);
   movie->draw_fill = NULL;
-  if (!SWFDEC_IS_BITMAP_DATA (bitmap))
+  if (!SWFDEC_IS_BITMAP_DATA (bitmap->relay))
     return;
   
-  pattern = swfdec_bitmap_pattern_new (bitmap);
+  pattern = swfdec_bitmap_pattern_new (SWFDEC_BITMAP_DATA (bitmap->relay));
   /* NB: This signal assumes that the pattern is destroyed before the movie is,
    * because it is never removed anywhere */
   g_signal_connect_swapped (pattern, "invalidate", G_CALLBACK (swfdec_movie_invalidate_last), movie);
diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 17dc8b7..1d421df 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -376,7 +376,7 @@ swfdec_sprite_movie_attachBitmap (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
   SwfdecMovie *parent;
-  SwfdecBitmapData *bitmap;
+  SwfdecAsObject *bitmap;
   const char *snapping = SWFDEC_AS_STR_auto;
   gboolean smoothing = FALSE;
   int depth;
@@ -385,7 +385,7 @@ swfdec_sprite_movie_attachBitmap (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_SPRITE_MOVIE, &parent, "oi|sb", 
       &bitmap, &depth, &snapping, &smoothing);
 
-  if (!SWFDEC_IS_BITMAP_DATA (bitmap))
+  if (!SWFDEC_IS_BITMAP_DATA (bitmap->relay))
     return;
   if (swfdec_depth_classify (depth) == SWFDEC_DEPTH_CLASS_EMPTY)
     return;
@@ -394,7 +394,7 @@ swfdec_sprite_movie_attachBitmap (SwfdecAsContext *cx, SwfdecAsObject *object,
   if (movie)
     swfdec_movie_remove (movie);
 
-  swfdec_bitmap_movie_new (parent, bitmap, depth);
+  swfdec_bitmap_movie_new (parent, SWFDEC_BITMAP_DATA (bitmap->relay), depth);
   SWFDEC_LOG ("created new BitmapMovie to parent %s at depth %d", 
       parent->name, depth);
 }


More information about the Swfdec-commits mailing list