📄 swfdec_player.c
字号:
swfdec_xml_init_context (player, version); if (version > 4) { SwfdecBits bits; SwfdecScript *script; swfdec_bits_init_data (&bits, swfdec_initialize, sizeof (swfdec_initialize)); script = swfdec_script_new_from_bits (&bits, "init", version); g_assert (script); swfdec_as_object_run (context->global, script); swfdec_script_unref (script); } if (context->state == SWFDEC_AS_CONTEXT_NEW) { context->state = SWFDEC_AS_CONTEXT_RUNNING; swfdec_as_object_set_constructor (player->roots->data, player->MovieClip); } } SWFDEC_INFO ("initializing player to size %ux%u", width, height); player->rate = rate; player->width = width; player->height = height; player->internal_width = player->stage_width >=0 ? (guint) player->stage_width : player->width; player->internal_height = player->stage_height >=0 ? (guint) player->stage_height : player->height; player->initialized = TRUE; if (rate) { player->iterate_timeout.timestamp = player->time + SWFDEC_TICKS_PER_SECOND * 256 / rate; swfdec_player_add_timeout (player, &player->iterate_timeout); SWFDEC_LOG ("initialized iterate timeout %p to %"G_GUINT64_FORMAT" (now %"G_GUINT64_FORMAT")", &player->iterate_timeout, player->iterate_timeout.timestamp, player->time); } g_object_notify (G_OBJECT (player), "initialized"); swfdec_player_update_scale (player);}/** * swfdec_player_get_export_class: * @player: a #SwfdecPlayer * @name: garbage-collected string naming the export * * Looks up the constructor for characters that are exported using @name. * * Returns: a #SwfdecAsObject naming the constructor or %NULL if none **/SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer *player, const char *name){ SwfdecAsObject *ret; ret = g_hash_table_lookup (player->registered_classes, name); if (ret) { SWFDEC_LOG ("found registered class %p for %s\n", ret, name); return ret; } return player->MovieClip;}/** * swfdec_player_set_export_class: * @player: a #SwfdecPlayer * @name: garbage-collected string naming the export * @object: object to use as constructor or %NULL for none * * Sets the constructor to be used for instances created using the object * exported with @name. **/voidswfdec_player_set_export_class (SwfdecPlayer *player, const char *name, SwfdecAsObject *object){ g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (name != NULL); g_return_if_fail (object == NULL || SWFDEC_IS_AS_OBJECT (object)); if (object) { SWFDEC_LOG ("setting class %p for %s\n", object, name); g_hash_table_insert (player->registered_classes, (gpointer) name, object); } else { g_hash_table_remove (player->registered_classes, name); }}/** PUBLIC API ***//** * swfdec_player_new: * @debugger: %NULL or a #SwfdecAsDebugger to use for debugging this player. * * Creates a new player. * This function calls swfdec_init () for you if it wasn't called before. * * Returns: The new player **/SwfdecPlayer *swfdec_player_new (SwfdecAsDebugger *debugger){ SwfdecPlayer *player; swfdec_init (); player = g_object_new (SWFDEC_TYPE_PLAYER, "debugger", debugger, NULL); return player;}/** * swfdec_player_set_loader: * @player: a #SwfdecPlayer * @loader: the loader to use for this player. Takes ownership of the given loader. * * Sets the loader for the main data. This function only works if no loader has * been set on @player yet. * For details, see swfdec_player_set_loader_with_variables(). **/voidswfdec_player_set_loader (SwfdecPlayer *player, SwfdecLoader *loader){ g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (player->roots == NULL); g_return_if_fail (SWFDEC_IS_LOADER (loader)); swfdec_player_set_loader_with_variables (player, loader, NULL);}/** * swfdec_player_set_loader_with_variables: * @player: a #SwfdecPlayer * @loader: the loader to use for this player. Takes ownership of the given loader. * @variables: a string that is checked to be in 'application/x-www-form-urlencoded' * syntax describing the arguments to set on the new player or NULL for * none. * * Sets the loader for the main data. This function only works if no loader has * been set on @player yet. * If the @variables are set and validate, they will be set as properties on the * root movie. * <note>If you want to capture events during the setup process, you want to * connect your signal handlers before calling swfdec_player_set_loader() and * not use conveniencse functions such as swfdec_player_new_from_file().</note> **/voidswfdec_player_set_loader_with_variables (SwfdecPlayer *player, SwfdecLoader *loader, const char *variables){ g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (player->roots == NULL); g_return_if_fail (SWFDEC_IS_LOADER (loader)); swfdec_player_lock (player); player->loader = loader; g_object_ref (loader); swfdec_player_add_level_from_loader (player, 0, loader, variables); swfdec_player_perform_external_actions (player); swfdec_player_unlock (player);}/** * swfdec_player_new_from_file: * @filename: name of the file to play * * Creates a player to play back the given file. If the file does not * exist or another error occurs, the player will be in an error state and not * be initialized. * This function calls swfdec_init () for you if it wasn't called before. * * Returns: a new player **/SwfdecPlayer *swfdec_player_new_from_file (const char *filename){ SwfdecLoader *loader; SwfdecPlayer *player; g_return_val_if_fail (filename != NULL, NULL); loader = swfdec_file_loader_new (filename); player = swfdec_player_new (NULL); swfdec_player_set_loader (player, loader); return player;}/** * swfdec_init: * * Initializes the Swfdec library. **/voidswfdec_init (void){ static gboolean _inited = FALSE; const char *s; if (_inited) return; _inited = TRUE; g_type_init (); oil_init (); s = g_getenv ("SWFDEC_DEBUG"); if (s && s[0]) { char *end; int level; level = strtoul (s, &end, 0); if (end[0] == 0) { swfdec_debug_set_level (level); } }}/** * swfdec_player_handle_mouse: * @player: a #SwfdecPlayer * @x: x coordinate of mouse * @y: y coordinate of mouse * @button: 1 for pressed, 0 for not pressed * * Updates the current mouse status. If the mouse has left the area of @player, * you should pass values outside the movie size for @x and @y. You will * probably want to call swfdec_player_advance() before to update the player to * the correct time when calling this function. * * Returns: %TRUE if the mouse event was handled. %FALSE to propagate the event * further. A mouse event may not be handled if the user clicked on a * translucent area. **/gbooleanswfdec_player_handle_mouse (SwfdecPlayer *player, double x, double y, int button){ gboolean ret; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); g_return_val_if_fail (button == 0 || button == 1, FALSE); g_signal_emit (player, signals[HANDLE_MOUSE], 0, x, y, button, &ret); return ret;}/** * swfdec_player_key_press: * @player: a #SwfdecPlayer * @keycode: the key that was pressed * @character: UCS4 of the character that was inserted or 0 if none * * Call this function to make the @player react to a key press. Be sure to * check that keycode transformations are done correctly. For a list of * keycodes see FIXME. * * Returns: %TRUE if the key press was handled by the @player, %FALSE if it * should be propagated further **/gbooleanswfdec_player_key_press (SwfdecPlayer *player, guint keycode, guint character){ gboolean ret; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); g_return_val_if_fail (keycode < 256, FALSE); g_signal_emit (player, signals[HANDLE_KEY], 0, keycode, character, TRUE, &ret); return ret;}/** * swfdec_player_key_release: * @player: a #SwfdecPlayer * @keycode: the key that was released * @character: UCS4 of the character that was inserted or 0 if none * * Call this function to make the @player react to a key being released. See * swfdec_player_key_press() for details. * * Returns: %TRUE if the key press was handled by the @player, %FALSE if it * should be propagated further **/gbooleanswfdec_player_key_release (SwfdecPlayer *player, guint keycode, guint character){ gboolean ret; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); g_return_val_if_fail (keycode < 256, FALSE); g_signal_emit (player, signals[HANDLE_KEY], 0, keycode, character, FALSE, &ret); return ret;}/** * swfdec_player_render: * @player: a #SwfdecPlayer * @cr: #cairo_t to render to * @x: x coordinate of top left position to render * @y: y coordinate of top left position to render * @width: width of area to render or 0 for full width * @height: height of area to render or 0 for full height * * Renders the given area of the current frame to @cr. **/voidswfdec_player_render (SwfdecPlayer *player, cairo_t *cr, double x, double y, double width, double height){ static const SwfdecColorTransform trans = { 256, 0, 256, 0, 256, 0, 256, 0 }; GList *walk; SwfdecRect real; g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (cr != NULL); g_return_if_fail (width >= 0.0); g_return_if_fail (height >= 0.0); /* FIXME: fail when !initialized? */ if (!swfdec_player_is_initialized (player)) return; if (width == 0.0) width = player->stage_width; if (height == 0.0) height = player->stage_height; /* clip the area */ cairo_save (cr); cairo_rectangle (cr, x, y, width, height); cairo_clip (cr); /* compute the rectangle */ x -= player->offset_x; y -= player->offset_y; real.x0 = floor (x * SWFDEC_TWIPS_SCALE_FACTOR) / player->scale_x; real.y0 = floor (y * SWFDEC_TWIPS_SCALE_FACTOR) / player->scale_y; real.x1 = ceil ((x + width) * SWFDEC_TWIPS_SCALE_FACTOR) / player->scale_x; real.y1 = ceil ((y + height) * SWFDEC_TWIPS_SCALE_FACTOR) / player->scale_y; SWFDEC_INFO ("=== %p: START RENDER, area %g %g %g %g ===", player, real.x0, real.y0, real.x1, real.y1); /* convert the cairo matrix */ cairo_translate (cr, player->offset_x, player->offset_y); cairo_scale (cr, player->scale_x / SWFDEC_TWIPS_SCALE_FACTOR, player->scale_y / SWFDEC_TWIPS_SCALE_FACTOR); swfdec_color_set_source (cr, player->bgcolor); cairo_paint (cr); for (walk = player->roots; walk; walk = walk->next) { swfdec_movie_render (walk->data, cr, &trans, &real, TRUE); } SWFDEC_INFO ("=== %p: END RENDER ===", player); cairo_restore (cr);}/** * swfdec_player_advance: * @player: the #SwfdecPlayer to advance * @msecs: number of milliseconds to advance * * Advances @player by @msecs. You should make sure to call this function as * often as the SwfdecPlayer::next-event property indicates. **/voidswfdec_player_advance (SwfdecPlayer *player, guint msecs){ guint frames; g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (msecs > 0); frames = SWFDEC_TICKS_TO_SAMPLES (player->time + SWFDEC_MSECS_TO_TICKS (msecs)) - SWFDEC_TICKS_TO_SAMPLES (player->time); g_signal_emit (player, signals[ADVANCE], 0, msecs, frames);}/** * swfdec_player_is_initialized: * @player: a #SwfdecPlayer * * Determines if the @player is initalized yet. An initialized player is able * to provide basic values like width, height or rate. A player may not be * initialized if the loader it was started with does not reference a Flash * resources or it did not provide enough data yet. If a player is initialized, * it will never be uninitialized again. * * Returns: TRUE if the basic values are known. **/gbooleanswfdec_player_is_initialized (SwfdecPlayer *player){ g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); return player->initialized;}/** * swfdec_player_get_next_event: * @player: ia #SwfdecPlayer * * Queries how long to the next event. This is the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -