Benjamin Otte
2007-Aug-22 19:22 UTC
[Swfdec] 8 commits - libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_sprite_movie_as.c vivified/core
libswfdec/swfdec_movie.c | 91 ++++++++++++++++++++++++++++++------ libswfdec/swfdec_movie.h | 7 ++ libswfdec/swfdec_player.c | 57 ++++++++++++++++------ libswfdec/swfdec_player_internal.h | 12 +++- libswfdec/swfdec_sprite_movie_as.c | 75 +++++++---------------------- vivified/core/vivi_application.c | 37 ++++++-------- vivified/core/vivi_application.h | 1 vivified/core/vivi_application_as.c | 2 8 files changed, 169 insertions(+), 113 deletions(-) New commits: diff-tree 10d4cc43986ce88bb43cb7bf96712846c962ed86 (from d752275f3f23d91ea0e3e7aa03fadce6ae8bef34) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 21:14:55 2007 +0200 make swfdec_movie_mouse_in() check children This makes kittencannon work diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index eb1e2e5..ca76cc5 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -480,11 +480,22 @@ gboolean swfdec_movie_mouse_in (SwfdecMovie *movie, double x, double y) { SwfdecMovieClass *klass; + GList *walk; klass = SWFDEC_MOVIE_GET_CLASS (movie); - if (klass->mouse_in == NULL) - return FALSE; - return klass->mouse_in (movie, x, y); + if (klass->mouse_in != NULL && + klass->mouse_in (movie, x, y)) + return TRUE; + + for (walk = movie->list; walk; walk = walk->next) { + double tmp_x = x; + double tmp_y = y; + SwfdecMovie *cur = walk->data; + cairo_matrix_transform_point (&cur->inverse_matrix, &tmp_x, &tmp_y); + if (swfdec_movie_mouse_in (cur, tmp_x, tmp_y)) + return TRUE; + } + return FALSE; } void diff-tree d752275f3f23d91ea0e3e7aa03fadce6ae8bef34 (from ef1ab031ce43c3cc300ebdc2150f0959dc0efc92) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 21:09:51 2007 +0200 implement hitTest in a much nicer form diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 0722f4c..2a39cb0 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -160,9 +160,8 @@ swfdec_sprite_movie_hitTest (SwfdecAsCon SwfdecMovie *movie = SWFDEC_MOVIE (obj); if (argc == 1) { - SwfdecMovie *other, *tmp; + SwfdecMovie *other; SwfdecRect movie_rect, other_rect; - guint movie_depth, other_depth; if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]) || !SWFDEC_IS_MOVIE (other = (SwfdecMovie *) SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]))) { SWFDEC_ERROR ("FIXME: what happens now?"); @@ -170,70 +169,29 @@ swfdec_sprite_movie_hitTest (SwfdecAsCon } swfdec_movie_update (movie); swfdec_movie_update (other); - if (movie->parent != other->parent) { - movie_rect = movie->original_extents; - other_rect = other->original_extents; - swfdec_movie_update (other); - tmp = movie; - for (movie_depth = 0; tmp->parent; movie_depth++) - tmp = tmp->parent; - tmp = other; - for (other_depth = 0; tmp->parent; other_depth++) - tmp = tmp->parent; - while (movie_depth > other_depth) { - swfdec_rect_transform (&movie_rect, &movie_rect, &movie->matrix); - movie = movie->parent; - movie_depth--; - } - while (other_depth > movie_depth) { - swfdec_rect_transform (&other_rect, &other_rect, &other->matrix); - other = other->parent; - other_depth--; - } - while (other != movie && other->parent) { - swfdec_rect_transform (&movie_rect, &movie_rect, &movie->matrix); - movie = movie->parent; - swfdec_rect_transform (&other_rect, &other_rect, &other->matrix); - other = other->parent; - } - } else { - movie_rect = movie->extents; - other_rect = other->extents; - } -#if 0 - g_print ("%g %g %g %g --- %g %g %g %g\n", - SWFDEC_OBJECT (movie)->extents.x0, SWFDEC_OBJECT (movie)->extents.y0, - SWFDEC_OBJECT (movie)->extents.x1, SWFDEC_OBJECT (movie)->extents.y1, - SWFDEC_OBJECT (other)->extents.x0, SWFDEC_OBJECT (other)->extents.y0, - SWFDEC_OBJECT (other)->extents.x1, SWFDEC_OBJECT (other)->extents.y1); -#endif + movie_rect = movie->extents; + if (movie->parent) + swfdec_movie_rect_local_to_global (movie->parent, &movie_rect); + other_rect = other->extents; + if (other->parent) + swfdec_movie_rect_local_to_global (other->parent, &other_rect); SWFDEC_AS_VALUE_SET_BOOLEAN (rval, swfdec_rect_intersect (NULL, &movie_rect, &other_rect)); } else if (argc >= 2) { - SwfdecRect movie_rect; double x, y; + gboolean shape, ret; - x = swfdec_as_value_to_number (cx, &argv[0]); - y = swfdec_as_value_to_number (cx, &argv[1]); + x = swfdec_as_value_to_number (cx, &argv[0]) * SWFDEC_TWIPS_SCALE_FACTOR; + y = swfdec_as_value_to_number (cx, &argv[1]) * SWFDEC_TWIPS_SCALE_FACTOR; + shape = (argc >= 3 && swfdec_as_value_to_boolean (cx, &argv[2])); - if (argc >= 3) { - if (swfdec_as_value_to_boolean (cx, &argv[2])) { - SWFDEC_FIXME ("hitTest's shapeFlag parameter not supported"); - // just continue... - } - } + swfdec_movie_global_to_local (movie, &x, &y); - swfdec_movie_update (movie); - movie_rect = movie->original_extents; - while (movie->parent) { - swfdec_rect_transform (&movie_rect, &movie_rect, &movie->matrix); - movie = movie->parent; + if (shape && FALSE) { + ret = swfdec_movie_mouse_in (movie, x, y); + } else { + ret = swfdec_rect_contains (&movie->original_extents, x, y); } - - g_print ("%d %d in { %g %g %g %g }?\n", SWFDEC_DOUBLE_TO_TWIPS (x), - SWFDEC_DOUBLE_TO_TWIPS (y), movie->extents.x0, movie->extents.y0, - movie->extents.x1, movie->extents.y1); - SWFDEC_AS_VALUE_SET_BOOLEAN (rval, swfdec_rect_contains (&movie->extents, - SWFDEC_DOUBLE_TO_TWIPS (x), SWFDEC_DOUBLE_TO_TWIPS (y))); + SWFDEC_AS_VALUE_SET_BOOLEAN (rval, ret); } else { SWFDEC_FIXME ("hitTest with 0 parameters, what to do?"); } diff-tree ef1ab031ce43c3cc300ebdc2150f0959dc0efc92 (from a7762e6746189c482fabf240bfcbfb5d5532c687) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 21:09:35 2007 +0200 add swfdec_movie_rect_global_to_local/local_to_global() diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 96a7af1..eb1e2e5 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -476,7 +476,7 @@ swfdec_movie_set_variables (SwfdecMovie /* NB: coordinates are in movie's coordiante system. Use swfdec_movie_get_mouse * if you have global coordinates */ -static gboolean +gboolean swfdec_movie_mouse_in (SwfdecMovie *movie, double x, double y) { SwfdecMovieClass *klass; @@ -490,14 +490,42 @@ swfdec_movie_mouse_in (SwfdecMovie *movi void swfdec_movie_local_to_global (SwfdecMovie *movie, double *x, double *y) { + g_return_if_fail (SWFDEC_IS_MOVIE (movie)); + g_return_if_fail (x != NULL); + g_return_if_fail (y != NULL); + do { cairo_matrix_transform_point (&movie->matrix, x, y); } while ((movie = movie->parent)); } void +swfdec_movie_rect_local_to_global (SwfdecMovie *movie, SwfdecRect *rect) +{ + g_return_if_fail (SWFDEC_IS_MOVIE (movie)); + g_return_if_fail (rect != NULL); + + swfdec_movie_local_to_global (movie, &rect->x0, &rect->y0); + swfdec_movie_local_to_global (movie, &rect->x1, &rect->y1); + if (rect->x0 > rect->x1) { + double tmp = rect->x1; + rect->x1 = rect->x0; + rect->x0 = tmp; + } + if (rect->y0 > rect->y1) { + double tmp = rect->y1; + rect->y1 = rect->y0; + rect->y0 = tmp; + } +} + +void swfdec_movie_global_to_local (SwfdecMovie *movie, double *x, double *y) { + g_return_if_fail (SWFDEC_IS_MOVIE (movie)); + g_return_if_fail (x != NULL); + g_return_if_fail (y != NULL); + if (movie->parent) { swfdec_movie_global_to_local (movie->parent, x, y); } @@ -506,6 +534,26 @@ swfdec_movie_global_to_local (SwfdecMovi cairo_matrix_transform_point (&movie->inverse_matrix, x, y); } +void +swfdec_movie_rect_global_to_local (SwfdecMovie *movie, SwfdecRect *rect) +{ + g_return_if_fail (SWFDEC_IS_MOVIE (movie)); + g_return_if_fail (rect != NULL); + + swfdec_movie_global_to_local (movie, &rect->x0, &rect->y0); + swfdec_movie_global_to_local (movie, &rect->x1, &rect->y1); + if (rect->x0 > rect->x1) { + double tmp = rect->x1; + rect->x1 = rect->x0; + rect->x0 = tmp; + } + if (rect->y0 > rect->y1) { + double tmp = rect->y1; + rect->y1 = rect->y0; + rect->y0 = tmp; + } +} + /** * swfdec_movie_get_mouse: * @movie: a #SwfdecMovie diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index 1e83f6b..41e99fa 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -192,6 +192,10 @@ void swfdec_movie_local_to_global (Swfd void swfdec_movie_global_to_local (SwfdecMovie * movie, double * x, double * y); +void swfdec_movie_rect_local_to_global (SwfdecMovie * movie, + SwfdecRect * rect); +void swfdec_movie_rect_global_to_local (SwfdecMovie * movie, + SwfdecRect * rect); void swfdec_movie_set_depth (SwfdecMovie * movie, int depth); void swfdec_movie_get_mouse (SwfdecMovie * movie, @@ -199,6 +203,9 @@ void swfdec_movie_get_mouse (SwfdecMov double * y); void swfdec_movie_send_mouse_change (SwfdecMovie * movie, gboolean release); +gboolean swfdec_movie_mouse_in (SwfdecMovie * movie, + double x, + double y); SwfdecMovie * swfdec_movie_get_movie_at (SwfdecMovie * movie, double x, double y); diff-tree a7762e6746189c482fabf240bfcbfb5d5532c687 (from 2433143ef3aed8179907702b434043878abe7c0c) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 20:44:23 2007 +0200 fix coordinate systems Swfdec now has 4 types of coordinate systems: - Stage (unique) - global (unique) - movie (one per movie) - parent (one per movie) The Stage coordinate system is what the user of the API sees and interacts with. It's what coordinates in _handle_mouse() are given in and what the invalidate signal uses for its rectangle. The Flash movie itself has no possibility to get to this coordinate system. The global coordinate system is the system all root movies live in. It's what you get after applying the Stage transformations. The two functions swfdec_player_stage_to_global() and swfdec_player_global_to_stage() transform between this and the previous coordinate system. Various Flash functions (like for example hitTest when using coordinates) expect coordinates from this system. The there is one coordinate system per movie. It's what you get after applying the movie's matrix to the parent's coordinate system. This coordinate system is used for the _x, _y, _height and _width properties of the movie's children. Drawing operations in the Flash file format are specified in this coordinate system, too. The functions swfdec_movie_global_to_local() and swfdec_movie_local_to_global() convert between a movie's and the global coordinate systems. You can of course chain these functions with the stage conversion functions to transform stage coordinates to movie coordinates and vice versa. Another coordinate system often used in Swfdec terminology is the parent system. This is not actually a different coordinate system but just refers to the coordinate system of a movie's parent or in the root movie case the global coordinate system. Since quite some Actionscript variables and functions require coorinates in this system, it is useful to have a simple term for it. diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 03cc00c..96a7af1 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -490,16 +490,9 @@ swfdec_movie_mouse_in (SwfdecMovie *movi void swfdec_movie_local_to_global (SwfdecMovie *movie, double *x, double *y) { - SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context); - do { cairo_matrix_transform_point (&movie->matrix, x, y); } while ((movie = movie->parent)); - - *x /= player->scale_x; - *y /= player->scale_y; - *x += SWFDEC_TWIPS_TO_DOUBLE (player->offset_x); - *y += SWFDEC_TWIPS_TO_DOUBLE (player->offset_y); } void @@ -507,12 +500,6 @@ swfdec_movie_global_to_local (SwfdecMovi { if (movie->parent) { swfdec_movie_global_to_local (movie->parent, x, y); - } else { - SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context); - *x -= SWFDEC_TWIPS_TO_DOUBLE (player->offset_x); - *y -= SWFDEC_TWIPS_TO_DOUBLE (player->offset_y); - *x *= player->scale_x; - *y *= player->scale_y; } if (movie->cache_state >= SWFDEC_MOVIE_INVALID_MATRIX) swfdec_movie_update (movie); @@ -539,6 +526,7 @@ swfdec_movie_get_mouse (SwfdecMovie *mov player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context); *x = player->mouse_x; *y = player->mouse_y; + swfdec_player_stage_to_global (player, x, y); swfdec_movie_global_to_local (movie, x, y); } @@ -563,6 +551,18 @@ swfdec_movie_send_mouse_change (SwfdecMo klass->mouse_change (movie, x, y, mouse_in, button); } +/** + * swfdec_movie_get_movie_at: + * @movie: a #SwfdecMovie + * @x: x coordinate in parent's coordinate space + * @y: y coordinate in the parent's coordinate space + * + * Gets the child at the given coordinates. The coordinates are in the + * coordinate system of @movie's parent (or the global coordinate system for + * root movies). + * + * Returns: the child of @movie at the given coordinates or %NULL if none + **/ SwfdecMovie * swfdec_movie_get_movie_at (SwfdecMovie *movie, double x, double y) { diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 8175219..98a1086 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -729,6 +729,7 @@ swfdec_player_update_drag_movie (SwfdecP g_assert (movie->cache_state == SWFDEC_MOVIE_UP_TO_DATE); x = player->mouse_x; y = player->mouse_y; + swfdec_player_stage_to_global (player, &x, &y); if (movie->parent) swfdec_movie_global_to_local (movie->parent, &x, &y); if (player->mouse_drag_center) { @@ -740,7 +741,7 @@ swfdec_player_update_drag_movie (SwfdecP } x = CLAMP (x, player->mouse_drag_rect.x0, player->mouse_drag_rect.x1); y = CLAMP (y, player->mouse_drag_rect.y0, player->mouse_drag_rect.y1); - SWFDEC_LOG ("mouse is at %g %g, orighinally (%g %g)", x, y, player->mouse_x, player->mouse_y); + SWFDEC_LOG ("mouse is at %g %g, originally (%g %g)", x, y, player->mouse_x, player->mouse_y); if (x != movie->matrix.x0 || y != movie->matrix.y0) { movie->matrix.x0 = x; movie->matrix.y0 = y; @@ -772,6 +773,7 @@ swfdec_player_set_drag_movie (SwfdecPlay if (drag && !center) { player->mouse_drag_x = player->mouse_x; player->mouse_drag_y = player->mouse_y; + swfdec_player_stage_to_global (player, &player->mouse_drag_x, &player->mouse_drag_y); if (drag->parent) swfdec_movie_global_to_local (drag->parent, &player->mouse_drag_x, &player->mouse_drag_y); player->mouse_drag_x -= drag->matrix.x0; @@ -805,9 +807,13 @@ swfdec_player_update_mouse_position (Swf if (player->mouse_button) { mouse_grab = player->mouse_grab; } else { + double x, y; /* if the mouse button is pressed the grab widget stays the same (I think) */ + x = player->mouse_x; + y = player->mouse_y; + swfdec_player_stage_to_global (player, &x, &y); for (walk = g_list_last (player->roots); walk; walk = walk->prev) { - mouse_grab = swfdec_movie_get_movie_at (walk->data, player->mouse_x, player->mouse_y); + mouse_grab = swfdec_movie_get_movie_at (walk->data, x, y); if (mouse_grab) break; } @@ -868,14 +874,12 @@ swfdec_player_emit_signals (SwfdecPlayer /* FIXME: currently we clamp the rectangle to the visible area, it might * be useful to allow out-of-bounds drawing. In that case this needs to be * changed */ - x = SWFDEC_TWIPS_TO_DOUBLE (player->invalid.x0) * player->scale_x + player->offset_x; - x = MAX (x, 0.0); - y = SWFDEC_TWIPS_TO_DOUBLE (player->invalid.y0) * player->scale_y + player->offset_y; - y = MAX (y, 0.0); - width = SWFDEC_TWIPS_TO_DOUBLE (player->invalid.x1 - player->invalid.x0) * player->scale_x; - width = MIN (width, player->stage_width - x); - height = SWFDEC_TWIPS_TO_DOUBLE (player->invalid.y1 - player->invalid.y0) * player->scale_y; - height = MIN (height, player->stage_height - y); + swfdec_player_global_to_stage (player, &player->invalid.x0, &player->invalid.y0); + swfdec_player_global_to_stage (player, &player->invalid.x1, &player->invalid.y1); + x = MAX (player->invalid.x0, 0.0); + y = MAX (player->invalid.y0, 0.0); + width = MIN (player->invalid.x1, player->stage_width) - x; + height = MIN (player->invalid.y1, player->stage_height) - y; g_signal_emit (player, signals[INVALIDATE], 0, x, y, width, height); swfdec_rect_init_empty (&player->invalid); } @@ -914,10 +918,6 @@ swfdec_player_do_handle_mouse (SwfdecPla double x, double y, int button) { swfdec_player_lock (player); - x -= player->offset_x; - y -= player->offset_y; - x = x * SWFDEC_TWIPS_SCALE_FACTOR / player->scale_x; - y = y * SWFDEC_TWIPS_SCALE_FACTOR / player->scale_y; SWFDEC_LOG ("handling mouse at %g %g %d", x, y, button); if (player->mouse_x != x || player->mouse_y != y) { player->mouse_x = x; @@ -942,8 +942,8 @@ swfdec_player_global_to_stage (SwfdecPla g_return_if_fail (x != NULL); g_return_if_fail (y != NULL); - *x = *x / player->scale_x + player->offset_x; - *y = *y / player->scale_y + player->offset_y; + *x = *x / SWFDEC_TWIPS_SCALE_FACTOR * player->scale_x + player->offset_x; + *y = *y / SWFDEC_TWIPS_SCALE_FACTOR * player->scale_y + player->offset_y; } void @@ -953,8 +953,8 @@ swfdec_player_stage_to_global (SwfdecPla g_return_if_fail (x != NULL); g_return_if_fail (y != NULL); - *x = (*x - player->offset_x) * player->scale_x; - *y = (*y - player->offset_y) * player->scale_y; + *x = (*x - player->offset_x) / player->scale_x * SWFDEC_TWIPS_SCALE_FACTOR; + *y = (*y - player->offset_y) / player->scale_y * SWFDEC_TWIPS_SCALE_FACTOR; } static void @@ -1043,6 +1043,7 @@ swfdec_player_perform_actions (SwfdecPla { GList *walk; SwfdecRect old_inval; + double x, y; g_return_if_fail (SWFDEC_IS_PLAYER (player)); @@ -1053,7 +1054,10 @@ swfdec_player_perform_actions (SwfdecPla swfdec_movie_update (walk->data); } /* update the state of the mouse when stuff below it moved */ - if (swfdec_rect_contains (&player->invalid, player->mouse_x, player->mouse_y)) { + x = player->mouse_x; + y = player->mouse_y; + swfdec_player_stage_to_global (player, &x, &y); + if (swfdec_rect_contains (&player->invalid, x, y)) { SWFDEC_INFO ("=== NEED TO UPDATE mouse post-iteration ==="); swfdec_player_update_mouse_position (player); for (walk = player->roots; walk; walk = walk->next) { @@ -1356,6 +1360,7 @@ swfdec_player_stop_all_sounds (SwfdecPla } } +/* rect is in global coordinates */ void swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect) { diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 00c893f..858c6eb 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -82,13 +82,13 @@ struct _SwfdecPlayer SwfdecAsObject * Video; /* Video object */ /* rendering */ - SwfdecRect invalid; /* area that needs a rredraw */ + SwfdecRect invalid; /* area that needs a redraw in global coordinates */ /* mouse */ gboolean mouse_visible; /* show the mouse (actionscriptable) */ SwfdecMouseCursor mouse_cursor; /* cursor that should be shown */ - double mouse_x; /* in twips */ - double mouse_y; /* in twips */ + double mouse_x; /* in stage coordinates */ + double mouse_y; /* in stage coordinates */ int mouse_button; /* 0 for not pressed, 1 for pressed */ SwfdecMovie * mouse_grab; /* movie that currently has the mouse */ SwfdecMovie * mouse_drag; /* current movie activated by startDrag */ diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index dddd4ce..0722f4c 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -229,10 +229,13 @@ swfdec_sprite_movie_hitTest (SwfdecAsCon movie = movie->parent; } - SWFDEC_AS_VALUE_SET_BOOLEAN (rval, swfdec_rect_contains (&movie_rect, - SWFDEC_PLAYER (cx)->mouse_x, SWFDEC_PLAYER (cx)->mouse_y)); + g_print ("%d %d in { %g %g %g %g }?\n", SWFDEC_DOUBLE_TO_TWIPS (x), + SWFDEC_DOUBLE_TO_TWIPS (y), movie->extents.x0, movie->extents.y0, + movie->extents.x1, movie->extents.y1); + SWFDEC_AS_VALUE_SET_BOOLEAN (rval, swfdec_rect_contains (&movie->extents, + SWFDEC_DOUBLE_TO_TWIPS (x), SWFDEC_DOUBLE_TO_TWIPS (y))); } else { - SWFDEC_FIXME ("hitText with 0 parameters, what to do?"); + SWFDEC_FIXME ("hitTest with 0 parameters, what to do?"); } } diff-tree 2433143ef3aed8179907702b434043878abe7c0c (from 17de193746f320b9307eff2613404aa8548e2e5d) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 19:44:13 2007 +0200 add swfdec_player_stage_to_global/global_to_stage() diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 1f9b2a3..8175219 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -935,6 +935,28 @@ swfdec_player_do_handle_mouse (SwfdecPla return TRUE; } +void +swfdec_player_global_to_stage (SwfdecPlayer *player, double *x, double *y) +{ + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + g_return_if_fail (x != NULL); + g_return_if_fail (y != NULL); + + *x = *x / player->scale_x + player->offset_x; + *y = *y / player->scale_y + player->offset_y; +} + +void +swfdec_player_stage_to_global (SwfdecPlayer *player, double *x, double *y) +{ + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + g_return_if_fail (x != NULL); + g_return_if_fail (y != NULL); + + *x = (*x - player->offset_x) * player->scale_x; + *y = (*y - player->offset_y) * player->scale_y; +} + static void swfdec_player_iterate (SwfdecTimeout *timeout) { diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index bce9e4a..00c893f 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -200,6 +200,12 @@ SwfdecLoader * swfdec_player_load (Swfd void swfdec_player_launch (SwfdecPlayer * player, const char * url, const char * target); +void swfdec_player_stage_to_global (SwfdecPlayer * player, + double * x, + double * y); +void swfdec_player_global_to_stage (SwfdecPlayer * player, + double * x, + double * y); G_END_DECLS diff-tree 17de193746f320b9307eff2613404aa8548e2e5d (from bd1f7a67b87e053796d017c7c3d0e8da4c71112a) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 18:31:45 2007 +0200 don't have our own init function, ut call it from _check() Since the init function can potentially call back into the Flash engine, this is a dangerous thing to call. diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c index 0805396..b9b2811 100644 --- a/vivified/core/vivi_application.c +++ b/vivified/core/vivi_application.c @@ -157,26 +157,6 @@ vivi_application_new (void) } void -vivi_application_init_player (ViviApplication *app) -{ - SwfdecLoader *loader; - - g_return_if_fail (VIVI_IS_APPLICATION (app)); - - if (app->player_inited) - return; - - if (app->filename == NULL) { - vivi_application_error (app, "no file set to play."); - return; - } - - app->player_inited = TRUE; - loader = swfdec_file_loader_new (app->filename); - swfdec_player_set_loader_with_variables (app->player, loader, app->variables); -} - -void vivi_application_reset (ViviApplication *app) { gboolean audio; @@ -310,6 +290,23 @@ vivi_application_check (ViviApplication /* leave breakpoint unless stopped */ if (is_breakpoint && app->playback_state != VIVI_APPLICATION_STOPPED) g_main_loop_quit (app->loop); + + /* init player if playing */ + if ((app->playback_state == VIVI_APPLICATION_PLAYING || + app->playback_state == VIVI_APPLICATION_STEPPING) && + !app->player_inited) { + if (app->filename == NULL) { + vivi_application_error (app, "no file set to play."); + app->playback_state = VIVI_APPLICATION_STOPPED; + vivi_application_check (app); + } else { + SwfdecLoader *loader; + + app->player_inited = TRUE; + loader = swfdec_file_loader_new (app->filename); + swfdec_player_set_loader_with_variables (app->player, loader, app->variables); + } + } } void diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h index 1a8c68a..d5d0c2b 100644 --- a/vivified/core/vivi_application.h +++ b/vivified/core/vivi_application.h @@ -99,7 +99,6 @@ SwfdecPlayer * vivi_application_g gboolean vivi_application_get_interrupted(ViviApplication * app); gboolean vivi_application_is_quit (ViviApplication * app); -void vivi_application_init_player (ViviApplication * app); void vivi_application_reset (ViviApplication * app); void vivi_application_play (ViviApplication * app); void vivi_application_stop (ViviApplication * app); diff --git a/vivified/core/vivi_application_as.c b/vivified/core/vivi_application_as.c index 6e2c011..2f9ec6e 100644 --- a/vivified/core/vivi_application_as.c +++ b/vivified/core/vivi_application_as.c @@ -41,7 +41,6 @@ vivi_application_as_run (SwfdecAsContext { ViviApplication *app = VIVI_APPLICATION (cx); - vivi_application_init_player (app); vivi_application_play (app); } @@ -63,7 +62,6 @@ vivi_application_as_step (SwfdecAsContex ViviApplication *app = VIVI_APPLICATION (cx); int steps; - vivi_application_init_player (app); if (argc > 0) { steps = swfdec_as_value_to_integer (cx, &argv[0]); if (steps <= 1) diff-tree bd1f7a67b87e053796d017c7c3d0e8da4c71112a (from 357a6593f7125e8518bd65d7f058105ebe7c78a2) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 17:26:40 2007 +0200 copy x0 and y0 immediately or their values will get lost This can happen when the modified flag gets set before the first update of the matrix. diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 0f3cb91..03cc00c 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1044,6 +1044,8 @@ swfdec_movie_set_static_properties (Swfd } if (transform) { movie->original_transform = *transform; + movie->matrix.x0 = movie->original_transform.x0; + movie->matrix.y0 = movie->original_transform.y0; movie->xscale = swfdec_matrix_get_xscale (&movie->original_transform); movie->yscale = swfdec_matrix_get_yscale (&movie->original_transform); movie->rotation = swfdec_matrix_get_rotation (&movie->original_transform); diff-tree 357a6593f7125e8518bd65d7f058105ebe7c78a2 (from 66f34d06d0ea7226f8f1e5d39af392a10de556c0) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 22 16:40:27 2007 +0200 set to inited before initing, because initing can cause breakpoints to happen We of course don't want to run init twice diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c index 19be22d..0805396 100644 --- a/vivified/core/vivi_application.c +++ b/vivified/core/vivi_application.c @@ -171,9 +171,9 @@ vivi_application_init_player (ViviApplic return; } + app->player_inited = TRUE; loader = swfdec_file_loader_new (app->filename); swfdec_player_set_loader_with_variables (app->player, loader, app->variables); - app->player_inited = TRUE; } void
Maybe Matching Threads
- libswfdec-gtk/swfdec_gtk_player.c libswfdec/swfdec_as_date.c libswfdec/swfdec_audio.c libswfdec/swfdec_audio_event.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_interval.c libswfdec/swfdec_key_as.c libswfdec/swfdec_mouse_as.c libswfdec/swfdec_movie.c
- 3 commits - libswfdec/swfdec_sprite_movie_as.c test/trace
- 12 commits - configure.ac doc/Makefile.am doc/swfdec-sections.txt libswfdec/jpeg libswfdec/swfdec_as_array.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_player.c libswfdec/swfdec_player.h libswfdec/swfdec_player_internal.h
- Branch 'as' - 5 commits - libswfdec/Makefile.am libswfdec/swfdec_as_strings.c libswfdec/swfdec_js_net_stream.c libswfdec/swfdec_movie.c libswfdec/swfdec_net_connection.c libswfdec/swfdec_net_stream_as.c libswfdec/swfdec_net_stream.c
- 7 commits - libswfdec/swfdec_codec_gst.c libswfdec/swfdec_font.c libswfdec/swfdec_js_movie.c libswfdec/swfdec_morph_movie.c libswfdec/swfdec_pattern.c libswfdec/swfdec_pattern.h libswfdec/swfdec_shape.c libswfdec/swfdec_shape.h libswfdec/swfdec_sprite.c