Benjamin Otte
2007-Jan-24 12:37 UTC
[Swfdec] Branch 'interpreter' - 8 commits - libswfdec/swfdec_bits.c libswfdec/swfdec_bits.h libswfdec/swfdec_js.c libswfdec/swfdec_js.h libswfdec/swfdec_script.c test/swfdec_out.c test/swfdec_out.h test/swfedit_tag.c test/swfedit_token.c test/swfedit_token.h
libswfdec/swfdec_bits.c | 8 +- libswfdec/swfdec_bits.h | 4 - libswfdec/swfdec_js.c | 92 +++++++++++++++++++++++++--------- libswfdec/swfdec_js.h | 5 + libswfdec/swfdec_script.c | 64 +++++++++++++++++++++-- test/swfdec_out.c | 24 ++++++++ test/swfdec_out.h | 5 + test/swfedit_tag.c | 64 +++++++++++++++++++++++ test/swfedit_token.c | 123 +++++++++++++++++++++++++++++++++++++--------- test/swfedit_token.h | 2 10 files changed, 329 insertions(+), 62 deletions(-) New commits: diff-tree 4db4a99c916781cbceb31ca171c242867d4047cd (from 9dab0726ed4e35c06038b8700492bd62658ff689) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 21:37:13 2007 +0100 use swfdec_js_eval_set for SetVariable diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index b2c4c81..32af30e 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -329,11 +329,8 @@ swfdec_action_set_variable (JSContext *c if (s == NULL) return JS_FALSE; - if (strpbrk (s, "./:")) { - SWFDEC_WARNING ("FIXME: implement paths"); - } - if (!JS_SetProperty (cx, cx->fp->scopeChain, s, &cx->fp->sp[-1])) - return JS_FALSE; + swfdec_js_eval_set (cx, cx->fp->scopeChain, s, cx->fp->sp[-1], + ((SwfdecScript *) cx->fp->swf)->version < 7); cx->fp->sp -= 2; return JS_TRUE; } diff-tree 9dab0726ed4e35c06038b8700492bd62658ff689 (from 6d219aa23eb4010d5438fce453650c158d09a720) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 21:36:55 2007 +0100 implement swfdec_js_eval_set diff --git a/libswfdec/swfdec_js.c b/libswfdec/swfdec_js.c index bbd6a43..1601b4b 100644 --- a/libswfdec/swfdec_js.c +++ b/libswfdec/swfdec_js.c @@ -322,30 +322,38 @@ swfdec_js_eval_get_property (JSContext * } } -/** - * swfdec_js_eval: - * @cx: a #JSContext - * @obj: #JSObject to use as a source for evaluating - * @str: The string to evaluate - * @ignore_case: TRUE for case insensitive evaluation - * - * This function works like the Actionscript eval function used on @obj. - * It handles both slash-style and dot-style notation. - * - * Returns: the value or JSVAL_VOID if no value was found. - **/ -jsval -swfdec_js_eval (JSContext *cx, JSObject *obj, const char *str, - gboolean ignore_case) +static JSBool +swfdec_js_eval_set_property (JSContext *cx, JSObject *obj, + const char *name, gboolean initial, gboolean ignore_case, jsval *ret) +{ + JSAtom *atom; + JSObject *pobj; + JSProperty *prop; + + atom = js_Atomize (cx, name, strlen(name), ignore_case ? ATOM_NOCASE : 0); + if (!atom) + return JS_FALSE; + if (initial) { + return OBJ_SET_PROPERTY (cx, obj, (jsid) atom, ret); + } else { + if (!js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop)) + return JS_FALSE; + if (!prop) + return JS_FALSE; + if (pobj) + obj = pobj; + return OBJ_SET_PROPERTY (cx, obj, (jsid) prop->id, ret); + } +} + +static gboolean +swfdec_js_eval_internal (JSContext *cx, JSObject *obj, const char *str, + gboolean ignore_case, jsval *val, gboolean set) { jsval cur; char *work = NULL; gboolean initial = TRUE; - g_return_val_if_fail (cx != NULL, JSVAL_VOID); - g_return_val_if_fail (obj != NULL, JSVAL_VOID); - g_return_val_if_fail (str != NULL, JSVAL_VOID); - SWFDEC_LOG ("eval called with \"%s\" on %p", str, obj); if (strchr (str, '/')) { work = swfdec_js_slash_to_dot (str); @@ -369,19 +377,57 @@ swfdec_js_eval (JSContext *cx, JSObject g_free (name); str = dot + 1; } else { - if (!swfdec_js_eval_get_property (cx, obj, str, initial, ignore_case, &cur)) - goto out; + if (set) { + if (!swfdec_js_eval_set_property (cx, obj, str, initial, ignore_case, val)) + goto out; + } else { + if (!swfdec_js_eval_get_property (cx, obj, str, initial, ignore_case, &cur)) + goto out; + } str = NULL; } initial = FALSE; } g_free (work); - return cur; + *val = cur; + return TRUE; out: SWFDEC_DEBUG ("error: returning void for %s", str); g_free (work); - return JSVAL_VOID; + return FALSE; } +/** + * swfdec_js_eval: + * @cx: a #JSContext + * @obj: #JSObject to use as a source for evaluating + * @str: The string to evaluate + * @ignore_case: TRUE for case insensitive evaluation + * + * This function works like the Actionscript eval function used on @obj. + * It handles both slash-style and dot-style notation. + * + * Returns: the value or JSVAL_VOID if no value was found. + **/ +jsval +swfdec_js_eval (JSContext *cx, JSObject *obj, const char *str, + gboolean ignore_case) +{ + jsval ret; + + g_return_val_if_fail (cx != NULL, JSVAL_VOID); + g_return_val_if_fail (obj != NULL, JSVAL_VOID); + g_return_val_if_fail (str != NULL, JSVAL_VOID); + + if (!swfdec_js_eval_internal (cx, obj, str, ignore_case, &ret, FALSE)) + ret = JSVAL_VOID; + return ret; +} +void +swfdec_js_eval_set (JSContext *cx, JSObject *obj, const char *str, + jsval val, gboolean ignore_case) +{ + swfdec_js_eval_internal (cx, obj, str, ignore_case, &val, TRUE); +} diff --git a/libswfdec/swfdec_js.h b/libswfdec/swfdec_js.h index 47e97ff..ea49a72 100644 --- a/libswfdec/swfdec_js.h +++ b/libswfdec/swfdec_js.h @@ -51,6 +51,11 @@ jsval swfdec_js_eval (JSContext * cx JSObject * obj, const char * str, gboolean ignore_case); +void swfdec_js_eval_set (JSContext * cx, + JSObject * obj, + const char * str, + jsval val, + gboolean ignore_case); /* support functions */ const char * swfdec_js_to_string (JSContext * cx, diff-tree 6d219aa23eb4010d5438fce453650c158d09a720 (from 00501d98ab1ec0257887814ccc9d582b3b8113a3) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 18:44:35 2007 +0100 add support for colors and the SetBackground tag diff --git a/test/swfdec_out.c b/test/swfdec_out.c index b795b28..bf7aa9e 100644 --- a/test/swfdec_out.c +++ b/test/swfdec_out.c @@ -213,6 +213,7 @@ swfdec_out_put_rect (SwfdecOut *out, Swf guint req, tmp; g_return_if_fail (out != NULL); + g_return_if_fail (rect != NULL); x0 = rect->x0; y0 = rect->y0; @@ -233,3 +234,25 @@ swfdec_out_put_rect (SwfdecOut *out, Swf swfdec_out_put_sbits (out, y1, req); swfdec_out_syncbits (out); } + +void +swfdec_out_put_rgb (SwfdecOut *out, SwfdecColor color) +{ + g_return_if_fail (out != NULL); + + swfdec_out_put_u8 (out, SWF_COLOR_R (color)); + swfdec_out_put_u8 (out, SWF_COLOR_G (color)); + swfdec_out_put_u8 (out, SWF_COLOR_B (color)); +} + +void +swfdec_out_put_rgba (SwfdecOut *out, SwfdecColor color) +{ + g_return_if_fail (out != NULL); + + swfdec_out_put_u8 (out, SWF_COLOR_R (color)); + swfdec_out_put_u8 (out, SWF_COLOR_G (color)); + swfdec_out_put_u8 (out, SWF_COLOR_B (color)); + swfdec_out_put_u8 (out, SWF_COLOR_A (color)); +} + diff --git a/test/swfdec_out.h b/test/swfdec_out.h index b6d155f..d1f916c 100644 --- a/test/swfdec_out.h +++ b/test/swfdec_out.h @@ -21,6 +21,7 @@ #define __SWFDEC_OUT_H__ #include <libswfdec/swfdec_buffer.h> +#include <libswfdec/swfdec_color.h> #include <libswfdec/swfdec_rect.h> G_BEGIN_DECLS @@ -64,6 +65,10 @@ void swfdec_out_put_u16 (SwfdecOut * o void swfdec_out_put_u32 (SwfdecOut * out, guint i); +void swfdec_out_put_rgb (SwfdecOut * out, + SwfdecColor color); +void swfdec_out_put_rgba (SwfdecOut * out, + SwfdecColor color); void swfdec_out_put_rect (SwfdecOut * out, SwfdecRect * rect); diff --git a/test/swfedit_tag.c b/test/swfedit_tag.c index 55020a0..dd15978 100644 --- a/test/swfedit_tag.c +++ b/test/swfedit_tag.c @@ -96,6 +96,30 @@ swfedit_rect_read (SwfdecBits *bits) return rect; } +static void +swfedit_rgb_write (gpointer data, SwfdecOut *out) +{ + swfdec_out_put_rgb (out, GPOINTER_TO_UINT (data)); +} + +static gpointer +swfedit_rgb_read (SwfdecBits *bits) +{ + return GUINT_TO_POINTER (swfdec_bits_get_color (bits)); +} + +static void +swfedit_rgba_write (gpointer data, SwfdecOut *out) +{ + swfdec_out_put_rgba (out, GPOINTER_TO_UINT (data)); +} + +static gpointer +swfedit_rgba_read (SwfdecBits *bits) +{ + return GUINT_TO_POINTER (swfdec_bits_get_rgba (bits)); +} + struct { void (* write) (gpointer data, SwfdecOut *out); gpointer (* read) (SwfdecBits *bits); @@ -106,6 +130,8 @@ struct { { swfedit_u16_write, swfedit_u16_read }, { swfedit_u32_write, swfedit_u32_read }, { swfedit_rect_write, swfedit_rect_read }, + { swfedit_rgb_write, swfedit_rgb_read }, + { swfedit_rgba_write, swfedit_rgba_read }, }; void @@ -156,14 +182,16 @@ swfedit_tag_read_token (SwfeditToken *to typedef struct { const char * name; /* name to use for this field */ SwfeditTokenType type; /* type of this field */ - guint n_items; /* field to look at for item count */ + guint n_items; /* field to look at for item count (or 0 to use 1 item) */ guint hint; /* hint to pass to field when creating */ } SwfeditTagDefinition; static const SwfeditTagDefinition ShowFrame[] = { { NULL, 0, 0, 0 } }; +static const SwfeditTagDefinition SetBackgroundColor[] = { { "color", SWFEDIT_TOKEN_RGB, 0, 0 }, { NULL, 0, 0, 0 } }; static const SwfeditTagDefinition *tags[] = { [SWFDEC_TAG_SHOWFRAME] = ShowFrame, + [SWFDEC_TAG_SETBACKGROUNDCOLOR] = SetBackgroundColor, }; static const SwfeditTagDefinition * diff --git a/test/swfedit_token.c b/test/swfedit_token.c index ecf471c..3327b81 100644 --- a/test/swfedit_token.c +++ b/test/swfedit_token.c @@ -22,42 +22,57 @@ #endif #include <stdlib.h> +#include <string.h> #include <gtk/gtk.h> #include <libswfdec/swfdec_buffer.h> +#include <libswfdec/swfdec_color.h> #include "swfedit_token.h" /*** CONVERTERS ***/ static gboolean +swfedit_parse_hex (const char *s, guint *result) +{ + guint byte; + + if (s[0] >= '0' && s[0] <= '9') + byte = s[0] - '0'; + else if (s[0] >= 'a' && s[0] <= 'f') + byte = s[0] + 10 - 'a'; + else if (s[0] >= 'A' && s[0] <= 'F') + byte = s[0] + 10 - 'A'; + else + return FALSE; + s++; + byte *= 16; + if (s[0] >= '0' && s[0] <= '9') + byte += s[0] - '0'; + else if (s[0] >= 'a' && s[0] <= 'f') + byte += s[0] + 10 - 'a'; + else if (s[0] >= 'A' && s[0] <= 'F') + byte += s[0] + 10 - 'A'; + else + return FALSE; + *result = byte; + return TRUE; +} + +static gboolean swfedit_binary_from_string (const char *s, gpointer* result) { GByteArray *array = g_byte_array_new (); - guint8 byte; + guint byte; + guint8 add; while (g_ascii_isspace (*s)) s++; do { - if (s[0] >= '0' && s[0] <= '9') - byte = s[0] - '0'; - else if (s[0] >= 'a' && s[0] <= 'f') - byte = s[0] + 10 - 'a'; - else if (s[0] >= 'A' && s[0] <= 'F') - byte = s[0] + 10 - 'A'; - else + if (!swfedit_parse_hex (s, &byte)) break; - s++; - byte *= 16; - if (s[0] >= '0' && s[0] <= '9') - byte += s[0] - '0'; - else if (s[0] >= 'a' && s[0] <= 'f') - byte += s[0] + 10 - 'a'; - else if (s[0] >= 'A' && s[0] <= 'F') - byte += s[0] + 10 - 'A'; - else - break; - s++; - g_byte_array_append (array, &byte, 1); + s += 2; + add = byte; + g_byte_array_append (array, &add, 1); while (g_ascii_isspace (*s)) s++; - } while (TRUE); + } while (*s != '\0'); if (*s == '\0') { SwfdecBuffer *buffer = swfdec_buffer_new (); buffer->length = array->len; @@ -97,7 +112,6 @@ swfedit_from_string_unsigned (const char return FALSE; if (u > max) return FALSE; - *result = GUINT_TO_POINTER ((guint) u); return TRUE; } @@ -140,6 +154,63 @@ swfedit_rect_to_string (gconstpointer va (int) rect->x1, (int) rect->y1); } +static gboolean +swfedit_rgb_from_string (const char *s, gpointer* result) +{ + guint r, g, b; + if (strlen (s) != 6) + return FALSE; + if (!swfedit_parse_hex (s, &r)) + return FALSE; + s += 2; + if (!swfedit_parse_hex (s, &g)) + return FALSE; + s += 2; + if (!swfedit_parse_hex (s, &b)) + return FALSE; + *result = GUINT_TO_POINTER (SWF_COLOR_COMBINE (r, g, b, 0xFF)); + return TRUE; +} + +static char * +swfedit_rgb_to_string (gconstpointer value) +{ + guint c = GPOINTER_TO_UINT (value); + + return g_strdup_printf ("%02X%02X%02X", SWF_COLOR_R (c), + SWF_COLOR_G (c), SWF_COLOR_B (c)); +} + +static gboolean +swfedit_rgba_from_string (const char *s, gpointer* result) +{ + guint r, g, b, a; + if (strlen (s) != 8) + return FALSE; + if (!swfedit_parse_hex (s, &a)) + return FALSE; + s += 2; + if (!swfedit_parse_hex (s, &r)) + return FALSE; + s += 2; + if (!swfedit_parse_hex (s, &g)) + return FALSE; + s += 2; + if (!swfedit_parse_hex (s, &b)) + return FALSE; + *result = GUINT_TO_POINTER (SWF_COLOR_COMBINE (r, g, b, a)); + return TRUE; +} + +static char * +swfedit_rgba_to_string (gconstpointer value) +{ + guint c = GPOINTER_TO_UINT (value); + + return g_strdup_printf ("%02X%02X%02X%02X", SWF_COLOR_R (c), + SWF_COLOR_G (c), SWF_COLOR_B (c), SWF_COLOR_A (c)); +} + struct { gboolean (* from_string) (const char *s, gpointer *); char * (* to_string) (gconstpointer value); @@ -151,6 +222,8 @@ struct { { swfedit_uint16_from_string, swfedit_to_string_unsigned, NULL }, { swfedit_uint32_from_string, swfedit_to_string_unsigned, NULL }, { swfedit_rect_from_string, swfedit_rect_to_string, g_free }, + { swfedit_rgb_from_string, swfedit_rgb_to_string, NULL }, + { swfedit_rgba_from_string, swfedit_rgba_to_string, NULL }, }; /*** GTK_TREE_MODEL ***/ diff --git a/test/swfedit_token.h b/test/swfedit_token.h index 8dec753..7909188 100644 --- a/test/swfedit_token.h +++ b/test/swfedit_token.h @@ -32,6 +32,8 @@ typedef enum { SWFEDIT_TOKEN_UINT16, SWFEDIT_TOKEN_UINT32, SWFEDIT_TOKEN_RECT, + SWFEDIT_TOKEN_RGB, + SWFEDIT_TOKEN_RGBA, SWFEDIT_N_TOKENS } SwfeditTokenType; diff-tree 00501d98ab1ec0257887814ccc9d582b3b8113a3 (from e0270bcea5766d30ae6eeb7f8b0f0ef062f121f4) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 18:44:11 2007 +0100 implement StringAdd and GetURL, so Steve dances again diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 171877f..b2c4c81 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -773,9 +773,62 @@ swfdec_action_increment (JSContext *cx, return JS_NewNumberValue (cx, d, &cx->fp->sp[-1]); } +static JSBool +swfdec_action_get_url (JSContext *cx, guint action, const guint8 *data, guint len) +{ + SwfdecMovie *movie; + SwfdecBits bits; + const char *url, *target; + + swfdec_bits_init_data (&bits, data, len); + url = swfdec_bits_skip_string (&bits); + target = swfdec_bits_skip_string (&bits); + if (swfdec_bits_left (&bits)) { + SWFDEC_WARNING ("leftover bytes in GetURL action"); + } + movie = swfdec_action_get_target (cx); + if (movie) + swfdec_root_movie_load (SWFDEC_ROOT_MOVIE (movie->root), url, target); + else + SWFDEC_WARNING ("no movie to load"); + return JS_TRUE; +} + +static JSBool +swfdec_action_string_add (JSContext *cx, guint action, const guint8 *data, guint len) +{ + JSString *lval, *rval; + + rval = JS_ValueToString (cx, cx->fp->sp[-1]); + lval = JS_ValueToString (cx, cx->fp->sp[-2]); + if (lval == NULL || rval == NULL) + return FALSE; + lval = JS_ConcatStrings (cx, lval, rval); + if (lval == NULL) + return FALSE; + cx->fp->sp--; + cx->fp->sp[-1] = STRING_TO_JSVAL (lval); + return JS_TRUE; +} + /*** PRINT FUNCTIONS ***/ static char * +swfdec_action_print_get_url (guint action, const guint8 *data, guint len) +{ + SwfdecBits bits; + const char *url, *target; + + swfdec_bits_init_data (&bits, data, len); + url = swfdec_bits_skip_string (&bits); + target = swfdec_bits_skip_string (&bits); + if (swfdec_bits_left (&bits)) { + SWFDEC_WARNING ("leftover bytes in GetURL action"); + } + return g_strdup_printf ("GetURL %s %s", url, target); +} + +static char * swfdec_action_print_if (guint action, const guint8 *data, guint len) { if (len != 2) { @@ -942,7 +995,7 @@ static const SwfdecActionSpec actions[25 [0x1c] = { "GetVariable", NULL, 1, 1, { NULL, swfdec_action_get_variable, swfdec_action_get_variable, swfdec_action_get_variable, swfdec_action_get_variable } }, [0x1d] = { "SetVariable", NULL, 2, 0, { NULL, swfdec_action_set_variable, swfdec_action_set_variable, swfdec_action_set_variable, swfdec_action_set_variable } }, [0x20] = { "SetTarget2", NULL }, - [0x21] = { "StringAdd", NULL }, + [0x21] = { "StringAdd", NULL, 2, 1, { NULL, swfdec_action_string_add, swfdec_action_string_add, swfdec_action_string_add, swfdec_action_string_add } }, [0x22] = { "GetProperty", NULL, 2, 1, { NULL, swfdec_action_get_property, swfdec_action_get_property, swfdec_action_get_property, swfdec_action_get_property } }, [0x23] = { "SetProperty", NULL, 3, 0, { NULL, swfdec_action_set_property, swfdec_action_set_property, swfdec_action_set_property, swfdec_action_set_property } }, [0x24] = { "CloneSprite", NULL }, @@ -1010,7 +1063,7 @@ static const SwfdecActionSpec actions[25 /* version 3 */ [0x81] = { "GotoFrame", swfdec_action_print_goto_frame, 0, 0, { swfdec_action_goto_frame, swfdec_action_goto_frame, swfdec_action_goto_frame, swfdec_action_goto_frame, swfdec_action_goto_frame } }, - [0x83] = { "GetURL", NULL }, + [0x83] = { "GetURL", swfdec_action_print_get_url, 0, 0, { swfdec_action_get_url, swfdec_action_get_url, swfdec_action_get_url, swfdec_action_get_url, swfdec_action_get_url } }, /* version 5 */ [0x87] = { "StoreRegister", NULL }, [0x88] = { "ConstantPool", swfdec_action_print_constant_pool, 0, 0, { NULL, NULL, swfdec_action_constant_pool, swfdec_action_constant_pool, swfdec_action_constant_pool } }, diff-tree e0270bcea5766d30ae6eeb7f8b0f0ef062f121f4 (from 6efabb680e16b9144d8b4e880c18396861190d69) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 18:43:48 2007 +0100 make the color functions return a SwfdecColor diff --git a/libswfdec/swfdec_bits.c b/libswfdec/swfdec_bits.c index 1a7e402..418e9eb 100644 --- a/libswfdec/swfdec_bits.c +++ b/libswfdec/swfdec_bits.c @@ -471,10 +471,10 @@ swfdec_bits_get_string_length (SwfdecBit return ret; } -unsigned int +SwfdecColor swfdec_bits_get_color (SwfdecBits * bits) { - int r, g, b; + unsigned int r, g, b; r = swfdec_bits_get_u8 (bits); g = swfdec_bits_get_u8 (bits); @@ -483,10 +483,10 @@ swfdec_bits_get_color (SwfdecBits * bits return SWF_COLOR_COMBINE (r, g, b, 0xff); } -unsigned int +SwfdecColor swfdec_bits_get_rgba (SwfdecBits * bits) { - int r, g, b, a; + unsigned int r, g, b, a; r = swfdec_bits_get_u8 (bits); g = swfdec_bits_get_u8 (bits); diff --git a/libswfdec/swfdec_bits.h b/libswfdec/swfdec_bits.h index 08ae1d8..a44c9e2 100644 --- a/libswfdec/swfdec_bits.h +++ b/libswfdec/swfdec_bits.h @@ -65,8 +65,8 @@ const char *swfdec_bits_skip_string (Swf guint swfdec_bits_skip_bytes (SwfdecBits *bits, guint bytes); char *swfdec_bits_get_string (SwfdecBits * bits); char *swfdec_bits_get_string_length (SwfdecBits * bits, unsigned int len); -unsigned int swfdec_bits_get_color (SwfdecBits * bits); -unsigned int swfdec_bits_get_rgba (SwfdecBits * bits); +SwfdecColor swfdec_bits_get_color (SwfdecBits * bits); +SwfdecColor swfdec_bits_get_rgba (SwfdecBits * bits); SwfdecGradient *swfdec_bits_get_gradient (SwfdecBits * bits); SwfdecGradient *swfdec_bits_get_gradient_rgba (SwfdecBits * bits); SwfdecGradient *swfdec_bits_get_morph_gradient (SwfdecBits * bits); diff-tree 6efabb680e16b9144d8b4e880c18396861190d69 (from f1207b1451c4061e86adf62637134d63909ab754) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 16:40:58 2007 +0100 add initial support for auto-extraction of contents diff --git a/test/swfedit_tag.c b/test/swfedit_tag.c index 0a9fb9b..55020a0 100644 --- a/test/swfedit_tag.c +++ b/test/swfedit_tag.c @@ -25,6 +25,7 @@ #include <gtk/gtk.h> #include <libswfdec/swfdec_bits.h> +#include <libswfdec/swfdec_tag.h> #include "swfedit_tag.h" #include "swfdec_out.h" @@ -150,6 +151,29 @@ swfedit_tag_read_token (SwfeditToken *to swfedit_token_add (token, name, type, data); } +/*** TAGS ***/ + +typedef struct { + const char * name; /* name to use for this field */ + SwfeditTokenType type; /* type of this field */ + guint n_items; /* field to look at for item count */ + guint hint; /* hint to pass to field when creating */ +} SwfeditTagDefinition; + +static const SwfeditTagDefinition ShowFrame[] = { { NULL, 0, 0, 0 } }; + +static const SwfeditTagDefinition *tags[] = { + [SWFDEC_TAG_SHOWFRAME] = ShowFrame, +}; + +static const SwfeditTagDefinition * +swfedit_tag_get_definition (guint tag) +{ + if (tag >= G_N_ELEMENTS (tags)) + return NULL; + return tags[tag]; +} + /*** SWFEDIT_TAG ***/ G_DEFINE_TYPE (SwfeditTag, swfedit_tag, SWFEDIT_TYPE_TOKEN) @@ -179,13 +203,23 @@ SwfeditTag * swfedit_tag_new (SwfeditToken *parent, guint tag, SwfdecBuffer *buffer) { SwfeditTag *item; + const SwfeditTagDefinition *def; g_return_val_if_fail (SWFEDIT_IS_TOKEN (parent), NULL); item = g_object_new (SWFEDIT_TYPE_TAG, NULL); item->tag = tag; SWFEDIT_TOKEN (item)->parent = parent; - swfedit_token_add (SWFEDIT_TOKEN (item), "contents", SWFEDIT_TOKEN_BINARY, buffer); + def = swfedit_tag_get_definition (tag); + if (def) { + SwfdecBits bits; + swfdec_bits_init (&bits, buffer); + for (;def->name != NULL; def++) { + swfedit_tag_read_token (SWFEDIT_TOKEN (item), &bits, def->name, def->type); + } + } else { + swfedit_token_add (SWFEDIT_TOKEN (item), "contents", SWFEDIT_TOKEN_BINARY, buffer); + } return item; } diff-tree f1207b1451c4061e86adf62637134d63909ab754 (from 2699f0ac28fe220c12fe6f98b05c50937125aeea) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 16:40:35 2007 +0100 handle tokens without children diff --git a/test/swfedit_token.c b/test/swfedit_token.c index b2210fd..ecf471c 100644 --- a/test/swfedit_token.c +++ b/test/swfedit_token.c @@ -309,6 +309,8 @@ swfedit_token_iter_children (GtkTreeMode } else { token = SWFEDIT_TOKEN (tree_model); } + if (token->tokens->len == 0) + return FALSE; iter->stamp = 0; /* FIXME */ iter->user_data = token; iter->user_data2 = GINT_TO_POINTER (0); @@ -322,7 +324,7 @@ swfedit_token_iter_has_child (GtkTreeMod SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (iter->user_data2)); REPORT; - return entry->type == SWFEDIT_TOKEN_OBJECT; + return entry->type == SWFEDIT_TOKEN_OBJECT && SWFEDIT_TOKEN (entry->value)->tokens->len > 0; } static gint @@ -333,7 +335,7 @@ swfedit_token_iter_n_children (GtkTreeMo REPORT; if (entry->type != SWFEDIT_TOKEN_OBJECT) - return FALSE; + return 0; token = entry->value; return token->tokens->len; diff-tree 2699f0ac28fe220c12fe6f98b05c50937125aeea (from 4d09855e83ee699d590e8916e4af318ab79cc99b) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 24 15:44:38 2007 +0100 remove debugging g_print diff --git a/test/swfdec_out.c b/test/swfdec_out.c index 70dcc7c..b795b28 100644 --- a/test/swfdec_out.c +++ b/test/swfdec_out.c @@ -168,7 +168,6 @@ swfdec_out_put_bits (SwfdecOut *out, gui *out->ptr = 0; value &= (1 << bits_now) - 1; value <<= 8 - out->idx - bits_now; - g_print ("putting %02X in the next %u bits\n", value, bits_now); *out->ptr |= value; out->idx += bits_now; g_assert (out->idx <= 8);
Maybe Matching Threads
- 9 commits - libswfdec/js libswfdec/swfdec_bits.c libswfdec/swfdec_bits.h libswfdec/swfdec_codec_screen.c libswfdec/swfdec_image.c libswfdec/swfdec_script.c test/Makefile.am test/swfdec_out.c test/swfdec_out.h test/swfedit.c test/swfedit_file.c
- 7 commits - libswfdec/swfdec_image.c libswfdec/swfdec_script.c libswfdec/swfdec_script.h test/Makefile.am test/swfdec_out.c test/swfdec_out.h test/swfedit.c test/swfedit_list.c test/swfedit_tag.c test/swfedit_token.c test/swfedit_token.h test/swfscript.c
- 12 commits - configure.ac doc/swfdec.types Makefile.am test/crashfinder.c test/dump.c test/Makefile.am test/swfdec-extract.c test/swfdec_out.c test/swfdec_out.h test/swfedit.c test/swfedit_file.c test/swfedit_file.h test/swfedit_list.c test/swfedit_list.h
- Branch 'interpreter' - 28 commits - configure.ac libswfdec/js libswfdec/swfdec_buffer.c libswfdec/swfdec_edittext_movie.c libswfdec/swfdec_js.c libswfdec/swfdec_js_global.c libswfdec/swfdec_js.h libswfdec/swfdec_js_movie.c libswfdec/swfdec_player.c
- 109 commits - configure.ac libswfdec/js libswfdec/Makefile.am libswfdec/swfdec_bits.c libswfdec/swfdec_bits.h libswfdec/swfdec_buffer.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_codec_screen.c libswfdec/swfdec_color.c libswfdec/swfdec_color.h