Benjamin Otte
2007-Feb-17 06:56 UTC
[Swfdec] 2 commits - doc/swfdec-sections.txt libswfdec/swfdec_color.h libswfdec/swfdec_player.c libswfdec/swfdec_player.h libswfdec/swfdec_player_internal.h libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_sprite_movie.h libswfdec/swfdec_types.h
doc/swfdec-sections.txt | 2 + libswfdec/swfdec_color.h | 4 -- libswfdec/swfdec_player.c | 65 ++++++++++++++++++++++++++++++------- libswfdec/swfdec_player.h | 7 +++ libswfdec/swfdec_player_internal.h | 4 +- libswfdec/swfdec_sprite.c | 24 +++++++++---- libswfdec/swfdec_sprite.h | 1 libswfdec/swfdec_sprite_movie.c | 19 ---------- libswfdec/swfdec_sprite_movie.h | 3 - libswfdec/swfdec_types.h | 4 ++ 10 files changed, 86 insertions(+), 47 deletions(-) New commits: diff-tree 20b8eddca6677d1c69f541d058fce59031487450 (from 8162df646cb4ebb7009c48093a026f827a9c34fe) Author: Benjamin Otte <otte@gnome.org> Date: Sat Feb 17 14:47:40 2007 +0100 rework background color handling - There's only one background color per player, not one per frame per sprite - The background color is exported by the SwfdecPlayer, so it can be overwritten diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt index 43457d5..4a45ff4 100644 --- a/doc/swfdec-sections.txt +++ b/doc/swfdec-sections.txt @@ -45,6 +45,8 @@ swfdec_player_is_initialized swfdec_player_get_rate swfdec_player_get_image_size swfdec_player_get_next_event +swfdec_player_get_background_color +swfdec_player_set_background_color swfdec_player_render swfdec_player_advance swfdec_player_handle_mouse diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 2255771..a1b9660 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte@gnome.org> + * Copyright (C) 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 @@ -266,7 +266,8 @@ enum { PROP_CACHE_SIZE, PROP_INITIALIZED, PROP_MOUSE_CURSOR, - PROP_NEXT_EVENT + PROP_NEXT_EVENT, + PROP_BACKGROUND_COLOR }; G_DEFINE_TYPE (SwfdecPlayer, swfdec_player, G_TYPE_OBJECT) @@ -285,6 +286,9 @@ swfdec_player_get_property (GObject *obj SwfdecPlayer *player = SWFDEC_PLAYER (object); switch (param_id) { + case PROP_BACKGROUND_COLOR: + g_value_set_uint (value, swfdec_player_get_background_color (player)); + break; case PROP_CACHE_SIZE: g_value_set_uint (value, player->cache->max_size); break; @@ -310,6 +314,9 @@ swfdec_player_set_property (GObject *obj SwfdecPlayer *player = SWFDEC_PLAYER (object); switch (param_id) { + case PROP_BACKGROUND_COLOR: + swfdec_player_set_background_color (player, g_value_get_uint (value)); + break; case PROP_CACHE_SIZE: player->cache->max_size = g_value_get_uint (value); break; @@ -713,7 +720,9 @@ swfdec_player_class_init (SwfdecPlayerCl g_object_class_install_property (object_class, PROP_CACHE_SIZE, g_param_spec_uint ("cache-size", "cache size", "maximum cache size in bytes", 0, G_MAXUINT, 50 * 1024 * 1024, G_PARAM_READABLE)); - + g_object_class_install_property (object_class, PROP_BACKGROUND_COLOR, + g_param_spec_uint ("background-color", "background color", "ARGB color used to draw the background", + 0, G_MAXUINT, SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF), G_PARAM_READWRITE)); /** * SwfdecPlayer::trace: @@ -820,6 +829,7 @@ swfdec_player_init (SwfdecPlayer *player player->actions = swfdec_ring_buffer_new_for_type (SwfdecPlayerAction, 16); player->cache = swfdec_cache_new (50 * 1024 * 1024); /* 100 MB */ + player->bgcolor = SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF); player->mouse_visible = TRUE; player->mouse_cursor = SWFDEC_MOUSE_CURSOR_NORMAL; @@ -1154,14 +1164,8 @@ swfdec_player_render (SwfdecPlayer *play cairo_rectangle (cr, x, y, width, height); cairo_clip (cr); cairo_scale (cr, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR); - /* FIXME: find a nicer way to render the background */ - if (player->roots == NULL || - !SWFDEC_IS_SPRITE_MOVIE (player->roots->data) || - !swfdec_sprite_movie_paint_background (SWFDEC_SPRITE_MOVIE (player->roots->data), cr)) { - SWFDEC_INFO ("couldn't paint the background, using white"); - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); - cairo_paint (cr); - } + 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); @@ -1299,3 +1303,42 @@ swfdec_player_get_audio (SwfdecPlayer * return player->audio; } +/** + * swfdec_player_get_background_color: + * @player: a #SwfdecPlayer + * + * Gets the current background color. The color will be an ARGB-quad, with the + * MSB being the alpha value. + * + * Returns: the background color as an ARGB value + **/ +unsigned int +swfdec_player_get_background_color (SwfdecPlayer *player) +{ + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF)); + + return player->bgcolor; +} + +/** + * swfdec_player_set_background_color: + * @player: a #SwfdecPlayer + * @color: new color to use as background color + * + * Sets a new background color as an ARGB value. To get transparency, set the + * value to 0. To get a black beackground, use 0xFF000000. + **/ +void +swfdec_player_set_background_color (SwfdecPlayer *player, unsigned int color) +{ + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + + player->bgcolor_set = TRUE; + if (player->bgcolor == color) + return; + g_object_notify (G_OBJECT (player), "background-color"); + if (swfdec_player_is_initialized (player)) { + g_signal_emit (player, signals[INVALIDATE], 0, 0.0, 0.0, + (double) player->width, (double) player->height); + } +} diff --git a/libswfdec/swfdec_player.h b/libswfdec/swfdec_player.h index 437d3ee..0c6f70c 100644 --- a/libswfdec/swfdec_player.h +++ b/libswfdec/swfdec_player.h @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte@gnome.org> + * Copyright (C) 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 @@ -63,6 +63,11 @@ double swfdec_player_get_rate (SwfdecP void swfdec_player_get_image_size (SwfdecPlayer * player, int * width, int * height); +unsigned int swfdec_player_get_background_color + (SwfdecPlayer * player); +void swfdec_player_set_background_color + (SwfdecPlayer * player, + unsigned int color); void swfdec_player_render (SwfdecPlayer * player, cairo_t * cr, diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 2d2c6f9..be548b4 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte@gnome.org> + * Copyright (C) 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 @@ -46,6 +46,8 @@ struct _SwfdecPlayer unsigned int height; /* height of movie */ GList * roots; /* all the root movies */ SwfdecCache * cache; /* player cache */ + gboolean bgcolor_set; /* TRUE if the background color has been set */ + SwfdecColor bgcolor; /* background color */ /* javascript */ JSContext * jscx; /* global Javascript context */ diff --git a/libswfdec/swfdec_sprite.c b/libswfdec/swfdec_sprite.c index 0a50906..4145c72 100644 --- a/libswfdec/swfdec_sprite.c +++ b/libswfdec/swfdec_sprite.c @@ -229,7 +229,6 @@ tag_show_frame (SwfdecSwfDecoder * s) if (s->parse_sprite->parse_frame < s->parse_sprite->n_frames) { SwfdecSpriteFrame *old = &s->parse_sprite->frames[s->parse_sprite->parse_frame - 1]; SwfdecSpriteFrame *new = &s->parse_sprite->frames[s->parse_sprite->parse_frame]; - new->bg_color = old->bg_color; if (old->sound_head) new->sound_head = g_object_ref (old->sound_head); } @@ -240,11 +239,24 @@ tag_show_frame (SwfdecSwfDecoder * s) int tag_func_set_background_color (SwfdecSwfDecoder * s) { - SwfdecSpriteFrame *frame; + SwfdecPlayer *player = SWFDEC_DECODER (s)->player; + SwfdecColor color = swfdec_bits_get_color (&s->b); - frame = &s->parse_sprite->frames[s->parse_sprite->parse_frame]; - - frame->bg_color = swfdec_bits_get_color (&s->b); + if (player->bgcolor_set) { + /* only an INFO because it can be set by user, should be error if we check duplication of tag */ + SWFDEC_INFO ("background color has been set to %X already, setting to %X ignored", + player->bgcolor, color); + } else { + SWFDEC_LOG ("setting background color to %X", color); + /* can't use swfdec_player_set_background_color() here, because the player is locked and doesn't emit signals */ + player->bgcolor = color; + player->bgcolor_set = TRUE; + player->invalid.x0 = SWFDEC_DOUBLE_TO_TWIPS (0.0); + player->invalid.y0 = SWFDEC_DOUBLE_TO_TWIPS (0.0); + player->invalid.x1 = SWFDEC_DOUBLE_TO_TWIPS (player->width); + player->invalid.y1 = SWFDEC_DOUBLE_TO_TWIPS (player->height); + g_object_notify (G_OBJECT (player), "background-color"); + } return SWFDEC_STATUS_OK; } @@ -507,8 +519,6 @@ swfdec_sprite_set_n_frames (SwfdecSprite for (i = 0; i < n_frames; i++) { sprite->frames[i].sound_samples = 44100 * 256 / rate; } - /* default bg is white */ - sprite->frames[0].bg_color = SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF); SWFDEC_LOG ("n_frames = %d", sprite->n_frames); } diff --git a/libswfdec/swfdec_sprite.h b/libswfdec/swfdec_sprite.h index 1968d1a..5ac0bf8 100644 --- a/libswfdec/swfdec_sprite.h +++ b/libswfdec/swfdec_sprite.h @@ -63,7 +63,6 @@ struct _SwfdecSpriteFrame GSList *sound; /* list of SwfdecSoundChunk events to start playing here */ /* visuals */ - SwfdecColor bg_color; GArray *actions; /* SwfdecSpriteAction in execution order */ }; diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 36cbd8f..1cc2f0b 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -142,11 +142,6 @@ swfdec_sprite_movie_do_goto_frame (Swfde start = movie->current_frame + 1; old = NULL; } - if (movie->current_frame == (guint) -1 || - movie->sprite->frames[goto_frame].bg_color != - movie->sprite->frames[movie->current_frame].bg_color) { - swfdec_movie_invalidate (mov); - } movie->current_frame = goto_frame; SWFDEC_DEBUG ("performing goto %u -> %u for character %u", start, goto_frame, SWFDEC_CHARACTER (movie->sprite)->id); @@ -355,17 +350,3 @@ swfdec_sprite_movie_init (SwfdecSpriteMo movie->sound_frame = (guint) -1; } -gboolean -swfdec_sprite_movie_paint_background (SwfdecSpriteMovie *movie, cairo_t *cr) -{ - SwfdecSpriteFrame *frame; - - if (movie->current_frame >= SWFDEC_MOVIE (movie)->n_frames) - return FALSE; - - frame = &movie->sprite->frames[movie->current_frame]; - swfdec_color_set_source (cr, frame->bg_color); - cairo_paint (cr); - return TRUE; -} - diff --git a/libswfdec/swfdec_sprite_movie.h b/libswfdec/swfdec_sprite_movie.h index bdc6802..79a0db1 100644 --- a/libswfdec/swfdec_sprite_movie.h +++ b/libswfdec/swfdec_sprite_movie.h @@ -60,9 +60,6 @@ struct _SwfdecSpriteMovieClass GType swfdec_sprite_movie_get_type (void); -gboolean swfdec_sprite_movie_paint_background (SwfdecSpriteMovie * movie, - cairo_t * cr); - G_END_DECLS #endif diff-tree 8162df646cb4ebb7009c48093a026f827a9c34fe (from 86ceb1bdea1ecee5bff104a29c07351bf78454c1) Author: Benjamin Otte <otte@gnome.org> Date: Sat Feb 17 14:30:35 2007 +0100 move SwfdecColor definition to swfdec_types.h diff --git a/libswfdec/swfdec_color.h b/libswfdec/swfdec_color.h index a7a7723..878ec66 100644 --- a/libswfdec/swfdec_color.h +++ b/libswfdec/swfdec_color.h @@ -24,10 +24,6 @@ #include <libswfdec/swfdec_types.h> -/* Pixel value in the same colorspace as cairo - endian-dependant ARGB. - * The alpha pixel must be present */ -typedef unsigned int SwfdecColor; - struct _SwfdecColorTransform { /* naming here is taken from ActionScript, where ?a is the multiplier and ?b the offset */ int ra, rb, ga, gb, ba, bb, aa, ab; diff --git a/libswfdec/swfdec_types.h b/libswfdec/swfdec_types.h index 3228a36..f03b60f 100644 --- a/libswfdec/swfdec_types.h +++ b/libswfdec/swfdec_types.h @@ -5,6 +5,10 @@ #include <glib-object.h> #include <cairo.h> +/* Pixel value in the same colorspace as cairo - endian-dependant ARGB. + * The alpha pixel must be present */ +typedef unsigned int SwfdecColor; + /* audio is 44100Hz, framerate is multiple of 256Hz, FLV timestamps are 1000Hz * This is a multiple of all these numbers, so we can be always accurate */
Seemingly Similar Threads
- Branch 'as' - 8 commits - libswfdec/swfdec_movie.c libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_sprite_movie.h libswfdec/swfdec_swf_decoder.c libswfdec/swfdec_swf_decoder.h
- 5 commits - libswfdec/Makefile.am libswfdec/swfdec_color.c libswfdec/swfdec_color.h libswfdec/swfdec_font.c libswfdec/swfdec_loadertarget.c libswfdec/swfdec_movie.h libswfdec/swfdec_pattern.c libswfdec/swfdec_pattern.h libswfdec/swfdec_player.c
- libswfdec-gtk/swfdec_playback_alsa.c libswfdec/swfdec_audio_event.h libswfdec/swfdec_audio_flv.h libswfdec/swfdec_audio_stream.h libswfdec/swfdec_bits.c libswfdec/swfdec_bits.h libswfdec/swfdec_buffer.c libswfdec/swfdec_buffer.h libswfdec/swfdec_cache.c
- Branch 'as' - 9 commits - libswfdec-gtk/swfdec_playback_alsa.c libswfdec/js libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c
- 2 commits - libswfdec/swfdec_sprite.c