[Swfdec-commits] 4 commits - swfdec/swfdec_sprite_movie_as.c swfdec/swfdec_text_buffer.c swfdec/swfdec_text_buffer.h swfdec/swfdec_text_field_movie_as.c swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h swfdec/swfdec_text_field_movie_html.c swfdec/swfdec_text_format.c test/trace
Benjamin Otte
company at kemper.freedesktop.org
Mon Jul 14 15:23:25 PDT 2008
swfdec/swfdec_sprite_movie_as.c | 4
swfdec/swfdec_text_buffer.c | 216 +++++++----
swfdec/swfdec_text_buffer.h | 15
swfdec/swfdec_text_field_movie.c | 24 -
swfdec/swfdec_text_field_movie.h | 2
swfdec/swfdec_text_field_movie_as.c | 13
swfdec/swfdec_text_field_movie_html.c | 2
swfdec/swfdec_text_format.c | 2
test/trace/Makefile.am | 18
test/trace/attachMovie-height-5.swf |binary
test/trace/attachMovie-height-5.swf.trace | 2
test/trace/attachMovie-height-6.swf |binary
test/trace/attachMovie-height-6.swf.trace | 2
test/trace/attachMovie-height-7.swf |binary
test/trace/attachMovie-height-7.swf.trace | 2
test/trace/attachMovie-height-8.swf |binary
test/trace/attachMovie-height-8.swf.trace | 2
test/trace/attachMovie-height.xml | 115 +++++
test/trace/crash-0.7.2-TextField-replace-infloop-5.swf |binary
test/trace/crash-0.7.2-TextField-replace-infloop-5.swf.trace | 1
test/trace/crash-0.7.2-TextField-replace-infloop-6.swf |binary
test/trace/crash-0.7.2-TextField-replace-infloop-6.swf.trace | 1
test/trace/crash-0.7.2-TextField-replace-infloop-7.swf |binary
test/trace/crash-0.7.2-TextField-replace-infloop-7.swf.trace | 1
test/trace/crash-0.7.2-TextField-replace-infloop-8.swf |binary
test/trace/crash-0.7.2-TextField-replace-infloop-8.swf.trace | 1
test/trace/crash-0.7.2-TextField-replace-infloop.as | 15
27 files changed, 338 insertions(+), 100 deletions(-)
New commits:
commit b588574b97d5d2dc90487dc884a74321876b035b
Author: Benjamin Otte <otte at gnome.org>
Date: Mon Jul 14 21:29:52 2008 +0200
add test for the just fixed infinite loop
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index fe09431..e64034c 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -932,6 +932,15 @@ EXTRA_DIST = \
crash-0.7.1-uncompressed-half-samples-8.swf \
crash-0.7.1-uncompressed-half-samples-8.swf.trace \
crash-0.7.1-uncompressed-half-samples.xml \
+ crash-0.7.2-TextField-replace-infloop-5.swf \
+ crash-0.7.2-TextField-replace-infloop-5.swf.trace \
+ crash-0.7.2-TextField-replace-infloop-6.swf \
+ crash-0.7.2-TextField-replace-infloop-6.swf.trace \
+ crash-0.7.2-TextField-replace-infloop-7.swf \
+ crash-0.7.2-TextField-replace-infloop-7.swf.trace \
+ crash-0.7.2-TextField-replace-infloop-8.swf \
+ crash-0.7.2-TextField-replace-infloop-8.swf.trace \
+ crash-0.7.2-TextField-replace-infloop.as \
createEmptyMovieClip-events.sc \
createEmptyMovieClip-events.swf \
createEmptyMovieClip-events.swf.trace \
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf b/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf
new file mode 100644
index 0000000..df4140a
Binary files /dev/null and b/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf differ
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf.trace b/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf.trace
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/test/trace/crash-0.7.2-TextField-replace-infloop-5.swf.trace
@@ -0,0 +1 @@
+Hello World
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf b/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf
new file mode 100644
index 0000000..bbc3015
Binary files /dev/null and b/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf differ
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf.trace b/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf.trace
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/test/trace/crash-0.7.2-TextField-replace-infloop-6.swf.trace
@@ -0,0 +1 @@
+Hello World
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf b/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf
new file mode 100644
index 0000000..7d8673d
Binary files /dev/null and b/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf differ
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf.trace b/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf.trace
new file mode 100644
index 0000000..edc4ff5
--- /dev/null
+++ b/test/trace/crash-0.7.2-TextField-replace-infloop-7.swf.trace
@@ -0,0 +1 @@
+Yo, Hello a
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf b/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf
new file mode 100644
index 0000000..f886b69
Binary files /dev/null and b/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf differ
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf.trace b/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf.trace
new file mode 100644
index 0000000..edc4ff5
--- /dev/null
+++ b/test/trace/crash-0.7.2-TextField-replace-infloop-8.swf.trace
@@ -0,0 +1 @@
+Yo, Hello a
diff --git a/test/trace/crash-0.7.2-TextField-replace-infloop.as b/test/trace/crash-0.7.2-TextField-replace-infloop.as
new file mode 100644
index 0000000..8a62d40
--- /dev/null
+++ b/test/trace/crash-0.7.2-TextField-replace-infloop.as
@@ -0,0 +1,15 @@
+// makeswf -v 7 -s 200x150 -r 1 -o crash-0.7.2-TextField-replace-infloop.swf crash-0.7.2-TextField-replace-infloop.as
+
+var tf = new TextFormat ();
+tf.font = "Bitstream Vera Sans";
+
+createTextField ("t", 0, 0, 0, 50, 25);
+t.setNewTextFormat (tf);
+t.wordWrap = true;
+t.text = "Hello World";
+
+t.replaceText (6, 11, "a");
+t.replaceText (0, 0, "Yo, ");
+trace (t.text);
+
+getURL ("fscommand:quit", "");
commit 69500908005fd3ec881e6d52d696da37daf90737
Author: Benjamin Otte <otte at gnome.org>
Date: Mon Jul 14 21:26:56 2008 +0200
make text buffers attribute handling not suck
This fixes an infinite loop and lots of other behaviors that could likely
have caused crashes.
It also moves the default attributes from the TextFieldMovie to the TextBuffer
which makes them instant apply as they should be
diff --git a/swfdec/swfdec_text_buffer.c b/swfdec/swfdec_text_buffer.c
index 536b446..867725e 100644
--- a/swfdec/swfdec_text_buffer.c
+++ b/swfdec/swfdec_text_buffer.c
@@ -74,6 +74,7 @@ swfdec_text_buffer_dispose (GObject *object)
buffer->text = NULL;
}
g_sequence_free (buffer->attributes);
+ swfdec_text_attributes_reset (&buffer->default_attributes);
G_OBJECT_CLASS (swfdec_text_buffer_parent_class)->dispose (object);
}
@@ -94,11 +95,11 @@ swfdec_text_buffer_class_init (SwfdecTextBufferClass *klass)
}
static void
-swfdec_text_buffer_init (SwfdecTextBuffer *text)
+swfdec_text_buffer_init (SwfdecTextBuffer *buffer)
{
- text->text = g_string_new ("");
- text->attributes = g_sequence_new ((GDestroyNotify) swfdec_text_buffer_format_free);
- g_sequence_append (text->attributes, swfdec_text_buffer_format_new ());
+ buffer->text = g_string_new ("");
+ buffer->attributes = g_sequence_new ((GDestroyNotify) swfdec_text_buffer_format_free);
+ swfdec_text_attributes_reset (&buffer->default_attributes);
}
SwfdecTextBuffer *
@@ -147,42 +148,33 @@ swfdec_text_buffer_get_iter_for_pos (SwfdecTextBuffer *buffer, guint pos)
return iter;
}
-void
-swfdec_text_buffer_insert_text (SwfdecTextBuffer *buffer,
- gsize pos, const char *text)
+#ifdef G_DISABLE_ASSERT
+#define CHECK_ATTRIBUTES(x)
+#else
+static void
+CHECK_ATTRIBUTES (SwfdecTextBuffer *buffer)
{
- gsize len;
+ guint last;
GSequenceIter *iter;
SwfdecTextBufferFormat *format;
- g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
- g_return_if_fail (pos <= buffer->text->len);
- g_return_if_fail (text != NULL);
-
- len = strlen (text);
- if (len == 0)
+ iter = g_sequence_get_begin_iter (buffer->attributes);
+ if (g_sequence_iter_is_end (iter)) {
+ g_assert (buffer->text->len == 0);
return;
- g_string_insert_len (buffer->text, pos, text, len);
- iter = g_sequence_get_end_iter (buffer->attributes);
- for (;;) {
- iter = g_sequence_iter_prev (iter);
+ }
+ format = g_sequence_get (iter);
+ g_assert (format->start == 0);
+ g_assert (buffer->text->len > 0);
+ last = 0;
+ for (iter = g_sequence_iter_next (iter); !g_sequence_iter_is_end (iter); iter = g_sequence_iter_next (iter)) {
format = g_sequence_get (iter);
- if (format->start <= pos)
- break;
- format->start += len;
+ g_assert (format->start > last);
+ g_assert (format->start < buffer->text->len);
+ last = format->start;
}
-
- /* adapt cursor */
- if (buffer->cursor_start >= pos)
- buffer->cursor_start += len;
- if (buffer->cursor_end >= pos)
- buffer->cursor_end += len;
-
- g_signal_emit (buffer, signals[TEXT_CHANGED], 0);
- g_signal_emit (buffer, signals[CURSOR_CHANGED], 0,
- (gulong) MIN (buffer->cursor_start, buffer->cursor_end),
- (gulong) MAX (buffer->cursor_start, buffer->cursor_end));
}
+#endif
/* removes duplicates in the range [iter, end) */
static void
@@ -206,6 +198,55 @@ swfdec_text_buffer_remove_duplicates (GSequenceIter *iter, GSequenceIter *end)
}
void
+swfdec_text_buffer_insert_text (SwfdecTextBuffer *buffer,
+ gsize pos, const char *text)
+{
+ gsize len;
+ GSequenceIter *iter;
+ SwfdecTextBufferFormat *format;
+
+ g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
+ g_return_if_fail (pos <= buffer->text->len);
+ g_return_if_fail (text != NULL);
+
+ len = strlen (text);
+ if (len == 0)
+ return;
+ if (pos == buffer->text->len) {
+ g_string_insert_len (buffer->text, pos, text, len);
+ format = swfdec_text_buffer_format_new ();
+ format->start = pos;
+ swfdec_text_attributes_copy (&format->attr,
+ &buffer->default_attributes, SWFDEC_TEXT_ATTRIBUTES_MASK);
+ iter = g_sequence_append (buffer->attributes, format);
+ swfdec_text_buffer_remove_duplicates (g_sequence_iter_prev (iter),
+ g_sequence_iter_next (iter));
+ } else {
+ g_string_insert_len (buffer->text, pos, text, len);
+ iter = g_sequence_get_end_iter (buffer->attributes);
+ for (;;) {
+ iter = g_sequence_iter_prev (iter);
+ format = g_sequence_get (iter);
+ if (format->start <= pos)
+ break;
+ format->start += len;
+ }
+ }
+ CHECK_ATTRIBUTES (buffer);
+
+ /* adapt cursor */
+ if (buffer->cursor_start >= pos)
+ buffer->cursor_start += len;
+ if (buffer->cursor_end >= pos)
+ buffer->cursor_end += len;
+
+ g_signal_emit (buffer, signals[TEXT_CHANGED], 0);
+ g_signal_emit (buffer, signals[CURSOR_CHANGED], 0,
+ (gulong) MIN (buffer->cursor_start, buffer->cursor_end),
+ (gulong) MAX (buffer->cursor_start, buffer->cursor_end));
+}
+
+void
swfdec_text_buffer_delete_text (SwfdecTextBuffer *buffer,
gsize pos, gsize length)
{
@@ -219,23 +260,25 @@ swfdec_text_buffer_delete_text (SwfdecTextBuffer *buffer,
g_string_erase (buffer->text, pos, length);
end = pos + length;
- iter = g_sequence_get_end_iter (buffer->attributes);
- for (;;) {
- iter = g_sequence_iter_prev (iter);
+ prev = NULL;
+ for (iter = swfdec_text_buffer_get_iter_for_pos (buffer, pos);
+ !g_sequence_iter_is_end (iter);
+ iter = g_sequence_iter_next (iter)) {
format = g_sequence_get (iter);
- if (format->start <= end) {
- format->start = pos;
- break;
+ if (format->start < pos)
+ continue;
+ if (format->start > end) {
+ format->start -= length;
+ continue;
}
- format->start -= length;
+ if (prev)
+ g_sequence_remove (prev);
+ format->start = pos;
+ prev = iter;
}
- while (!g_sequence_iter_is_begin (iter)) {
- prev = g_sequence_iter_prev (iter);
- format = g_sequence_get (prev);
- if (format->start < pos)
- break;
+ if (prev && pos == buffer->text->len)
g_sequence_remove (prev);
- }
+ CHECK_ATTRIBUTES (buffer);
/* adapt cursor */
if (buffer->cursor_start > end)
@@ -278,6 +321,9 @@ swfdec_text_buffer_get_attributes (SwfdecTextBuffer *buffer, gsize pos)
g_return_val_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer), NULL);
g_return_val_if_fail (pos <= buffer->text->len, NULL);
+ if (pos == buffer->text->len)
+ return &buffer->default_attributes;
+
iter = swfdec_text_buffer_get_iter_for_pos (buffer, pos);
format = g_sequence_get (iter);
return &format->attr;
@@ -295,6 +341,9 @@ swfdec_text_buffer_get_unique (SwfdecTextBuffer *buffer,
g_return_val_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer), 0);
g_return_val_if_fail (start + length <= buffer->text->len, 0);
+ if (start == buffer->text->len)
+ return result;
+
end = start + length;
iter = swfdec_text_buffer_get_iter_for_pos (buffer, start);
format = g_sequence_get (iter);
@@ -327,49 +376,73 @@ swfdec_text_buffer_set_attributes (SwfdecTextBuffer *buffer, gsize start,
gsize length, const SwfdecTextAttributes *attr, guint mask)
{
SwfdecTextBufferFormat *format;
- GSequenceIter *start_iter, *iter;
+ GSequenceIter *start_iter, *iter, *end_iter;
gsize end;
- gboolean need_new_format, last;
g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
g_return_if_fail (start + length <= buffer->text->len);
- g_return_if_fail (length > 0 || start == buffer->text->len);
+ g_return_if_fail (length > 0);
g_return_if_fail (attr != NULL);
g_return_if_fail (mask != 0);
+ /* ensure start and end position have an attribtues entry. If not, create one */
end = start + length;
start_iter = swfdec_text_buffer_get_iter_for_pos (buffer, start);
format = g_sequence_get (start_iter);
if (format->start < start) {
- iter = swfdec_text_buffer_copy_format (buffer, start_iter, start);
+ start_iter = swfdec_text_buffer_copy_format (buffer, start_iter, start);
+ }
+ if (end == buffer->text->len) {
+ end_iter = g_sequence_get_end_iter (buffer->attributes);
} else {
- iter = start_iter;
+ end_iter = swfdec_text_buffer_get_iter_for_pos (buffer, end);
+ format = g_sequence_get (end_iter);
+ if (format->start < end) {
+ end_iter = swfdec_text_buffer_copy_format (buffer, end_iter, end);
+ }
}
- last = FALSE;
- for (;;) {
+ /* start_iter points to first item to modify, end_iter points after last item to modify */
+
+ /* modify all formats in range [start_iter, end_iter) */
+ for (iter = start_iter; iter != end_iter; iter = g_sequence_iter_next (iter)) {
format = g_sequence_get (iter);
- iter = g_sequence_iter_next (iter);
- if (g_sequence_iter_is_end (iter)) {
- need_new_format = end < buffer->text->len;
- last = TRUE;
- } else {
- SwfdecTextBufferFormat *next = g_sequence_get (iter);
- need_new_format = next->start > end;
- last = next->start >= end;
- }
- if (last)
- break;
swfdec_text_attributes_copy (&format->attr, attr, mask);
}
- if (need_new_format) {
- swfdec_text_buffer_copy_format (buffer, g_sequence_iter_prev (iter), end);
- }
- swfdec_text_attributes_copy (&format->attr, attr, mask);
- swfdec_text_buffer_remove_duplicates (start_iter, iter);
+
+ /* remove entries that are identical now */
+ swfdec_text_buffer_remove_duplicates (g_sequence_iter_prev (start_iter),
+ g_sequence_iter_next (end_iter));
+ CHECK_ATTRIBUTES (buffer);
g_signal_emit (buffer, signals[TEXT_CHANGED], 0);
}
+const SwfdecTextAttributes *
+swfdec_text_buffer_get_default_attributes (SwfdecTextBuffer *buffer)
+{
+ g_return_val_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer), NULL);
+
+ return &buffer->default_attributes;
+}
+
+void
+swfdec_text_buffer_set_default_attributes (SwfdecTextBuffer *buffer,
+ const SwfdecTextAttributes *attr, guint mask)
+{
+ g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
+ g_return_if_fail (attr != NULL);
+
+ swfdec_text_attributes_copy (&buffer->default_attributes, attr, mask);
+}
+
+void
+swfdec_text_buffer_reset_default_attributes (SwfdecTextBuffer *buffer)
+{
+ g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
+
+ swfdec_text_attributes_reset (&buffer->default_attributes);
+}
+
/*** ITERATOR ***/
SwfdecTextBufferIter *
@@ -378,6 +451,9 @@ swfdec_text_buffer_get_iter (SwfdecTextBuffer *buffer, gsize pos)
g_return_val_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer), NULL);
g_return_val_if_fail (pos <= buffer->text->len, NULL);
+ if (pos == buffer->text->len)
+ return NULL;
+
return swfdec_text_buffer_get_iter_for_pos (buffer, pos);
}
@@ -397,7 +473,9 @@ swfdec_text_buffer_iter_get_attributes (SwfdecTextBuffer *buffer, SwfdecTextBuff
SwfdecTextBufferFormat *format;
g_return_val_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer), NULL);
- g_return_val_if_fail (iter != NULL, NULL);
+
+ if (iter == NULL)
+ return &buffer->default_attributes;
format = g_sequence_get (iter);
return &format->attr;
diff --git a/swfdec/swfdec_text_buffer.h b/swfdec/swfdec_text_buffer.h
index 6dc661b..604fe96 100644
--- a/swfdec/swfdec_text_buffer.h
+++ b/swfdec/swfdec_text_buffer.h
@@ -40,11 +40,12 @@ struct _SwfdecTextBuffer
{
GObject object;
- GString * text; /* the text in this buffer */
- GSequence * attributes; /* the attributes that apply to this text */
+ GString * text; /* the text in this buffer */
+ GSequence * attributes; /* the attributes that apply to this text */
+ SwfdecTextAttributes default_attributes; /* the attributes applied to new text */
- gsize cursor_start; /* byte offset into text for start of cursor */
- gsize cursor_end; /* if some text is selected smaller or bigger */
+ gsize cursor_start; /* byte offset into text for start of cursor */
+ gsize cursor_end; /* if some text is selected smaller or bigger */
};
struct _SwfdecTextBufferClass
@@ -79,6 +80,12 @@ void swfdec_text_buffer_set_attributes (SwfdecTextBuffer * buffer,
guint swfdec_text_buffer_get_unique (SwfdecTextBuffer * buffer,
gsize start,
gsize length);
+const SwfdecTextAttributes *
+ swfdec_text_buffer_get_default_attributes(SwfdecTextBuffer * buffer);
+void swfdec_text_buffer_set_default_attributes(SwfdecTextBuffer * buffer,
+ const SwfdecTextAttributes *attr,
+ guint mask);
+void swfdec_text_buffer_reset_default_attributes(SwfdecTextBuffer * buffer);
SwfdecTextBufferIter * swfdec_text_buffer_get_iter (SwfdecTextBuffer * buffer,
gsize pos);
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index f239ccd..f0cc3f0 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -286,8 +286,6 @@ swfdec_text_field_movie_dispose (GObject *object)
text = SWFDEC_TEXT_FIELD_MOVIE (object);
- swfdec_text_attributes_reset (&text->default_attributes);
-
if (text->style_sheet) {
if (SWFDEC_IS_STYLESHEET (text->style_sheet)) {
g_signal_handlers_disconnect_matched (text->style_sheet,
@@ -424,17 +422,17 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
text->background_color = SWFDEC_COLOR_COMBINE (255, 255, 255, 0);
if (text_field) {
- text->default_attributes.color = text_field->color;
- text->default_attributes.align = text_field->align;
+ text->text->default_attributes.color = text_field->color;
+ text->text->default_attributes.align = text_field->align;
if (text_field->font != NULL) {
- text->default_attributes.font =
+ text->text->default_attributes.font =
swfdec_as_context_get_string (cx, text_field->font);
}
- text->default_attributes.size = text_field->size / 20;
- text->default_attributes.left_margin = text_field->left_margin / 20;
- text->default_attributes.right_margin = text_field->right_margin / 20;
- text->default_attributes.indent = text_field->indent / 20;
- text->default_attributes.leading = text_field->leading / 20;
+ text->text->default_attributes.size = text_field->size / 20;
+ text->text->default_attributes.left_margin = text_field->left_margin / 20;
+ text->text->default_attributes.right_margin = text_field->right_margin / 20;
+ text->text->default_attributes.indent = text_field->indent / 20;
+ text->text->default_attributes.leading = text_field->leading / 20;
}
// text
@@ -912,8 +910,6 @@ swfdec_text_field_movie_init (SwfdecTextFieldMovie *text)
text->mouse_wheel_enabled = TRUE;
text->character_pressed = -1;
-
- swfdec_text_attributes_reset (&text->default_attributes);
}
static void
@@ -1114,13 +1110,11 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
/* Flash 7 resets to default style here */
if (html && SWFDEC_AS_OBJECT (text)->context->version < 8)
- swfdec_text_attributes_reset (&text->default_attributes);
+ swfdec_text_buffer_reset_default_attributes (text->text);
length = swfdec_text_buffer_get_length (text->text);
if (length)
swfdec_text_buffer_delete_text (text->text, 0, length);
- swfdec_text_buffer_set_attributes (text->text, 0, 0, &text->default_attributes,
- SWFDEC_TEXT_ATTRIBUTES_MASK);
if (SWFDEC_AS_OBJECT (text)->context->version >= 7 &&
text->style_sheet != NULL)
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index dd1b65b..a5740c1 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -73,8 +73,6 @@ struct _SwfdecTextFieldMovie {
const char * variable;
- SwfdecTextAttributes default_attributes;
-
gboolean condense_white;
SwfdecAsObject * style_sheet;
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 24a6061..3ec30fa 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -941,7 +941,8 @@ swfdec_text_field_movie_get_textColor (SwfdecAsContext *cx,
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
- SWFDEC_AS_VALUE_SET_NUMBER (ret, text->default_attributes.color);
+ SWFDEC_AS_VALUE_SET_NUMBER (ret,
+ swfdec_text_buffer_get_default_attributes (text->text)->color);
}
// This doesn't work the same way as TextFormat's color setting
@@ -955,7 +956,8 @@ swfdec_text_field_movie_set_textColor (SwfdecAsContext *cx,
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
- text->default_attributes.color = swfdec_text_field_movie_int_to_color (cx, value);
+ /* FIXME: don't access private variables, you lazy hacker! */
+ text->text->default_attributes.color = swfdec_text_field_movie_int_to_color (cx, value);
}
SWFDEC_AS_NATIVE (104, 300, swfdec_text_field_movie_get_gridFitType)
@@ -1066,7 +1068,8 @@ swfdec_text_field_movie_getNewTextFormat (SwfdecAsContext *cx,
if (format == NULL)
return;
- swfdec_text_attributes_copy (&format->attr, &text->default_attributes,
+ swfdec_text_attributes_copy (&format->attr,
+ swfdec_text_buffer_get_default_attributes (text->text),
SWFDEC_TEXT_ATTRIBUTES_MASK);
format->values_set = SWFDEC_TEXT_ATTRIBUTES_MASK;
@@ -1087,8 +1090,8 @@ swfdec_text_field_movie_setNewTextFormat (SwfdecAsContext *cx,
if (!SWFDEC_IS_TEXT_FORMAT (format))
return;
- swfdec_text_attributes_copy (&text->default_attributes, &format->attr,
- format->values_set);
+ swfdec_text_buffer_set_default_attributes (text->text,
+ &format->attr, format->values_set);
}
SWFDEC_AS_NATIVE (104, 102, swfdec_text_field_movie_setTextFormat)
diff --git a/swfdec/swfdec_text_field_movie_html.c b/swfdec/swfdec_text_field_movie_html.c
index d0bb819..e882493 100644
--- a/swfdec/swfdec_text_field_movie_html.c
+++ b/swfdec/swfdec_text_field_movie_html.c
@@ -522,7 +522,7 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
// close remaining tags
while (data.tags_open != NULL) {
/* yes, this really appends to the default format */
- swfdec_text_attributes_copy (&text->default_attributes,
+ swfdec_text_buffer_set_default_attributes (text->text,
&((ParserTag *)data.tags_open->data)->format->attr,
((ParserTag *)data.tags_open->data)->format->values_set);
swfdec_text_field_movie_html_parse_close_tag (&data,
diff --git a/swfdec/swfdec_text_format.c b/swfdec/swfdec_text_format.c
index 0126683..1971c72 100644
--- a/swfdec/swfdec_text_format.c
+++ b/swfdec/swfdec_text_format.c
@@ -821,7 +821,7 @@ swfdec_text_format_getTextExtent (SwfdecAsContext *cx, SwfdecAsObject *object,
return;
buffer = swfdec_text_buffer_new ();
- swfdec_text_buffer_set_attributes (buffer, 0, 0,
+ swfdec_text_buffer_set_default_attributes (buffer,
&format->attr, format->values_set);
swfdec_text_buffer_append_text (buffer, text);
layout = swfdec_text_layout_new (buffer);
commit aecfafcf35af62bb48ee8f661c6f9e2555e3351f
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jul 12 04:44:17 2008 +0300
add test for last fix
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index a4beb40..fe09431 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -362,6 +362,15 @@ EXTRA_DIST = \
atan2-8.swf \
atan2-8.swf.trace \
atan2.as \
+ attachMovie-height-5.swf \
+ attachMovie-height-5.swf.trace \
+ attachMovie-height-6.swf \
+ attachMovie-height-6.swf.trace \
+ attachMovie-height-7.swf \
+ attachMovie-height-7.swf.trace \
+ attachMovie-height-8.swf \
+ attachMovie-height-8.swf.trace \
+ attachMovie-height.xml \
attachmovie-object.c \
attachmovie-object-5.swf \
attachmovie-object-5.swf.trace \
diff --git a/test/trace/attachMovie-height-5.swf b/test/trace/attachMovie-height-5.swf
new file mode 100644
index 0000000..6ceed87
Binary files /dev/null and b/test/trace/attachMovie-height-5.swf differ
diff --git a/test/trace/attachMovie-height-5.swf.trace b/test/trace/attachMovie-height-5.swf.trace
new file mode 100644
index 0000000..aa47d0d
--- /dev/null
+++ b/test/trace/attachMovie-height-5.swf.trace
@@ -0,0 +1,2 @@
+0
+0
diff --git a/test/trace/attachMovie-height-6.swf b/test/trace/attachMovie-height-6.swf
new file mode 100644
index 0000000..9393dbe
Binary files /dev/null and b/test/trace/attachMovie-height-6.swf differ
diff --git a/test/trace/attachMovie-height-6.swf.trace b/test/trace/attachMovie-height-6.swf.trace
new file mode 100644
index 0000000..aa47d0d
--- /dev/null
+++ b/test/trace/attachMovie-height-6.swf.trace
@@ -0,0 +1,2 @@
+0
+0
diff --git a/test/trace/attachMovie-height-7.swf b/test/trace/attachMovie-height-7.swf
new file mode 100644
index 0000000..24104ee
Binary files /dev/null and b/test/trace/attachMovie-height-7.swf differ
diff --git a/test/trace/attachMovie-height-7.swf.trace b/test/trace/attachMovie-height-7.swf.trace
new file mode 100644
index 0000000..6dd0672
--- /dev/null
+++ b/test/trace/attachMovie-height-7.swf.trace
@@ -0,0 +1,2 @@
+200
+150
diff --git a/test/trace/attachMovie-height-8.swf b/test/trace/attachMovie-height-8.swf
new file mode 100644
index 0000000..a94940a
Binary files /dev/null and b/test/trace/attachMovie-height-8.swf differ
diff --git a/test/trace/attachMovie-height-8.swf.trace b/test/trace/attachMovie-height-8.swf.trace
new file mode 100644
index 0000000..6dd0672
--- /dev/null
+++ b/test/trace/attachMovie-height-8.swf.trace
@@ -0,0 +1,2 @@
+200
+150
diff --git a/test/trace/attachMovie-height.xml b/test/trace/attachMovie-height.xml
new file mode 100644
index 0000000..7a5b217
--- /dev/null
+++ b/test/trace/attachMovie-height.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<swf version="7" compressed="1">
+ <Header framerate="25" frames="2">
+ <size>
+ <Rectangle left="0" right="4000" top="0" bottom="3000"/>
+ </size>
+ <tags>
+ <DefineBitsJPEG2 objectID="1">
+ <data>
+ <data>/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAKAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAACwn/xAAaEAACAgMAAAAAAAAAAAAAAAAABwgKOXi4/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJ+Uqcpr80AafRUVRPsMEpU5TX5oA0+ioqifYH//2Q==</data>
+ </data>
+ </DefineBitsJPEG2>
+ <DefineShape objectID="2">
+ <bounds>
+ <Rectangle left="0" right="2000" top="0" bottom="2000"/>
+ </bounds>
+ <styles>
+ <StyleList>
+ <fillStyles>
+ <TiledBitmap objectID="1" />
+ </fillStyles>
+ <lineStyles/>
+ </StyleList>
+ </styles>
+ <shapes>
+ <Shape>
+ <edges>
+ <ShapeSetup x="0" y="0" fillStyle0="1"/>
+ <LineTo x="0" y="2000"/>
+ <LineTo x="2000" y="0"/>
+ <LineTo x="0" y="-2000"/>
+ <LineTo x="-2000" y="0"/>
+ <ShapeSetup/>
+ </edges>
+ </Shape>
+ </shapes>
+ </DefineShape>
+ <DefineSprite objectID="3" frames="1">
+ <tags>
+ <PlaceObject2 replace="0" depth="0" objectID="2"/>
+ <ShowFrame/>
+ <End/>
+ </tags>
+ </DefineSprite>
+ <Export>
+ <symbols>
+ <Symbol objectID="3" name="image"/>
+ </symbols>
+ </Export>
+ <DoAction>
+ <actions>
+ <Dictionary>
+ <strings>
+ <String value="image"/>
+ <String value="_width"/>
+ <String value="_height"/>
+ <String value="attachMovie"/>
+ </strings>
+ </Dictionary>
+ <PushData>
+ <items>
+ <StackDictionaryLookup index="1"/>
+ <StackInteger value="200"/>
+ <StackDictionaryLookup index="2"/>
+ <StackInteger value="150"/>
+ <StackInteger value="2"/>
+ </items>
+ </PushData>
+ <DeclareObject/>
+ <PushData>
+ <items>
+ <StackInteger value="0"/>
+ <StackDictionaryLookup index="0"/>
+ <StackDictionaryLookup index="0"/>
+ <StackInteger value="4"/>
+ <StackDictionaryLookup index="3"/>
+ </items>
+ </PushData>
+ <CallFunction/>
+ <Pop/>
+ <PushData>
+ <items>
+ <StackDictionaryLookup index="0"/>
+ </items>
+ </PushData>
+ <GetVariable/>
+ <PushData>
+ <items>
+ <StackDictionaryLookup index="1"/>
+ </items>
+ </PushData>
+ <GetMember/>
+ <Trace/>
+ <PushData>
+ <items>
+ <StackDictionaryLookup index="0"/>
+ </items>
+ </PushData>
+ <GetVariable/>
+ <PushData>
+ <items>
+ <StackDictionaryLookup index="2"/>
+ </items>
+ </PushData>
+ <GetMember/>
+ <Trace/>
+ <GetURL url="fscommand:quit" target=""/>
+ <EndAction/>
+ </actions>
+ </DoAction>
+ <ShowFrame/>
+ <End/>
+ </tags>
+ </Header>
+</swf>
commit ca19a6f576e12e8365b56e99b968e2f31061c934
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Jul 9 13:23:35 2008 +0300
initialize movie before setting initObject properties
This ensures setting _width or _height does not fail
diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index b7e7b27..df864d3 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -710,6 +710,7 @@ swfdec_sprite_movie_init_from_object (SwfdecMovie *movie,
g_return_if_fail (SWFDEC_IS_MOVIE (movie));
g_return_if_fail (initObject == NULL || SWFDEC_IS_AS_OBJECT (initObject));
+ swfdec_movie_initialize (movie);
if (initObject != NULL) {
swfdec_as_object_foreach (initObject,
swfdec_sprite_movie_foreach_copy_properties, SWFDEC_AS_OBJECT (movie));
@@ -721,11 +722,8 @@ swfdec_sprite_movie_init_from_object (SwfdecMovie *movie,
swfdec_actor_queue_script (actor, SWFDEC_EVENT_INITIALIZE);
swfdec_actor_queue_script (actor, SWFDEC_EVENT_LOAD);
swfdec_sandbox_unuse (sandbox);
- swfdec_movie_initialize (movie);
swfdec_actor_execute (actor, SWFDEC_EVENT_CONSTRUCT, 0);
swfdec_sandbox_use (sandbox);
- } else {
- swfdec_movie_initialize (movie);
}
}
More information about the Swfdec-commits
mailing list