⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_player.c

📁 Swfdec is a decoder/renderer for Macromedia Flash animations. The decoding and rendering engine is
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -