Benjamin Otte
2007-Feb-13 12:15 UTC
[Swfdec] 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 test/swfedit_file.h test/swfedit_list.c test/swfedit_list.h test/swfedit_tag.c test/swfedit_tag.h test/swfedit_token.c test/swfedit_token.h
libswfdec/js/jsinterp.c | 1 libswfdec/swfdec_bits.c | 108 +++++++++++++ libswfdec/swfdec_bits.h | 4 libswfdec/swfdec_codec_screen.c | 68 +------- libswfdec/swfdec_image.c | 107 ++++++------- libswfdec/swfdec_script.c | 40 +++++ test/Makefile.am | 11 + test/swfdec_out.c | 119 +++++++++++++++ test/swfdec_out.h | 67 ++++---- test/swfedit.c | 19 +- test/swfedit_file.c | 18 +- test/swfedit_file.h | 1 test/swfedit_list.c | 133 +++++++++++++++++ test/swfedit_list.h | 61 +++++++ test/swfedit_tag.c | 311 +++++++++++++++++++++++++++++++++++----- test/swfedit_tag.h | 21 ++ test/swfedit_token.c | 211 +++++++++++++++++++++++++-- test/swfedit_token.h | 18 ++ 18 files changed, 1105 insertions(+), 213 deletions(-) New commits: diff-tree 634736d7d5ba5b7e3ef43893278b95fac05a3cb2 (from b3f04131da03829352ae315b2986ecda634c58c9) Author: Benjamin Otte <otte@gnome.org> Date: Tue Feb 13 21:15:37 2007 +0100 swf may be used uninitialized in this function diff --git a/libswfdec/js/jsinterp.c b/libswfdec/js/jsinterp.c index 910087a..ab095f6 100644 --- a/libswfdec/js/jsinterp.c +++ b/libswfdec/js/jsinterp.c @@ -807,6 +807,7 @@ js_Invoke(JSContext *cx, uintN argc, uin } fun = NULL; script = NULL; + swf = NULL; minargs = nvars = 0; /* Try a call or construct native object op. */ diff-tree b3f04131da03829352ae315b2986ecda634c58c9 (from 319fb2b1931124bc32607519c26c50d7318236a4) Author: Benjamin Otte <otte@gnome.org> Date: Mon Feb 12 20:25:57 2007 +0100 add a libswfedit, so I can use this editing code for more tools diff --git a/test/Makefile.am b/test/Makefile.am index 0d1dd19..b55bf0f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,7 @@ SUBDIRS = image sound trace various +noinst_LTLIBRARIES = libswfedit.la + if WITH_GTK noinst_PROGRAMS = swfdec-extract dump parse swfedit else @@ -15,12 +17,15 @@ parse_LDFLAGS = $(SWF_LIBS) $(CAIRO_LIBS swfdec_extract_CFLAGS = $(GLOBAL_CFLAGS) $(SWF_CFLAGS) $(CAIRO_CFLAGS) -DXP_UNIX -I$(top_builddir)/libswfdec/js swfdec_extract_LDFLAGS = $(SWF_LIBS) $(CAIRO_LIBS) +libswfedit_la_CFLAGS = $(GLOBAL_CFLAGS) $(SWF_CFLAGS) $(GTK_CFLAGS) -DXP_UNIX -I$(top_builddir)/libswfdec/js +libswfedit_la_LDFLAGS = $(SWF_LIBS) $(GTK_LIBS) + swfedit_CFLAGS = $(GLOBAL_CFLAGS) $(SWF_CFLAGS) $(GTK_CFLAGS) -DXP_UNIX -I$(top_builddir)/libswfdec/js swfedit_LDFLAGS = $(SWF_LIBS) $(GTK_LIBS) +swfedit_LDADD = libswfedit.la -swfedit_SOURCES = \ +libswfedit_la_SOURCES = \ swfdec_out.c \ - swfedit.c \ swfedit_file.c \ swfedit_list.c \ swfedit_tag.c \ diff-tree 319fb2b1931124bc32607519c26c50d7318236a4 (from 9b0b34f65f692da1da2aea559c74926fa610420b) Author: Benjamin Otte <otte@gnome.org> Date: Mon Feb 12 19:37:55 2007 +0100 more work in making swfedit useful diff --git a/test/swfedit_file.c b/test/swfedit_file.c index 165cde7..26699de 100644 --- a/test/swfedit_file.c +++ b/test/swfedit_file.c @@ -284,3 +284,14 @@ swfedit_file_save (SwfeditFile *file, GE return ret; } +guint +swfedit_file_get_version (SwfeditFile *file) +{ + SwfeditTokenEntry *entry; + + g_return_val_if_fail (SWFEDIT_FILE (file), 3); + + entry = &g_array_index (SWFEDIT_TOKEN (file)->tokens, SwfeditTokenEntry, 0); + return GPOINTER_TO_UINT (entry->value); +} + diff --git a/test/swfedit_file.h b/test/swfedit_file.h index e904950..ecd096a 100644 --- a/test/swfedit_file.h +++ b/test/swfedit_file.h @@ -52,6 +52,7 @@ SwfeditFile * swfedit_file_new (const c gboolean swfedit_file_save (SwfeditFile * file, GError ** error); +guint swfedit_file_get_version (SwfeditFile * file); G_END_DECLS diff --git a/test/swfedit_list.c b/test/swfedit_list.c index 35ab0a3..289d7de 100644 --- a/test/swfedit_list.c +++ b/test/swfedit_list.c @@ -99,7 +99,7 @@ swfedit_list_new (const SwfeditTagDefini } SwfeditList * -swfedit_list_new_read (SwfdecBits *bits, const SwfeditTagDefinition *def) +swfedit_list_new_read (SwfeditToken *parent, SwfdecBits *bits, const SwfeditTagDefinition *def) { SwfeditList *list; SwfeditTokenEntry *entry; @@ -109,6 +109,7 @@ swfedit_list_new_read (SwfdecBits *bits, g_return_val_if_fail (def != NULL, NULL); list = swfedit_list_new_internal (def); + SWFEDIT_TOKEN (list)->parent = parent; offset = 0; while (TRUE) { def = list->def; @@ -120,7 +121,10 @@ swfedit_list_new_read (SwfdecBits *bits, def++; for (;def->name != NULL; def++) { - swfedit_tag_read_tag (SWFEDIT_TOKEN (list), bits, def); + SwfeditTagDefinition def2 = *def; + if (def2.n_items) + def2.n_items += offset; + swfedit_tag_read_tag (SWFEDIT_TOKEN (list), bits, &def2); } offset += list->n_defs; } diff --git a/test/swfedit_list.h b/test/swfedit_list.h index d51ae73..e0666f7 100644 --- a/test/swfedit_list.h +++ b/test/swfedit_list.h @@ -49,7 +49,8 @@ struct _SwfeditListClass { GType swfedit_list_get_type (void); SwfeditList * swfedit_list_new (const SwfeditTagDefinition * def); -SwfeditList * swfedit_list_new_read (SwfdecBits * bits, +SwfeditList * swfedit_list_new_read (SwfeditToken * parent, + SwfdecBits * bits, const SwfeditTagDefinition * def); SwfdecBuffer * swfedit_list_write (SwfeditList * list); diff --git a/test/swfedit_tag.c b/test/swfedit_tag.c index c8cf442..75137a5 100644 --- a/test/swfedit_tag.c +++ b/test/swfedit_tag.c @@ -30,12 +30,13 @@ #include <libswfdec/swfdec_tag.h> #include "swfedit_tag.h" #include "swfdec_out.h" +#include "swfedit_file.h" #include "swfedit_list.h" /*** LOAD/SAVE ***/ static void -swfedit_object_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_object_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { SwfdecBuffer *buffer; @@ -46,19 +47,19 @@ swfedit_object_write (gpointer data, Swf } static gpointer -swfedit_object_read (SwfdecBits *bits, gconstpointer hint) +swfedit_object_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { - return swfedit_list_new_read (bits, hint); + return swfedit_list_new_read (token, bits, hint); } static void -swfedit_binary_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_binary_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_buffer (out, data); } static gpointer -swfedit_binary_read (SwfdecBits *bits, gconstpointer hint) +swfedit_binary_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { SwfdecBuffer *buffer = swfdec_bits_get_buffer (bits, -1); if (buffer == NULL) @@ -67,61 +68,61 @@ swfedit_binary_read (SwfdecBits *bits, g } static void -swfedit_bit_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_bit_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_bit (out, data ? TRUE : FALSE); } static gpointer -swfedit_bit_read (SwfdecBits *bits, gconstpointer hint) +swfedit_bit_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_getbit (bits) ? 1 : 0); } static void -swfedit_u8_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_u8_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u8 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u8_read (SwfdecBits *bits, gconstpointer hint) +swfedit_u8_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u8 (bits)); } static void -swfedit_u16_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_u16_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u16 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u16_read (SwfdecBits *bits, gconstpointer hint) +swfedit_u16_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u16 (bits)); } static void -swfedit_u32_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_u32_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u32 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u32_read (SwfdecBits *bits, gconstpointer hint) +swfedit_u32_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u32 (bits)); } static void -swfedit_rect_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_rect_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rect (out, data); } static gpointer -swfedit_rect_read (SwfdecBits *bits, gconstpointer hint) +swfedit_rect_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { SwfdecRect *rect = g_new (SwfdecRect, 1); swfdec_bits_get_rect (bits, rect); @@ -130,13 +131,13 @@ swfedit_rect_read (SwfdecBits *bits, gco } static void -swfedit_string_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_string_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_string (out, data); } static gpointer -swfedit_string_read (SwfdecBits *bits, gconstpointer hint) +swfedit_string_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { char *s; s = swfdec_bits_get_string (bits); @@ -146,37 +147,37 @@ swfedit_string_read (SwfdecBits *bits, g } static void -swfedit_rgb_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_rgb_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rgb (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_rgb_read (SwfdecBits *bits, gconstpointer hint) +swfedit_rgb_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_color (bits)); } static void -swfedit_rgba_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_rgba_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rgba (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_rgba_read (SwfdecBits *bits, gconstpointer hint) +swfedit_rgba_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_rgba (bits)); } static void -swfedit_matrix_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_matrix_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_matrix (out, data); } static gpointer -swfedit_matrix_read (SwfdecBits *bits, gconstpointer hint) +swfedit_matrix_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { cairo_matrix_t *matrix = g_new (cairo_matrix_t, 1); @@ -186,13 +187,13 @@ swfedit_matrix_read (SwfdecBits *bits, g } static void -swfedit_ctrans_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_ctrans_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_color_transform (out, data); } static gpointer -swfedit_ctrans_read (SwfdecBits *bits, gconstpointer hint) +swfedit_ctrans_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { SwfdecColorTransform *ctrans = g_new (SwfdecColorTransform, 1); @@ -202,7 +203,7 @@ swfedit_ctrans_read (SwfdecBits *bits, g } static void -swfedit_script_write (gpointer data, SwfdecOut *out, gconstpointer hint) +swfedit_script_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) { SwfdecScript *script = data; @@ -210,14 +211,42 @@ swfedit_script_write (gpointer data, Swf } static gpointer -swfedit_script_read (SwfdecBits *bits, gconstpointer hint) +swfedit_script_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) { - return swfdec_script_new (bits, "original script", 6 /* FIXME */); + while (token->parent) + token = token->parent; + if (!SWFEDIT_IS_FILE (token)) + return NULL; + return swfdec_script_new (bits, "original script", swfedit_file_get_version (SWFEDIT_FILE (token))); +} + +static void +swfedit_clipeventflags_write (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint) +{ + while (token->parent) + token = token->parent; + g_assert (SWFEDIT_IS_FILE (token)); + if (swfedit_file_get_version (SWFEDIT_FILE (token)) >= 6) + swfdec_out_put_u32 (out, GPOINTER_TO_UINT (data)); + else + swfdec_out_put_u16 (out, GPOINTER_TO_UINT (data)); +} + +static gpointer +swfedit_clipeventflags_read (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint) +{ + while (token->parent) + token = token->parent; + g_assert (SWFEDIT_IS_FILE (token)); + if (swfedit_file_get_version (SWFEDIT_FILE (token)) >= 6) + return GUINT_TO_POINTER (swfdec_bits_get_u32 (bits)); + else + return GUINT_TO_POINTER (swfdec_bits_get_u16 (bits)); } struct { - void (* write) (gpointer data, SwfdecOut *out, gconstpointer hint); - gpointer (* read) (SwfdecBits *bits, gconstpointer hint); + void (* write) (SwfeditToken *token, gpointer data, SwfdecOut *out, gconstpointer hint); + gpointer (* read) (SwfeditToken *token, SwfdecBits *bits, gconstpointer hint); } operations[SWFEDIT_N_TOKENS] = { { swfedit_object_write, swfedit_object_read }, { swfedit_binary_write, swfedit_binary_read }, @@ -232,6 +261,7 @@ struct { { swfedit_matrix_write, swfedit_matrix_read }, { swfedit_ctrans_write, swfedit_ctrans_read }, { swfedit_script_write, swfedit_script_read }, + { swfedit_clipeventflags_write, swfedit_clipeventflags_read }, }; void @@ -245,7 +275,7 @@ swfedit_tag_write_token (SwfeditToken *t entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); g_assert (operations[entry->type].write != NULL); - operations[entry->type].write (entry->value, out, NULL); + operations[entry->type].write (token, entry->value, out, NULL); } SwfdecBuffer * @@ -276,9 +306,7 @@ swfedit_tag_read_token (SwfeditToken *to g_return_if_fail (name != NULL); g_assert (operations[type].read != NULL); - data = operations[type].read (bits, hint); - if (type == SWFEDIT_TOKEN_OBJECT) - SWFEDIT_TOKEN (data)->parent = token; + data = operations[type].read (token, bits, hint); swfedit_token_add (token, name, type, data); } @@ -287,11 +315,10 @@ swfedit_tag_read_token (SwfeditToken *to static const SwfeditTagDefinition ShowFrame[] = { { NULL, 0, 0, NULL } }; static const SwfeditTagDefinition SetBackgroundColor[] = { { "color", SWFEDIT_TOKEN_RGB, 0, NULL }, { NULL, 0, 0, NULL } }; static const SwfeditTagDefinition PlaceObject2Action[] = { - { "flags", SWFEDIT_TOKEN_UINT32, 0, NULL }, - { "reserved", SWFEDIT_TOKEN_UINT16, 0, NULL }, + { "flags", SWFEDIT_TOKEN_CLIPEVENTFLAGS, 0, NULL }, { "size", SWFEDIT_TOKEN_UINT32, 0, NULL }, //{ "key code", SWFEDIT_TOKEN_UINT8, 0, NULL }, /* only if flag foo is set */ - { "script", SWFEDIT_TOKEN_SCRIPT, 3, NULL }, + { "script", SWFEDIT_TOKEN_SCRIPT, 2, NULL }, { NULL, 0, 0, NULL } }; static const SwfeditTagDefinition PlaceObject2[] = { @@ -310,15 +337,27 @@ static const SwfeditTagDefinition PlaceO { "ratio", SWFEDIT_TOKEN_UINT16, 4, NULL }, { "name", SWFEDIT_TOKEN_STRING, 3, NULL }, { "clip depth", SWFEDIT_TOKEN_UINT16, 2, NULL }, - { "all flags", SWFEDIT_TOKEN_UINT32, 1, NULL }, + { "reserved", SWFEDIT_TOKEN_UINT16, 1, NULL }, + { "all flags", SWFEDIT_TOKEN_CLIPEVENTFLAGS, 1, NULL }, { "actions", SWFEDIT_TOKEN_OBJECT, 1, PlaceObject2Action }, { NULL, 0, 0, NULL } }; +static const SwfeditTagDefinition DoAction[] = { + { "action", SWFEDIT_TOKEN_SCRIPT, 0, NULL }, + { NULL, 0, 0, NULL } +}; +static const SwfeditTagDefinition DoInitAction[] = { + { "character", SWFEDIT_TOKEN_UINT16, 0, NULL }, + { "action", SWFEDIT_TOKEN_SCRIPT, 0, NULL }, + { NULL, 0, 0, NULL } +}; static const SwfeditTagDefinition *tags[] = { [SWFDEC_TAG_SHOWFRAME] = ShowFrame, [SWFDEC_TAG_SETBACKGROUNDCOLOR] = SetBackgroundColor, [SWFDEC_TAG_PLACEOBJECT2] = PlaceObject2, + [SWFDEC_TAG_DOACTION] = DoAction, + [SWFDEC_TAG_DOINITACTION] = DoInitAction, }; static const SwfeditTagDefinition * diff --git a/test/swfedit_token.c b/test/swfedit_token.c index 9155b94..005e6c1 100644 --- a/test/swfedit_token.c +++ b/test/swfedit_token.c @@ -364,6 +364,7 @@ struct { { swfedit_matrix_new, swfedit_matrix_from_string, swfedit_matrix_to_string, g_free }, { swfedit_ctrans_new, swfedit_ctrans_from_string, swfedit_ctrans_to_string, g_free }, { swfedit_script_new, swfedit_script_from_string, swfedit_script_to_string, swfedit_script_free }, + { NULL, swfedit_uint32_from_string, swfedit_to_string_unsigned, NULL }, }; gpointer diff --git a/test/swfedit_token.h b/test/swfedit_token.h index 53c3b62..c9e522f 100644 --- a/test/swfedit_token.h +++ b/test/swfedit_token.h @@ -39,6 +39,7 @@ typedef enum { SWFEDIT_TOKEN_MATRIX, SWFEDIT_TOKEN_CTRANS, SWFEDIT_TOKEN_SCRIPT, + SWFEDIT_TOKEN_CLIPEVENTFLAGS, SWFEDIT_N_TOKENS } SwfeditTokenType; diff-tree 9b0b34f65f692da1da2aea559c74926fa610420b (from 4a5112ee3285fd9cf3ba55bece78c2110c40cace) Author: Benjamin Otte <otte@gnome.org> Date: Mon Feb 12 15:56:46 2007 +0100 Updates to swfedit - it now presents PlaceObject2 tags nicely diff --git a/test/Makefile.am b/test/Makefile.am index 00c8203..0d1dd19 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -22,11 +22,13 @@ swfedit_SOURCES = \ swfdec_out.c \ swfedit.c \ swfedit_file.c \ + swfedit_list.c \ swfedit_tag.c \ swfedit_token.c noinst_HEADERS = \ swfdec_out.h \ swfedit_file.h \ + swfedit_list.h \ swfedit_tag.h \ swfedit_token.h diff --git a/test/swfdec_out.c b/test/swfdec_out.c index 0719b0f..b17cedb 100644 --- a/test/swfdec_out.c +++ b/test/swfdec_out.c @@ -67,6 +67,14 @@ swfdec_out_close (SwfdecOut *out) } unsigned int +swfdec_out_get_bits (SwfdecOut *out) +{ + g_return_val_if_fail (out != NULL, 0); + + return (out->ptr - out->data) * 8 + out->idx; +} + +unsigned int swfdec_out_left (SwfdecOut *out) { g_return_val_if_fail (out != NULL, 0); @@ -186,6 +194,21 @@ swfdec_out_put_sbits (SwfdecOut *out, in swfdec_out_put_bits (out, bits, n_bits); } +void +swfdec_out_put_string (SwfdecOut *out, const char *s) +{ + guint len; + + g_return_if_fail (out != NULL); + g_return_if_fail (s != NULL); + + len = strlen (s) + 1; + + swfdec_out_prepare_bytes (out, len); + memcpy (out->ptr, s, len); + out->ptr += len; +} + static guint swfdec_out_bits_required (guint x) { @@ -202,12 +225,12 @@ static guint swfdec_out_sbits_required (int x) { if (x < 0) - x = -x; + x = !x; return swfdec_out_bits_required (x) + 1; } void -swfdec_out_put_rect (SwfdecOut *out, SwfdecRect *rect) +swfdec_out_put_rect (SwfdecOut *out, const SwfdecRect *rect) { int x0, x1, y0, y1; guint req, tmp; @@ -236,6 +259,98 @@ swfdec_out_put_rect (SwfdecOut *out, Swf } void +swfdec_out_put_matrix (SwfdecOut *out, const cairo_matrix_t *matrix) +{ + int x, y; + unsigned int xbits, ybits; + + if (matrix->xx != 1.0 || matrix->yy != 1.0) { + swfdec_out_put_bit (out, 1); + x = SWFDEC_DOUBLE_TO_FIXED (matrix->xx); + y = SWFDEC_DOUBLE_TO_FIXED (matrix->yy); + xbits = swfdec_out_sbits_required (x); + ybits = swfdec_out_sbits_required (y); + xbits = MAX (xbits, ybits); + swfdec_out_put_bits (out, xbits, 5); + swfdec_out_put_sbits (out, x, xbits); + swfdec_out_put_sbits (out, y, xbits); + } else { + swfdec_out_put_bit (out, 0); + } + if (matrix->xy != 0.0 || matrix->yx != 0.0) { + swfdec_out_put_bit (out, 1); + x = SWFDEC_DOUBLE_TO_FIXED (matrix->yx); + y = SWFDEC_DOUBLE_TO_FIXED (matrix->xy); + xbits = swfdec_out_sbits_required (x); + ybits = swfdec_out_sbits_required (y); + xbits = MAX (xbits, ybits); + swfdec_out_put_bits (out, xbits, 5); + swfdec_out_put_sbits (out, x, xbits); + swfdec_out_put_sbits (out, y, xbits); + } else { + swfdec_out_put_bit (out, 0); + } + x = matrix->x0; + y = matrix->y0; + xbits = swfdec_out_sbits_required (x); + ybits = swfdec_out_sbits_required (y); + xbits = MAX (xbits, ybits); + swfdec_out_put_bits (out, xbits, 5); + swfdec_out_put_sbits (out, x, xbits); + swfdec_out_put_sbits (out, y, xbits); + swfdec_out_syncbits (out); +} + +void +swfdec_out_put_color_transform (SwfdecOut *out, const SwfdecColorTransform *trans) +{ + gboolean has_add, has_mult; + unsigned int n_bits, tmp; + + has_mult = trans->ra != 256 || trans->ga != 256 || trans->ba != 256 || trans->aa != 256; + has_add = trans->rb != 0 || trans->gb != 0 || trans->bb != 0 || trans->ab != 0; + if (has_mult) { + n_bits = swfdec_out_sbits_required (trans->ra); + tmp = swfdec_out_sbits_required (trans->ga); + n_bits = MAX (tmp, n_bits); + tmp = swfdec_out_sbits_required (trans->ba); + n_bits = MAX (tmp, n_bits); + tmp = swfdec_out_sbits_required (trans->aa); + n_bits = MAX (tmp, n_bits); + } else { + n_bits = 0; + } + if (has_add) { + tmp = swfdec_out_sbits_required (trans->rb); + n_bits = MAX (tmp, n_bits); + tmp = swfdec_out_sbits_required (trans->gb); + n_bits = MAX (tmp, n_bits); + tmp = swfdec_out_sbits_required (trans->bb); + n_bits = MAX (tmp, n_bits); + tmp = swfdec_out_sbits_required (trans->ab); + n_bits = MAX (tmp, n_bits); + } + if (n_bits >= (1 << 4)) + n_bits = (1 << 4) - 1; + swfdec_out_put_bit (out, has_add); + swfdec_out_put_bit (out, has_mult); + swfdec_out_put_bits (out, n_bits, 4); + if (has_mult) { + swfdec_out_put_sbits (out, trans->ra, n_bits); + swfdec_out_put_sbits (out, trans->ga, n_bits); + swfdec_out_put_sbits (out, trans->ba, n_bits); + swfdec_out_put_sbits (out, trans->aa, n_bits); + } + if (has_add) { + swfdec_out_put_sbits (out, trans->rb, n_bits); + swfdec_out_put_sbits (out, trans->gb, n_bits); + swfdec_out_put_sbits (out, trans->bb, n_bits); + swfdec_out_put_sbits (out, trans->ab, n_bits); + } + swfdec_out_syncbits (out); +} + +void swfdec_out_put_rgb (SwfdecOut *out, SwfdecColor color) { g_return_if_fail (out != NULL); diff --git a/test/swfdec_out.h b/test/swfdec_out.h index d1f916c..3a22f36 100644 --- a/test/swfdec_out.h +++ b/test/swfdec_out.h @@ -40,37 +40,44 @@ struct _SwfdecOut { #define SWFDEC_OUT_STEP (32) SwfdecOut * swfdec_out_open (void); -SwfdecBuffer * swfdec_out_close (SwfdecOut * out); +SwfdecBuffer * swfdec_out_close (SwfdecOut * out); -unsigned int swfdec_out_left (SwfdecOut * out); -void swfdec_out_ensure_bits (SwfdecOut * out, - unsigned int bits); -void swfdec_out_prepare_bytes (SwfdecOut * out, - unsigned int bytes); - -void swfdec_out_put_bit (SwfdecOut * out, - gboolean bit); -void swfdec_out_put_bits (SwfdecOut * out, - guint bits, - guint n_bits); -void swfdec_out_put_sbits (SwfdecOut * out, - int bits, - guint n_bits); -void swfdec_out_put_buffer (SwfdecOut * out, - SwfdecBuffer * buffer); -void swfdec_out_put_u8 (SwfdecOut * out, - guint i); -void swfdec_out_put_u16 (SwfdecOut * out, - guint i); -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); +unsigned int swfdec_out_get_bits (SwfdecOut * out); +unsigned int swfdec_out_left (SwfdecOut * out); +void swfdec_out_ensure_bits (SwfdecOut * out, + unsigned int bits); +void swfdec_out_prepare_bytes (SwfdecOut * out, + unsigned int bytes); + +void swfdec_out_put_bit (SwfdecOut * out, + gboolean bit); +void swfdec_out_put_bits (SwfdecOut * out, + guint bits, + guint n_bits); +void swfdec_out_put_sbits (SwfdecOut * out, + int bits, + guint n_bits); +void swfdec_out_put_buffer (SwfdecOut * out, + SwfdecBuffer * buffer); +void swfdec_out_put_u8 (SwfdecOut * out, + guint i); +void swfdec_out_put_u16 (SwfdecOut * out, + guint i); +void swfdec_out_put_u32 (SwfdecOut * out, + guint i); +void swfdec_out_put_string (SwfdecOut * out, + const char * s); + +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, + const SwfdecRect * rect); +void swfdec_out_put_matrix (SwfdecOut * out, + const cairo_matrix_t * matrix); +void swfdec_out_put_color_transform (SwfdecOut * out, + const SwfdecColorTransform *trans); G_END_DECLS diff --git a/test/swfedit.c b/test/swfedit.c index 258f25e..7e13bd6 100644 --- a/test/swfedit.c +++ b/test/swfedit.c @@ -33,12 +33,13 @@ save (GtkButton *button, SwfeditFile *fi dialog = gtk_file_chooser_dialog_new ("Save file...", GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), file->filename); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { g_free (file->filename); file->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if (!swfedit_file_save (file, &error)) { @@ -70,6 +71,7 @@ open_window (char *filename) GError *error = NULL; GtkTreeViewColumn *column; GtkCellRenderer *renderer; + char *basename; file = swfedit_file_new (filename, &error); if (file == NULL) { @@ -78,7 +80,11 @@ open_window (char *filename) return FALSE; } window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), filename); + basename = g_path_get_basename (filename); + if (basename) { + gtk_window_set_title (GTK_WINDOW (window), basename); + g_free (basename); + } g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); box = gtk_vbox_new (FALSE, 3); @@ -92,7 +98,7 @@ open_window (char *filename) renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Name", renderer, - "text", SWFEDIT_COLUMN_NAME, NULL); + "text", SWFEDIT_COLUMN_NAME, "sensitive", SWFEDIT_COLUMN_VALUE_EDITABLE, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); @@ -100,7 +106,8 @@ open_window (char *filename) g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); g_signal_connect (renderer, "edited", G_CALLBACK (cell_renderer_edited), file); column = gtk_tree_view_column_new_with_attributes ("Value", renderer, - "text", SWFEDIT_COLUMN_VALUE, "visible", SWFEDIT_COLUMN_VALUE_VISIBLE, NULL); + "text", SWFEDIT_COLUMN_VALUE, "visible", SWFEDIT_COLUMN_VALUE_VISIBLE, + "sensitive", SWFEDIT_COLUMN_VALUE_EDITABLE, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); diff --git a/test/swfedit_file.c b/test/swfedit_file.c index dd5e035..165cde7 100644 --- a/test/swfedit_file.c +++ b/test/swfedit_file.c @@ -125,9 +125,9 @@ swf_parse_header1 (SwfeditFile *file, Sw static void swf_parse_header2 (SwfeditFile *file, SwfdecBits *bits) { - swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "rect", SWFEDIT_TOKEN_RECT); - swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "rate", SWFEDIT_TOKEN_UINT16); - swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "frames", SWFEDIT_TOKEN_UINT16); + swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "rect", SWFEDIT_TOKEN_RECT, NULL); + swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "rate", SWFEDIT_TOKEN_UINT16, NULL); + swfedit_tag_read_token (SWFEDIT_TOKEN (file), bits, "frames", SWFEDIT_TOKEN_UINT16, NULL); } static gboolean @@ -254,7 +254,6 @@ swfedit_file_write (SwfeditFile *file) swfdec_out_put_u8 (out, 'W'); swfdec_out_put_u8 (out, 'S'); swfedit_tag_write_token (token, out, 0); - g_print ("length: %u", swfdec_buffer_queue_get_depth (queue)); swfdec_out_put_u32 (out, swfdec_buffer_queue_get_depth (queue) + 8); swfdec_out_prepare_bytes (out, swfdec_buffer_queue_get_depth (queue)); while ((buffer = swfdec_buffer_queue_pull_buffer (queue))) { diff --git a/test/swfedit_list.c b/test/swfedit_list.c new file mode 100644 index 0000000..35ab0a3 --- /dev/null +++ b/test/swfedit_list.c @@ -0,0 +1,129 @@ +/* Swfedit + * Copyright (C) 2007 Benjamin Otte <otte@gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfedit_list.h" + +G_DEFINE_TYPE (SwfeditList, swfedit_list, SWFEDIT_TYPE_TOKEN) + +static void +swfedit_list_dispose (GObject *object) +{ + //SwfeditList *list = SWFEDIT_LIST (object); + + G_OBJECT_CLASS (swfedit_list_parent_class)->dispose (object); +} + +static void +swfedit_list_changed (SwfeditToken *token, guint i) +{ + guint j; + SwfeditList *list = SWFEDIT_LIST (token); + SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); + + /* update visibility */ + for (j = i + 1; j % list->n_defs != 0; j++) { + if (list->def[j].n_items == (j % list->n_defs) + 1) { + swfedit_token_set_visible (token, j, entry->value != NULL); + } + } + /* maybe add items */ + if (i == token->tokens->len - 1) { + g_print ("add fett neue items, man!\n"); + for (j = 0; j < list->n_defs; j++) { + const SwfeditTagDefinition *def = &list->def[(j + 1) % list->n_defs]; + swfedit_tag_add_token (SWFEDIT_TOKEN (list), def->name, def->type, def->hint); + } + } +} + +static void +swfedit_list_class_init (SwfeditListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfeditTokenClass *token_class = SWFEDIT_TOKEN_CLASS (klass); + + object_class->dispose = swfedit_list_dispose; + + token_class->changed = swfedit_list_changed; +} + +static void +swfedit_list_init (SwfeditList *list) +{ +} + +static SwfeditList * +swfedit_list_new_internal (const SwfeditTagDefinition *def) +{ + SwfeditList *list; + + list = g_object_new (SWFEDIT_TYPE_LIST, NULL); + list->def = def; + for (; def->name; def++) + list->n_defs++; + + return list; +} + +SwfeditList * +swfedit_list_new (const SwfeditTagDefinition *def) +{ + SwfeditList *list; + + g_return_val_if_fail (def != NULL, NULL); + + list = swfedit_list_new_internal (def); + swfedit_tag_add_token (SWFEDIT_TOKEN (list), def->name, def->type, def->hint); + + return list; +} + +SwfeditList * +swfedit_list_new_read (SwfdecBits *bits, const SwfeditTagDefinition *def) +{ + SwfeditList *list; + SwfeditTokenEntry *entry; + guint offset; + + g_return_val_if_fail (bits != NULL, NULL); + g_return_val_if_fail (def != NULL, NULL); + + list = swfedit_list_new_internal (def); + offset = 0; + while (TRUE) { + def = list->def; + swfedit_tag_read_tag (SWFEDIT_TOKEN (list), bits, def); + entry = &g_array_index (SWFEDIT_TOKEN (list)->tokens, SwfeditTokenEntry, + SWFEDIT_TOKEN (list)->tokens->len - 1); + if (GPOINTER_TO_UINT (entry->value) == 0) + break; + + def++; + for (;def->name != NULL; def++) { + swfedit_tag_read_tag (SWFEDIT_TOKEN (list), bits, def); + } + offset += list->n_defs; + } + return list; +} + diff --git a/test/swfedit_list.h b/test/swfedit_list.h new file mode 100644 index 0000000..d51ae73 --- /dev/null +++ b/test/swfedit_list.h @@ -0,0 +1,60 @@ +/* Swfedit + * Copyright (C) 2007 Benjamin Otte <otte@gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef __SWFEDIT_LIST_H__ +#define __SWFEDIT_LIST_H__ + +#include "swfdec_out.h" +#include "swfedit_tag.h" + +G_BEGIN_DECLS + +typedef struct _SwfeditList SwfeditList; +typedef struct _SwfeditListClass SwfeditListClass; + +#define SWFEDIT_TYPE_LIST (swfedit_list_get_type()) +#define SWFEDIT_IS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFEDIT_TYPE_LIST)) +#define SWFEDIT_IS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFEDIT_TYPE_LIST)) +#define SWFEDIT_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFEDIT_TYPE_LIST, SwfeditList)) +#define SWFEDIT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFEDIT_TYPE_LIST, SwfeditListClass)) +#define SWFEDIT_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFEDIT_TYPE_LIST, SwfeditListClass)) + +struct _SwfeditList { + SwfeditToken token; + + const SwfeditTagDefinition * def; /* definition of our items */ + guint n_defs; /* number of items in def */ +}; + +struct _SwfeditListClass { + SwfeditTokenClass token_class; +}; + +GType swfedit_list_get_type (void); + +SwfeditList * swfedit_list_new (const SwfeditTagDefinition * def); +SwfeditList * swfedit_list_new_read (SwfdecBits * bits, + const SwfeditTagDefinition * def); + +SwfdecBuffer * swfedit_list_write (SwfeditList * list); + + +G_END_DECLS + +#endif diff --git a/test/swfedit_tag.c b/test/swfedit_tag.c index dd15978..c8cf442 100644 --- a/test/swfedit_tag.c +++ b/test/swfedit_tag.c @@ -25,20 +25,40 @@ #include <gtk/gtk.h> #include <libswfdec/swfdec_bits.h> +#include <libswfdec/swfdec_debug.h> +#include <libswfdec/swfdec_script.h> #include <libswfdec/swfdec_tag.h> #include "swfedit_tag.h" #include "swfdec_out.h" +#include "swfedit_list.h" /*** LOAD/SAVE ***/ static void -swfedit_binary_write (gpointer data, SwfdecOut *out) +swfedit_object_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + SwfdecBuffer *buffer; + + g_assert (SWFEDIT_IS_TOKEN (data)); + buffer = swfedit_tag_write (data); + swfdec_out_put_buffer (out, buffer); + swfdec_buffer_unref (buffer); +} + +static gpointer +swfedit_object_read (SwfdecBits *bits, gconstpointer hint) +{ + return swfedit_list_new_read (bits, hint); +} + +static void +swfedit_binary_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_buffer (out, data); } static gpointer -swfedit_binary_read (SwfdecBits *bits) +swfedit_binary_read (SwfdecBits *bits, gconstpointer hint) { SwfdecBuffer *buffer = swfdec_bits_get_buffer (bits, -1); if (buffer == NULL) @@ -47,91 +67,171 @@ swfedit_binary_read (SwfdecBits *bits) } static void -swfedit_u8_write (gpointer data, SwfdecOut *out) +swfedit_bit_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + swfdec_out_put_bit (out, data ? TRUE : FALSE); +} + +static gpointer +swfedit_bit_read (SwfdecBits *bits, gconstpointer hint) +{ + return GUINT_TO_POINTER (swfdec_bits_getbit (bits) ? 1 : 0); +} + +static void +swfedit_u8_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u8 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u8_read (SwfdecBits *bits) +swfedit_u8_read (SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u8 (bits)); } static void -swfedit_u16_write (gpointer data, SwfdecOut *out) +swfedit_u16_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u16 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u16_read (SwfdecBits *bits) +swfedit_u16_read (SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u16 (bits)); } static void -swfedit_u32_write (gpointer data, SwfdecOut *out) +swfedit_u32_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_u32 (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_u32_read (SwfdecBits *bits) +swfedit_u32_read (SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_u32 (bits)); } static void -swfedit_rect_write (gpointer data, SwfdecOut *out) +swfedit_rect_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rect (out, data); } static gpointer -swfedit_rect_read (SwfdecBits *bits) +swfedit_rect_read (SwfdecBits *bits, gconstpointer hint) { SwfdecRect *rect = g_new (SwfdecRect, 1); swfdec_bits_get_rect (bits, rect); + swfdec_bits_syncbits (bits); return rect; } static void -swfedit_rgb_write (gpointer data, SwfdecOut *out) +swfedit_string_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + swfdec_out_put_string (out, data); +} + +static gpointer +swfedit_string_read (SwfdecBits *bits, gconstpointer hint) +{ + char *s; + s = swfdec_bits_get_string (bits); + if (s == NULL) + s = g_strdup (""); + return s; +} + +static void +swfedit_rgb_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rgb (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_rgb_read (SwfdecBits *bits) +swfedit_rgb_read (SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_color (bits)); } static void -swfedit_rgba_write (gpointer data, SwfdecOut *out) +swfedit_rgba_write (gpointer data, SwfdecOut *out, gconstpointer hint) { swfdec_out_put_rgba (out, GPOINTER_TO_UINT (data)); } static gpointer -swfedit_rgba_read (SwfdecBits *bits) +swfedit_rgba_read (SwfdecBits *bits, gconstpointer hint) { return GUINT_TO_POINTER (swfdec_bits_get_rgba (bits)); } +static void +swfedit_matrix_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + swfdec_out_put_matrix (out, data); +} + +static gpointer +swfedit_matrix_read (SwfdecBits *bits, gconstpointer hint) +{ + cairo_matrix_t *matrix = g_new (cairo_matrix_t, 1); + + swfdec_bits_get_matrix (bits, matrix, NULL); + swfdec_bits_syncbits (bits); + return matrix; +} + +static void +swfedit_ctrans_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + swfdec_out_put_color_transform (out, data); +} + +static gpointer +swfedit_ctrans_read (SwfdecBits *bits, gconstpointer hint) +{ + SwfdecColorTransform *ctrans = g_new (SwfdecColorTransform, 1); + + swfdec_bits_get_color_transform (bits, ctrans); + swfdec_bits_syncbits (bits); + return ctrans; +} + +static void +swfedit_script_write (gpointer data, SwfdecOut *out, gconstpointer hint) +{ + SwfdecScript *script = data; + + swfdec_out_put_buffer (out, script->buffer); +} + +static gpointer +swfedit_script_read (SwfdecBits *bits, gconstpointer hint) +{ + return swfdec_script_new (bits, "original script", 6 /* FIXME */); +} + struct { - void (* write) (gpointer data, SwfdecOut *out); - gpointer (* read) (SwfdecBits *bits); + void (* write) (gpointer data, SwfdecOut *out, gconstpointer hint); + gpointer (* read) (SwfdecBits *bits, gconstpointer hint); } operations[SWFEDIT_N_TOKENS] = { - { NULL, NULL }, + { swfedit_object_write, swfedit_object_read }, { swfedit_binary_write, swfedit_binary_read }, + { swfedit_bit_write, swfedit_bit_read }, { swfedit_u8_write, swfedit_u8_read }, { swfedit_u16_write, swfedit_u16_read }, { swfedit_u32_write, swfedit_u32_read }, + { swfedit_string_write, swfedit_string_read }, { swfedit_rect_write, swfedit_rect_read }, { swfedit_rgb_write, swfedit_rgb_read }, { swfedit_rgba_write, swfedit_rgba_read }, + { swfedit_matrix_write, swfedit_matrix_read }, + { swfedit_ctrans_write, swfedit_ctrans_read }, + { swfedit_script_write, swfedit_script_read }, }; void @@ -145,27 +245,30 @@ swfedit_tag_write_token (SwfeditToken *t entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); g_assert (operations[entry->type].write != NULL); - operations[entry->type].write (entry->value, out); + operations[entry->type].write (entry->value, out, NULL); } SwfdecBuffer * -swfedit_tag_write (SwfeditTag *tag) +swfedit_tag_write (SwfeditToken *token) { guint i; SwfdecOut *out; - g_return_val_if_fail (SWFEDIT_IS_TAG (tag), NULL); + g_return_val_if_fail (SWFEDIT_IS_TOKEN (token), NULL); out = swfdec_out_open (); - for (i = 0; i < SWFEDIT_TOKEN (tag)->tokens->len; i++) { - swfedit_tag_write_token (SWFEDIT_TOKEN (tag), out, i); + for (i = 0; i < token->tokens->len; i++) { + SwfeditTokenEntry *entry = &g_array_index (token->tokens, + SwfeditTokenEntry, i); + if (entry->visible) + swfedit_tag_write_token (token, out, i); } return swfdec_out_close (out); } void swfedit_tag_read_token (SwfeditToken *token, SwfdecBits *bits, - const char *name, SwfeditTokenType type) + const char *name, SwfeditTokenType type, gconstpointer hint) { gpointer data; @@ -173,25 +276,49 @@ swfedit_tag_read_token (SwfeditToken *to g_return_if_fail (name != NULL); g_assert (operations[type].read != NULL); - data = operations[type].read (bits); + data = operations[type].read (bits, hint); + if (type == SWFEDIT_TOKEN_OBJECT) + SWFEDIT_TOKEN (data)->parent = token; 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 (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 ShowFrame[] = { { NULL, 0, 0, NULL } }; +static const SwfeditTagDefinition SetBackgroundColor[] = { { "color", SWFEDIT_TOKEN_RGB, 0, NULL }, { NULL, 0, 0, NULL } }; +static const SwfeditTagDefinition PlaceObject2Action[] = { + { "flags", SWFEDIT_TOKEN_UINT32, 0, NULL }, + { "reserved", SWFEDIT_TOKEN_UINT16, 0, NULL }, + { "size", SWFEDIT_TOKEN_UINT32, 0, NULL }, + //{ "key code", SWFEDIT_TOKEN_UINT8, 0, NULL }, /* only if flag foo is set */ + { "script", SWFEDIT_TOKEN_SCRIPT, 3, NULL }, + { NULL, 0, 0, NULL } +}; +static const SwfeditTagDefinition PlaceObject2[] = { + { "has clip actions", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has clip depth", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has name", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has ratio", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has color transform", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has matrix", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "has character", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "move", SWFEDIT_TOKEN_BIT, 0, NULL }, + { "depth", SWFEDIT_TOKEN_UINT16, 0, NULL }, + { "character", SWFEDIT_TOKEN_UINT16, 7, NULL }, + { "matrix", SWFEDIT_TOKEN_MATRIX, 6, NULL }, + { "color transform", SWFEDIT_TOKEN_CTRANS, 5, NULL }, + { "ratio", SWFEDIT_TOKEN_UINT16, 4, NULL }, + { "name", SWFEDIT_TOKEN_STRING, 3, NULL }, + { "clip depth", SWFEDIT_TOKEN_UINT16, 2, NULL }, + { "all flags", SWFEDIT_TOKEN_UINT32, 1, NULL }, + { "actions", SWFEDIT_TOKEN_OBJECT, 1, PlaceObject2Action }, + { NULL, 0, 0, NULL } +}; static const SwfeditTagDefinition *tags[] = { [SWFDEC_TAG_SHOWFRAME] = ShowFrame, [SWFDEC_TAG_SETBACKGROUNDCOLOR] = SetBackgroundColor, + [SWFDEC_TAG_PLACEOBJECT2] = PlaceObject2, }; static const SwfeditTagDefinition * @@ -215,11 +342,32 @@ swfedit_tag_dispose (GObject *object) } static void -swfedit_tag_class_init (SwfeditTagClass *class) +swfedit_tag_changed (SwfeditToken *token, guint i) +{ + guint j; + SwfeditTag *tag = SWFEDIT_TAG (token); + SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); + const SwfeditTagDefinition *def = swfedit_tag_get_definition (tag->tag); + + if (def == NULL) + return; + + for (j = i + 1; def[j].name; j++) { + if (def[j].n_items == i + 1) { + swfedit_token_set_visible (token, j, entry->value != NULL); + } + } +} + +static void +swfedit_tag_class_init (SwfeditTagClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfeditTokenClass *token_class = SWFEDIT_TOKEN_CLASS (klass); object_class->dispose = swfedit_tag_dispose; + + token_class->changed = swfedit_tag_changed; } static void @@ -227,6 +375,54 @@ swfedit_tag_init (SwfeditTag *tag) { } +void +swfedit_tag_add_token (SwfeditToken *token, const char *name, SwfeditTokenType type, + gconstpointer hint) +{ + gpointer data; + + if (type == SWFEDIT_TOKEN_OBJECT) { + data = swfedit_list_new (hint); + SWFEDIT_TOKEN (data)->parent = token; + } else { + data = swfedit_token_new_token (type); + } + swfedit_token_add (token, name, type, data); +} + +void +swfedit_tag_read_tag (SwfeditToken *token, SwfdecBits *bits, + const SwfeditTagDefinition *def) +{ + g_return_if_fail (SWFEDIT_IS_TOKEN (token)); + g_return_if_fail (bits != NULL); + g_return_if_fail (def != NULL); + + if (def->n_items != 0) { + SwfeditTokenEntry *entry = &g_array_index (token->tokens, + SwfeditTokenEntry, def->n_items - 1); + if (GPOINTER_TO_UINT (entry->value) == 0) { + swfedit_tag_add_token (token, def->name, def->type, def->hint); + swfedit_token_set_visible (token, token->tokens->len - 1, FALSE); + } else if (entry->type == SWFEDIT_TOKEN_BIT) { + swfedit_tag_read_token (token, bits, def->name, def->type, def->hint); + } else { + guint length = GPOINTER_TO_UINT (entry->value); + SwfdecBuffer *buffer = swfdec_bits_get_buffer (bits, length); + if (buffer == NULL) { + swfedit_tag_add_token (token, def->name, def->type, def->hint); + } else { + SwfdecBits bits2; + swfdec_bits_init (&bits2, buffer); + swfedit_tag_read_token (token, &bits2, def->name, def->type, def->hint); + swfdec_buffer_unref (buffer); + } + } + } else { + swfedit_tag_read_token (token, bits, def->name, def->type, def->hint); + } +} + SwfeditTag * swfedit_tag_new (SwfeditToken *parent, guint tag, SwfdecBuffer *buffer) { @@ -243,7 +439,11 @@ swfedit_tag_new (SwfeditToken *parent, g SwfdecBits bits; swfdec_bits_init (&bits, buffer); for (;def->name != NULL; def++) { - swfedit_tag_read_token (SWFEDIT_TOKEN (item), &bits, def->name, def->type); + swfedit_tag_read_tag (SWFEDIT_TOKEN (item), &bits, def); + } + if (swfdec_bits_left (&bits)) { + SWFDEC_WARNING ("%u bytes %u bits left unparsed", + swfdec_bits_left (&bits) / 8, swfdec_bits_left (&bits) % 8); } } else { swfedit_token_add (SWFEDIT_TOKEN (item), "contents", SWFEDIT_TOKEN_BINARY, buffer); diff --git a/test/swfedit_tag.h b/test/swfedit_tag.h index 46fdb5f..2f1d231 100644 --- a/test/swfedit_tag.h +++ b/test/swfedit_tag.h @@ -21,6 +21,7 @@ #define __SWFEDIT_TAG_H__ #include <libswfdec/swfdec_buffer.h> +#include <libswfdec/swfdec_bits.h> #include "swfdec_out.h" #include "swfedit_token.h" @@ -28,6 +29,14 @@ G_BEGIN_DECLS typedef struct _SwfeditTag SwfeditTag; typedef struct _SwfeditTagClass SwfeditTagClass; +typedef struct _SwfeditTagDefinition SwfeditTagDefinition; + +struct _SwfeditTagDefinition { + const char * name; /* name to use for this field */ + SwfeditTokenType type; /* type of this field */ + guint n_items; /* 1-indexed field to look at for item count (or 0 to use 1 item) */ + gconstpointer hint; /* hint to pass to field when creating */ +}; #define SWFEDIT_TYPE_TAG (swfedit_tag_get_type()) #define SWFEDIT_IS_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFEDIT_TYPE_TAG)) @@ -52,14 +61,22 @@ SwfeditTag * swfedit_tag_new (SwfeditTo guint tag, SwfdecBuffer * buffer); -SwfdecBuffer * swfedit_tag_write (SwfeditTag * tag); +SwfdecBuffer * swfedit_tag_write (SwfeditToken * token); void swfedit_tag_write_token (SwfeditToken * token, SwfdecOut * out, guint i); +void swfedit_tag_add_token (SwfeditToken * token, + const char * name, + SwfeditTokenType type, + gconstpointer hint); void swfedit_tag_read_token (SwfeditToken * token, SwfdecBits * bits, const char * name, - SwfeditTokenType type); + SwfeditTokenType type, + gconstpointer hint); +void swfedit_tag_read_tag (SwfeditToken * token, + SwfdecBits * bits, + const SwfeditTagDefinition *def); G_END_DECLS diff --git a/test/swfedit_token.c b/test/swfedit_token.c index f3f2bcc..9155b94 100644 --- a/test/swfedit_token.c +++ b/test/swfedit_token.c @@ -26,6 +26,7 @@ #include <gtk/gtk.h> #include <libswfdec/swfdec_buffer.h> #include <libswfdec/swfdec_color.h> +#include <libswfdec/swfdec_script.h> #include "swfedit_token.h" /*** CONVERTERS ***/ @@ -57,6 +58,12 @@ swfedit_parse_hex (const char *s, guint return TRUE; } +static gpointer +swfedit_binary_new (void) +{ + return swfdec_buffer_new (); +} + static gboolean swfedit_binary_from_string (const char *s, gpointer* result) { @@ -101,6 +108,24 @@ swfedit_binary_to_string (gconstpointer } static gboolean +swfedit_bit_from_string (const char *s, gpointer* result) +{ + if (s[0] == '1' && s[1] == '\0') + *result = GUINT_TO_POINTER (1); + else if (s[0] == '0' && s[1] == '\0') + *result = GUINT_TO_POINTER (0); + else + return FALSE; + return TRUE; +} + +static char * +swfedit_bit_to_string (gconstpointer value) +{ + return g_strdup (value ? "1" : "0"); +} + +static gboolean swfedit_from_string_unsigned (const char *s, gulong max, gpointer* result) { char *end; @@ -140,6 +165,25 @@ swfedit_to_string_unsigned (gconstpointe return g_strdup_printf ("%u", GPOINTER_TO_UINT (value)); } +static char * +swfedit_string_to_string (gconstpointer value) +{ + return g_strdup (value); +} + +static gboolean +swfedit_string_from_string (const char *s, gpointer* result) +{ + *result = g_strdup (s); + return TRUE; +} + +static gpointer +swfedit_rect_new (void) +{ + return g_new0 (SwfdecRect, 1); +} + static gboolean swfedit_rect_from_string (const char *s, gpointer* result) { @@ -212,21 +256,129 @@ swfedit_rgba_to_string (gconstpointer va SWFDEC_COLOR_G (c), SWFDEC_COLOR_B (c), SWFDEC_COLOR_A (c)); } +static gpointer +swfedit_matrix_new (void) +{ + cairo_matrix_t *matrix = g_new (cairo_matrix_t, 1); + + cairo_matrix_init_identity (matrix); + return matrix; +} + +static gboolean +swfedit_matrix_from_string (const char *s, gpointer* result) +{ + return FALSE; +} + +static char * +swfedit_matrix_to_string (gconstpointer value) +{ + const cairo_matrix_t *mat = value; + + return g_strdup_printf ("{%g %g, %g %g} + {%g, %g}", + mat->xx, mat->xy, mat->yx, mat->yy, mat->x0, mat->y0); +} + +static gpointer +swfedit_ctrans_new (void) +{ + SwfdecColorTransform *trans = g_new (SwfdecColorTransform, 1); + + swfdec_color_transform_init_identity (trans); + return trans; +} + +static gboolean +swfedit_ctrans_from_string (const char *s, gpointer* result) +{ + return FALSE; +} + +static char * +swfedit_ctrans_to_string (gconstpointer value) +{ + const SwfdecColorTransform *trans = value; + + return g_strdup_printf ("{%d %d} {%d %d} {%d %d} {%d %d}", + trans->ra, trans->rb, trans->ga, trans->gb, + trans->ba, trans->bb, trans->aa, trans->ab); +} + +static gpointer +swfedit_script_new (void) +{ + return NULL; +} + +static gboolean +swfedit_script_from_string (const char *s, gpointer* result) +{ + SwfdecBuffer *buffer; + SwfdecBits bits; + SwfdecScript *script; + + if (swfedit_binary_from_string (s, (gpointer *) &buffer)) + return FALSE; + + swfdec_bits_init (&bits, buffer); + script = swfdec_script_new (&bits, "unknown", 6 /* FIXME */); + swfdec_buffer_unref (buffer); + if (script != NULL) { + *result = script; + return TRUE; + } else { + return FALSE; + } +} + +static char * +swfedit_script_to_string (gconstpointer value) +{ + return swfedit_binary_to_string (((SwfdecScript *) value)->buffer); +} + +static void +swfedit_script_free (gpointer script) +{ + if (script) + swfdec_script_unref (script); +} + struct { + gpointer (* new) (void); gboolean (* from_string) (const char *s, gpointer *); char * (* to_string) (gconstpointer value); void (* free) (gpointer value); } converters[SWFEDIT_N_TOKENS] = { - { NULL, NULL, g_object_unref }, - { swfedit_binary_from_string, swfedit_binary_to_string, (GDestroyNotify) swfdec_buffer_unref }, - { swfedit_uint8_from_string, swfedit_to_string_unsigned, NULL }, - { 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 }, + { NULL, NULL, NULL, g_object_unref }, + { swfedit_binary_new, swfedit_binary_from_string, swfedit_binary_to_string, (GDestroyNotify) swfdec_buffer_unref }, + { NULL, swfedit_bit_from_string, swfedit_bit_to_string, NULL }, + { NULL, swfedit_uint8_from_string, swfedit_to_string_unsigned, NULL }, + { NULL, swfedit_uint16_from_string, swfedit_to_string_unsigned, NULL }, + { NULL, swfedit_uint32_from_string, swfedit_to_string_unsigned, NULL }, + { NULL, swfedit_string_from_string, swfedit_string_to_string, g_free }, + { swfedit_rect_new, swfedit_rect_from_string, swfedit_rect_to_string, g_free }, + { NULL, swfedit_rgb_from_string, swfedit_rgb_to_string, NULL }, + { NULL, swfedit_rgba_from_string, swfedit_rgba_to_string, NULL }, + { swfedit_matrix_new, swfedit_matrix_from_string, swfedit_matrix_to_string, g_free }, + { swfedit_ctrans_new, swfedit_ctrans_from_string, swfedit_ctrans_to_string, g_free }, + { swfedit_script_new, swfedit_script_from_string, swfedit_script_to_string, swfedit_script_free }, }; +gpointer +swfedit_token_new_token (SwfeditTokenType type) +{ + gpointer ret; + + g_assert (type < G_N_ELEMENTS (converters)); + + if (!converters[type].new) + return NULL; + ret = converters[type].new (); + return ret; +} + /*** GTK_TREE_MODEL ***/ #if 0 @@ -259,6 +411,8 @@ swfedit_token_get_column_type (GtkTreeMo return G_TYPE_STRING; case SWFEDIT_COLUMN_VALUE_VISIBLE: return G_TYPE_BOOLEAN; + case SWFEDIT_COLUMN_VALUE_EDITABLE: + return G_TYPE_BOOLEAN; case SWFEDIT_COLUMN_VALUE: return G_TYPE_STRING; default: @@ -343,6 +497,10 @@ swfedit_token_get_value (GtkTreeModel *t g_value_init (value, G_TYPE_BOOLEAN); g_value_set_boolean (value, converters[entry->type].to_string != NULL); return; + case SWFEDIT_COLUMN_VALUE_EDITABLE: + g_value_init (value, G_TYPE_BOOLEAN); + g_value_set_boolean (value, entry->visible); + return; case SWFEDIT_COLUMN_VALUE: g_value_init (value, G_TYPE_STRING); if (converters[entry->type].to_string) @@ -529,14 +687,16 @@ swfedit_token_new (void) } void -swfedit_token_add (SwfeditToken *token, const char *name, SwfeditTokenType type, gpointer value) +swfedit_token_add (SwfeditToken *token, const char *name, SwfeditTokenType type, + gpointer value) { - SwfeditTokenEntry entry = { NULL, type, value }; + SwfeditTokenEntry entry = { NULL, type, value, TRUE }; g_return_if_fail (SWFEDIT_IS_TOKEN (token)); g_return_if_fail (name != NULL); g_return_if_fail (type < SWFEDIT_N_TOKENS); + g_assert (type != SWFEDIT_TOKEN_OBJECT || value != NULL); entry.name = g_strdup (name); g_array_append_val (token->tokens, entry); } @@ -544,6 +704,7 @@ swfedit_token_add (SwfeditToken *token, void swfedit_token_set (SwfeditToken *token, GtkTreeIter *iter, const char *value) { + SwfeditTokenClass *klass; GtkTreeModel *model; SwfeditTokenEntry *entry; guint i; @@ -565,9 +726,38 @@ swfedit_token_set (SwfeditToken *token, if (converters[entry->type].free != NULL) converters[entry->type].free (entry->value); entry->value = new; + klass = SWFEDIT_TOKEN_GET_CLASS (token); + if (klass->changed) + klass->changed (token, i); path = gtk_tree_model_get_path (model, iter); gtk_tree_model_row_changed (model, path, iter); gtk_tree_path_free (path); } +void +swfedit_token_set_visible (SwfeditToken *token, guint i, gboolean visible) +{ + SwfeditTokenEntry *entry; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + + g_return_if_fail (SWFEDIT_IS_TOKEN (token)); + g_return_if_fail (i < token->tokens->len); + + entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); + if (entry->visible == visible) + return; + + entry->visible = visible; + iter.stamp = 0; /* FIXME */ + iter.user_data = token; + iter.user_data2 = GINT_TO_POINTER (i); + while (token->parent) + token = token->parent; + model = GTK_TREE_MODEL (token); + path = gtk_tree_model_get_path (model, &iter); + gtk_tree_model_row_changed (model, path, &iter); + gtk_tree_path_free (path); +} diff --git a/test/swfedit_token.h b/test/swfedit_token.h index 7909188..53c3b62 100644 --- a/test/swfedit_token.h +++ b/test/swfedit_token.h @@ -28,19 +28,25 @@ G_BEGIN_DECLS typedef enum { SWFEDIT_TOKEN_OBJECT, SWFEDIT_TOKEN_BINARY, + SWFEDIT_TOKEN_BIT, SWFEDIT_TOKEN_UINT8, SWFEDIT_TOKEN_UINT16, SWFEDIT_TOKEN_UINT32, + SWFEDIT_TOKEN_STRING, SWFEDIT_TOKEN_RECT, SWFEDIT_TOKEN_RGB, SWFEDIT_TOKEN_RGBA, + SWFEDIT_TOKEN_MATRIX, + SWFEDIT_TOKEN_CTRANS, + SWFEDIT_TOKEN_SCRIPT, SWFEDIT_N_TOKENS } SwfeditTokenType; typedef enum { SWFEDIT_COLUMN_NAME, SWFEDIT_COLUMN_VALUE_VISIBLE, - SWFEDIT_COLUMN_VALUE + SWFEDIT_COLUMN_VALUE, + SWFEDIT_COLUMN_VALUE_EDITABLE } SwfeditColumn; typedef struct _SwfeditTokenEntry SwfeditTokenEntry; @@ -59,6 +65,7 @@ struct _SwfeditTokenEntry { char * name; SwfeditTokenType type; gpointer value; + gboolean visible; }; struct _SwfeditToken { @@ -71,10 +78,15 @@ struct _SwfeditToken { struct _SwfeditTokenClass { GObjectClass object_class; + + void (* changed) (SwfeditToken * token, + guint id); }; GType swfedit_token_get_type (void); +gpointer swfedit_token_new_token (SwfeditTokenType type); + SwfeditToken * swfedit_token_new (void); void swfedit_token_add (SwfeditToken * token, const char * name, @@ -83,6 +95,9 @@ void swfedit_token_add (SwfeditToken * void swfedit_token_set (SwfeditToken * token, GtkTreeIter * iter, const char * value); +void swfedit_token_set_visible (SwfeditToken * token, + guint i, + gboolean visible); G_END_DECLS diff-tree 4a5112ee3285fd9cf3ba55bece78c2110c40cace (from parents) Merge: f7d6b3d314017ad0ffbd22cd559cf8204c7729cf f4932b1cc75a7e82fa6af103371579096454eb8e Author: Benjamin Otte <otte@gnome.org> Date: Mon Feb 12 10:17:16 2007 +0100 Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec diff-tree f7d6b3d314017ad0ffbd22cd559cf8204c7729cf (from e09255e66fe4990bd8531519ae20da81a4beb4f4) Author: Benjamin Otte <otte@gnome.org> Date: Fri Feb 9 14:28:38 2007 +0100 first simple and incomplete implementation of GetURL2 diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 74b9934..bf0fb07 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -1062,6 +1062,44 @@ swfdec_action_get_url (JSContext *cx, gu } static JSBool +swfdec_action_get_url2 (JSContext *cx, guint action, const guint8 *data, guint len) +{ + const char *target, *url; + guint method; + SwfdecMovie *movie; + + if (len != 1) { + SWFDEC_ERROR ("GetURL2 requires 1 byte of data, not %u", len); + return JS_FALSE; + } + target = swfdec_js_to_string (cx, cx->fp->sp[-1]); + url = swfdec_js_to_string (cx, cx->fp->sp[-2]); + if (target == NULL || url == NULL) + return JS_FALSE; + method = data[0] >> 6; + if (method == 3) { + SWFDEC_ERROR ("GetURL method 3 invalid"); + method = 0; + } + if (method) { + SWFDEC_ERROR ("FIXME: implement encoding variables using %s", method == 1 ? "GET" : "POST"); + } + if (data[0] & 2) { + SWFDEC_ERROR ("FIXME: implement LoadTarget"); + } + if (data[0] & 1) { + SWFDEC_ERROR ("FIXME: implement LoadVariables"); + } + 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"); + cx->fp->sp -= 2; + return JS_TRUE; +} + +static JSBool swfdec_action_string_add (JSContext *cx, guint action, const guint8 *data, guint len) { JSString *lval, *rval; @@ -1940,7 +1978,7 @@ static const SwfdecActionSpec actions[25 /* version 4 */ [0x96] = { "Push", swfdec_action_print_push, 0, -1, { NULL, swfdec_action_push, swfdec_action_push, swfdec_action_push, swfdec_action_push } }, [0x99] = { "Jump", swfdec_action_print_jump, 0, 0, { NULL, swfdec_action_jump, swfdec_action_jump, swfdec_action_jump, swfdec_action_jump } }, - [0x9a] = { "GetURL2", NULL }, + [0x9a] = { "GetURL2", NULL, 2, 0, { NULL, swfdec_action_get_url2, swfdec_action_get_url2, swfdec_action_get_url2, swfdec_action_get_url2 } }, /* version 5 */ [0x9b] = { "DefineFunction", swfdec_action_print_define_function, 0, -1, { NULL, NULL, swfdec_action_define_function, swfdec_action_define_function, swfdec_action_define_function } }, /* version 4 */ diff-tree e09255e66fe4990bd8531519ae20da81a4beb4f4 (from fa496c4d6ae5187e39c1b77cf7b13517be873a3c) Author: Benjamin Otte <otte@gnome.org> Date: Fri Feb 9 14:03:11 2007 +0100 use swfdec_bits_decompress contains various bugfixing diff --git a/libswfdec/swfdec_image.c b/libswfdec/swfdec_image.c index ab62969..0dee685 100644 --- a/libswfdec/swfdec_image.c +++ b/libswfdec/swfdec_image.c @@ -89,47 +89,6 @@ swfdec_image_init (SwfdecImage * image) { } - -static void * -zalloc (void *opaque, unsigned int items, unsigned int size) -{ - return g_malloc (items * size); -} - -static void -zfree (void *opaque, void *addr) -{ - g_free (addr); -} - -static guint8 * -lossless (const guint8 *zptr, int zlen, int len) -{ - guint8 *data; - z_stream z = { NULL, }; - int ret; - - z.zalloc = zalloc; - z.zfree = zfree; - z.opaque = NULL; - - data = g_malloc (len); - z.next_in = (Bytef *) zptr; - z.avail_in = zlen; - z.next_out = data; - z.avail_out = len; - - ret = inflateInit (&z); - ret = inflate (&z, Z_FINISH); - if (ret != Z_STREAM_END) { - SWFDEC_WARNING ("lossless: ret == %d", ret); - } - inflateEnd (&z); - - return data; -} - - int swfdec_image_jpegtables (SwfdecSwfDecoder * s) { @@ -267,7 +226,6 @@ static void swfdec_image_jpeg3_load (SwfdecImage *image) { JpegRGBDecoder *dec; - unsigned char *alpha_data; SwfdecBits bits; SwfdecBuffer *buffer; int jpeg_length; @@ -294,12 +252,13 @@ swfdec_image_jpeg3_load (SwfdecImage *im &image->rowstride, &image->width, &image->height); jpeg_rgb_decoder_free (dec); - buffer = swfdec_bits_get_buffer (&bits, -1); - alpha_data = lossless (buffer->data, buffer->length, image->width * image->height); - swfdec_buffer_unref (buffer); - - merge_alpha (image, image->data, alpha_data); - g_free (alpha_data); + buffer = swfdec_bits_decompress (&bits, -1, image->width * image->height); + if (buffer) { + merge_alpha (image, image->data, buffer->data); + swfdec_buffer_unref (buffer); + } else { + SWFDEC_WARNING ("cannot set alpha channel information, decompression failed"); + } SWFDEC_LOG (" width = %d", image->width); SWFDEC_LOG (" height = %d", image->height); @@ -355,6 +314,7 @@ swfdec_image_lossless_load (SwfdecImage swfdec_cached_load (SWFDEC_CACHED (image), 4 * image->width * image->height); if (format == 3) { + SwfdecBuffer *buffer; unsigned char *indexed_data; guint i; unsigned int rowstride = (image->width + 3) & ~3; @@ -363,8 +323,13 @@ swfdec_image_lossless_load (SwfdecImage image->rowstride = image->width * 4; if (have_alpha) { - ptr = lossless (bits.ptr, bits.end - bits.ptr, - color_table_size * 4 + rowstride * image->height); + buffer = swfdec_bits_decompress (&bits, -1, color_table_size * 4 + rowstride * image->height); + if (buffer == NULL) { + SWFDEC_ERROR ("failed to decompress data"); + memset (image->data, 0, 4 * image->width * image->height); + return; + } + ptr = buffer->data; for (i = 0; i < color_table_size; i++) { #if G_BYTE_ORDER == G_LITTLE_ENDIAN guint8 tmp = ptr[i * 4 + 0]; @@ -380,8 +345,13 @@ swfdec_image_lossless_load (SwfdecImage } indexed_data = ptr + color_table_size * 4; } else { - ptr = lossless (bits.ptr, bits.end - bits.ptr, - color_table_size * 3 + rowstride * image->height); + buffer = swfdec_bits_decompress (&bits, -1, color_table_size * 3 + rowstride * image->height); + if (buffer == NULL) { + SWFDEC_ERROR ("failed to decompress data"); + memset (image->data, 0, 4 * image->width * image->height); + return; + } + ptr = buffer->data; for (i = color_table_size - 1; i < color_table_size; i--) { guint8 color[3]; color[0] = ptr[i * 3 + 0]; @@ -404,27 +374,33 @@ swfdec_image_lossless_load (SwfdecImage swfdec_image_colormap_decode (image, image->data, indexed_data, ptr, color_table_size); - g_free (ptr); + swfdec_buffer_unref (buffer); } else if (format == 4) { int i, j; unsigned int c; unsigned char *idata; - guint8 *p; + SwfdecBuffer *buffer; if (have_alpha) { SWFDEC_INFO("16bit images aren't allowed to have alpha, ignoring"); have_alpha = FALSE; } - p = ptr = lossless (bits.ptr, bits.end - bits.ptr, 2 * image->width * image->height); + buffer = swfdec_bits_decompress (&bits, -1, 2 * ((image->width + 1) & ~1) * image->height); image->data = g_malloc (4 * image->width * image->height); idata = image->data; image->rowstride = image->width * 4; + if (buffer == NULL) { + SWFDEC_ERROR ("failed to decompress data"); + memset (image->data, 0, 4 * image->width * image->height); + return; + } + ptr = buffer->data; /* 15 bit packed */ for (j = 0; j < image->height; j++) { for (i = 0; i < image->width; i++) { - c = p[1] | (p[0] << 8); + c = ptr[1] | (ptr[0] << 8); idata[SWFDEC_COLOR_INDEX_BLUE] = (c << 3) | ((c >> 2) & 0x7); idata[SWFDEC_COLOR_INDEX_GREEN] = ((c >> 2) & 0xf8) | ((c >> 7) & 0x7); idata[SWFDEC_COLOR_INDEX_RED] = ((c >> 7) & 0xf8) | ((c >> 12) & 0x7); @@ -432,12 +408,22 @@ swfdec_image_lossless_load (SwfdecImage ptr += 2; idata += 4; } + if (image->width & 1) + ptr += 2; } - g_free (ptr); + swfdec_buffer_unref (buffer); } if (format == 5) { + SwfdecBuffer *buffer; int i, j; - ptr = image->data = lossless (bits.ptr, bits.end - bits.ptr, 4 * image->width * image->height); + buffer = swfdec_bits_decompress (&bits, -1, 4 * image->width * image->height); + image->rowstride = 4 * image->width; + if (buffer == NULL) { + SWFDEC_ERROR ("failed to decompress data"); + image->data = g_malloc0 (4 * image->width * image->height); + return; + } + ptr = image->data = buffer->data; /* image is stored in 0RGB format. We use ARGB/BGRA. */ for (j = 0; j < image->height; j++) { for (i = 0; i < image->width; i++) { @@ -445,6 +431,11 @@ swfdec_image_lossless_load (SwfdecImage ptr += 4; } } + /* FIXME: this can fail if the returned buffer does not contain malloc'd + * data at some point in the future */ + buffer->data = NULL; + buffer->length = 0; + swfdec_buffer_unref (buffer); } } diff-tree fa496c4d6ae5187e39c1b77cf7b13517be873a3c (from 34f26f78afcd7e08945729f409872fce624d9cef) Author: Benjamin Otte <otte@gnome.org> Date: Fri Feb 9 14:02:50 2007 +0100 use swfdec_bits_decompress instead of doing it manually diff --git a/libswfdec/swfdec_codec_screen.c b/libswfdec/swfdec_codec_screen.c index de21d21..0ba59f0 100644 --- a/libswfdec/swfdec_codec_screen.c +++ b/libswfdec/swfdec_codec_screen.c @@ -35,35 +35,13 @@ struct _SwfdecCodecScreen { guint width; /* width of last image */ guint height; /* height of last image */ SwfdecBuffer * buffer; /* buffer containing last decoded image */ - z_stream z; /* stream for decoding */ - SwfdecBuffer * block_buffer; /* buffer used for block decoding */ }; -static void * -zalloc (void *opaque, unsigned int items, unsigned int size) -{ - return g_malloc (items * size); -} - -static void -zfree (void *opaque, void *addr) -{ - g_free (addr); -} - static gpointer swfdec_codec_screen_init (void) { SwfdecCodecScreen *screen = g_new0 (SwfdecCodecScreen, 1); - screen->z.zalloc = zalloc; - screen->z.zfree = zfree; - screen->z.opaque = NULL; - if (inflateInit (&screen->z) != Z_OK) { - SWFDEC_ERROR ("Error initialising zlib: %s", screen->z.msg); - g_free (screen); - return NULL; - } return screen; } @@ -107,11 +85,6 @@ swfdec_codec_screen_decode (gpointer cod /* FIXME: this is was ffmpeg does, should we be more forgiving? */ return NULL; } - if (screen->block_buffer == NULL || screen->block_buffer->length < bw * bh * 3) { - if (screen->block_buffer != NULL) - swfdec_buffer_unref (screen->block_buffer); - screen->block_buffer = swfdec_buffer_new_and_alloc (bw * bh * 3); - } if (screen->buffer && screen->buffer->ref_count == 1) { g_assert (screen->buffer->length == w * h * 4); swfdec_buffer_ref (screen->buffer); @@ -130,49 +103,26 @@ swfdec_codec_screen_decode (gpointer cod SWFDEC_LOG ("size: %u x %u - block size %u x %u\n", w, h, bw, bh); for (j = 0; j < h; j += bh) { for (i = 0; i < w; i += bw) { - int result; guint x, y, size; + SwfdecBuffer *buffer; guint8 *in, *out; - /* decode the block into block_buffer */ size = swfdec_bits_get_bu16 (&bits); if (size == 0) continue; - if (inflateReset(&screen->z) != Z_OK) { - SWFDEC_ERROR ("error resetting zlib decoder: %s", screen->z.msg); - } - screen->z.next_in = (void *) bits.ptr; - if (swfdec_bits_skip_bytes (&bits, size) != size) { - SWFDEC_ERROR ("not enough bytes available"); - return NULL; - } - screen->z.avail_in = size; - screen->z.next_out = screen->block_buffer->data; - screen->z.avail_out = screen->block_buffer->length; - result = inflate (&screen->z, Z_FINISH); - if (result == Z_DATA_ERROR) { - inflateSync (&screen->z); - result = inflate (&screen->z, Z_FINISH); - } - if (result < 0) { - SWFDEC_WARNING ("error decoding block: %s", screen->z.msg); + buffer = swfdec_bits_decompress (&bits, size, bw * bh * 4); + if (buffer == NULL) { + SWFDEC_WARNING ("error decoding block"); continue; } /* convert format and write out data */ out = ret->data + stride * (h - j - 1) + i * 4; - in = screen->block_buffer->data; + in = buffer->data; for (y = 0; y < MIN (bh, h - j); y++) { for (x = 0; x < MIN (bw, w - i); x++) { -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - out[x * 4 - y * stride] = *in++; - out[x * 4 - y * stride + 1] = *in++; - out[x * 4 - y * stride + 2] = *in++; - out[x * 4 - y * stride + 3] = 0xFF; -#else - out[x * 4 - y * stride + 3] = *in++; - out[x * 4 - y * stride + 2] = *in++; - out[x * 4 - y * stride + 1] = *in++; - out[x * 4 - y * stride] = 0xFF; -#endif + out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_BLUE] = *in++; + out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_GREEN] = *in++; + out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_RED] = *in++; + out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_ALPHA] = 0xFF; } } } diff-tree 34f26f78afcd7e08945729f409872fce624d9cef (from bca06937c45d0d89271681e0dbd3a2fbeeaa9dd0) Author: Benjamin Otte <otte@gnome.org> Date: Fri Feb 9 14:02:27 2007 +0100 Add swfdec_bits_decompress for zlib decompression of data diff --git a/libswfdec/swfdec_bits.c b/libswfdec/swfdec_bits.c index 21172f2..6a9ed33 100644 --- a/libswfdec/swfdec_bits.c +++ b/libswfdec/swfdec_bits.c @@ -1,7 +1,7 @@ /* Swfdec * Copyright (C) 2003-2006 David Schleef <ds@schleef.org> * 2005-2006 Eric Anholt <eric@anholt.net> - * 2006 Benjamin Otte <otte@gnome.org> + * 2006-2007 Benjamin Otte <otte@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,6 +24,7 @@ #endif #include <string.h> +#include <zlib.h> #include "swfdec_bits.h" #include "swfdec_debug.h" @@ -600,3 +601,108 @@ swfdec_bits_get_buffer (SwfdecBits *bits bits->ptr += len; return buffer; } + +static void * +swfdec_bits_zalloc (void *opaque, unsigned int items, unsigned int size) +{ + return g_malloc (items * size); +} + +static void +swfdec_bits_zfree (void *opaque, void *addr) +{ + g_free (addr); +} + +/** + * swfdec_bits_decompress: + * @bits: a #SwfdecBits + * @compressed: number of bytes to decompress or -1 for the rest + * @decompressed: number of bytes to expect in the decompressed result or -1 + * if unknown + * + * Decompresses the next @compressed bytes of data in @bits using the zlib + * decompression algorithm and returns the result in a buffer. If @decompressed + * was set and not enough data is available, the return buffer will be filled + * up with 0 bytes. + * + * Returns: a new #SwfdecBuffer containing the decompressed data or NULL on + * failure. If @decompressed > 0, the buffer's length will be @decompressed. + **/ +SwfdecBuffer * +swfdec_bits_decompress (SwfdecBits *bits, int compressed, int decompressed) +{ + z_stream z = { 0, }; + SwfdecBuffer *buffer; + int result; + + g_return_val_if_fail (bits != NULL, NULL); + g_return_val_if_fail (compressed >= -1, NULL); + g_return_val_if_fail (decompressed > 0 || decompressed == -1, NULL); + + /* prepare the bits structure */ + if (compressed > 0) { + SWFDEC_BYTES_CHECK (bits, (unsigned int) compressed); + } else { + swfdec_bits_syncbits (bits); + compressed = bits->end - bits->ptr; + g_assert (compressed >= 0); + } + if (compressed == 0) + return NULL; + + z.zalloc = swfdec_bits_zalloc; + z.zfree = swfdec_bits_zfree; + z.opaque = NULL; + z.next_in = (Bytef *) bits->ptr; + z.avail_in = compressed; + result = inflateInit (&z); + if (result != Z_OK) { + SWFDEC_ERROR ("Error initialising zlib: %d %s", result, z.msg ? z.msg : ""); + goto fail; + } + buffer = swfdec_buffer_new_and_alloc (decompressed > 0 ? decompressed : compressed * 2); + z.next_out = buffer->data; + z.avail_out = buffer->length; + while (TRUE) { + result = inflate (&z, decompressed > 0 ? Z_FINISH : 0); + switch (result) { + case Z_STREAM_END: + goto out; + case Z_OK: + if (decompressed < 0) { + buffer->data = g_realloc (buffer->data, buffer->length + compressed); + buffer->length += compressed; + z.next_out = buffer->data + z.total_out; + z.avail_out = buffer->length - z.total_out; + goto out; + } + /* else fall through */ + default: + SWFDEC_ERROR ("error decompressing data: inflate returned %d %s", + result, z.msg ? z.msg : ""); + swfdec_buffer_unref (buffer); + goto fail; + } + } +out: + if (decompressed < 0) { + buffer->length = z.total_out; + } else { + if (buffer->length < z.total_out) { + SWFDEC_WARNING ("Not enough data decompressed: %lu instead of %u expected", + z.total_out, buffer->length); + memset (buffer->data + z.total_out, 0, buffer->length - z.total_out); + } + } + result = inflateEnd (&z); + if (result != Z_OK) { + SWFDEC_ERROR ("error in inflateEnd: %d %s", result, z.msg ? z.msg : ""); + } + bits->ptr += compressed; + return buffer; + +fail: + bits->ptr += compressed; + return NULL; +} diff --git a/libswfdec/swfdec_bits.h b/libswfdec/swfdec_bits.h index a44c9e2..0dd1dd9 100644 --- a/libswfdec/swfdec_bits.h +++ b/libswfdec/swfdec_bits.h @@ -1,7 +1,7 @@ /* Swfdec * Copyright (C) 2003-2006 David Schleef <ds@schleef.org> * 2005-2006 Eric Anholt <eric@anholt.net> - * 2006 Benjamin Otte <otte@gnome.org> + * 2006-2007 Benjamin Otte <otte@gnome.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -72,6 +72,8 @@ SwfdecGradient *swfdec_bits_get_gradient SwfdecGradient *swfdec_bits_get_morph_gradient (SwfdecBits * bits); void swfdec_bits_get_rect (SwfdecBits * bits, SwfdecRect *rect); SwfdecBuffer *swfdec_bits_get_buffer (SwfdecBits *bits, int len); +SwfdecBuffer *swfdec_bits_decompress (SwfdecBits *bits, int compressed, + int decompressed); #endif
Maybe Matching Threads
- 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
- 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
- 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
- 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
- Branch 'interpreter' - 8 commits - libswfdec/swfdec_bits.c libswfdec/swfdec_color.c libswfdec/swfdec_color.h libswfdec/swfdec_edittext.c libswfdec/swfdec_image.c libswfdec/swfdec_image.h libswfdec/swfdec_pattern.c libswfdec/swfdec_sprite.c test/dump.c