[Swfdec-commits] 4 commits - swfdec-gtk/swfdec_gtk_widget.c swfdec/swfdec_color.h swfdec/swfdec_movie_asprops.c swfdec/swfdec_player.c swfdec/swfdec_player.h swfdec/swfdec_text_format.c

Benjamin Otte company at kemper.freedesktop.org
Thu May 1 04:54:19 PDT 2008


 swfdec-gtk/swfdec_gtk_widget.c |   33 ++++++++++++++++++++++++++++-----
 swfdec/swfdec_color.h          |    5 ++++-
 swfdec/swfdec_movie_asprops.c  |    4 ++--
 swfdec/swfdec_player.c         |   41 +++++++++++++++++++++++++++++++++--------
 swfdec/swfdec_player.h         |    2 ++
 swfdec/swfdec_text_format.c    |   25 ++++++++++---------------
 6 files changed, 79 insertions(+), 31 deletions(-)

New commits:
commit 66c89b2586742b632008fbe9b3f997da25d4f055
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu May 1 13:45:41 2008 +0200

    change background handling again.
    
    Swfdec now no longer paints the background at all. This means it's now the
    developer's job to provide a correctly pre-colored image to draw on. The color
    for this can now be queried using swfdec_player_get_background_color().
    There's 2 advantages to this:
    1) We can set the X Window's background to the Flash's background color, so we
       don't need to do any background painting.
    2) We can easily support transparent wmode in browsers, because that mode does
       not render backgrounds at all.

diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 9ca4131..c533c79 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -504,11 +504,33 @@ swfdec_gtk_widget_update_renderer (SwfdecGtkWidget *widget)
 }
 
 static void
+swfdec_gtk_widget_update_background (SwfdecGtkWidget *widget)
+{
+  GdkWindow *window = GTK_WIDGET (widget)->window;
+  GdkColor bgcolor;
+
+  if (window == NULL)
+    return;
+
+  if (widget->priv->player) {
+    guint bg = swfdec_player_get_background_color (widget->priv->player);
+    bgcolor.red = 0x101 * ((bg >> 16) & 0xFF);
+    bgcolor.green = 0x101 * ((bg >> 8) & 0xFF);
+    bgcolor.blue = 0x101 * (bg & 0xFF);
+  } else {
+    /* white */
+    bgcolor.red = bgcolor.green = bgcolor.blue = 0xFFFF;
+  }
+  gdk_rgb_find_color (gdk_drawable_get_colormap (window), &bgcolor);
+  gdk_window_set_background (window, &bgcolor);
+
+}
+
+static void
 swfdec_gtk_widget_realize (GtkWidget *widget)
 {
   GdkWindowAttr attributes;
   gint attributes_mask;
-  GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF };
 
   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 
@@ -535,9 +557,7 @@ swfdec_gtk_widget_realize (GtkWidget *widget)
       &attributes, attributes_mask);
   gdk_window_set_user_data (widget->window, widget);
 
-  gdk_rgb_find_color (gdk_drawable_get_colormap (GDK_DRAWABLE (widget->window)), &white);
-  gdk_window_set_background (widget->window, &white);
-
+  swfdec_gtk_widget_update_background (SWFDEC_GTK_WIDGET (widget));
   widget->style = gtk_style_attach (widget->style, widget->window);
 
   if (SWFDEC_GTK_WIDGET (widget)->priv->player) {
@@ -713,6 +733,8 @@ swfdec_gtk_widget_notify_cb (SwfdecPlayer *player, GParamSpec *pspec, SwfdecGtkW
     gtk_widget_queue_resize (GTK_WIDGET (widget));
   } else if (g_str_equal (pspec->name, "fullscreen")) {
     swfdec_gtk_widget_do_fullscreen (widget, swfdec_player_get_fullscreen (player));
+  } else if (g_str_equal (pspec->name, "background-color")) {
+    swfdec_gtk_widget_update_background (widget);
   }
 }
 
@@ -754,9 +776,10 @@ swfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player)
     g_object_unref (priv->player);
   }
   priv->player = player;
-  gtk_widget_queue_resize (GTK_WIDGET (widget));
   g_object_notify (G_OBJECT (widget), "player");
+  gtk_widget_queue_resize (GTK_WIDGET (widget));
   swfdec_gtk_widget_update_renderer (widget);
+  swfdec_gtk_widget_update_background (widget);
   swfdec_gtk_widget_do_fullscreen (widget, player ? swfdec_player_get_fullscreen (player) : FALSE);
 }
 
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index cfd189b..232521e 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -653,6 +653,7 @@ enum {
   PROP_RATE,
   PROP_MOUSE_CURSOR,
   PROP_NEXT_EVENT,
+  PROP_BACKGROUND_COLOR,
   PROP_WIDTH,
   PROP_HEIGHT,
   PROP_ALIGNMENT,
@@ -750,6 +751,9 @@ swfdec_player_get_property (GObject *object, guint param_id, GValue *value,
     case PROP_NEXT_EVENT:
       g_value_set_uint (value, swfdec_player_get_next_event (player));
       break;
+    case PROP_BACKGROUND_COLOR:
+      g_value_set_uint (value, priv->bgcolor ? priv->bgcolor : SWFDEC_COLOR_WHITE);
+      break;
     case PROP_WIDTH:
       g_value_set_int (value, priv->stage_width);
       break;
@@ -1995,6 +1999,9 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
   g_object_class_install_property (object_class, PROP_CACHE_SIZE,
       g_param_spec_ulong ("cache-size", "cache size", "maximum cache size in bytes",
 	  0, G_MAXULONG, 50 * 1024 * 1024, G_PARAM_READWRITE));
+  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_READABLE));
   g_object_class_install_property (object_class, PROP_WIDTH,
       g_param_spec_int ("width", "width", "current width of the movie",
 	  -1, G_MAXINT, -1, G_PARAM_READWRITE));
@@ -2343,6 +2350,7 @@ swfdec_player_set_background_color (SwfdecPlayer *player, SwfdecColor bgcolor)
   SWFDEC_INFO ("setting bgcolor to %08X", bgcolor);
   priv->bgcolor = bgcolor;
   swfdec_player_invalidate (player, NULL);
+  g_object_notify (G_OBJECT (player), "background-color");
 }
 
 /**
@@ -2932,8 +2940,8 @@ swfdec_player_render_focusrect (SwfdecPlayer *player, cairo_t *cr, SwfdecRect *i
  * @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 using the player's
- * renderer.
+ * Renders the given area of the current frame to @cr. This function just calls 
+ * swfdec_player_render_with_renderer() using the @player's renderer.
  **/
 void
 swfdec_player_render (SwfdecPlayer *player, cairo_t *cr, 
@@ -2949,7 +2957,7 @@ swfdec_player_render (SwfdecPlayer *player, cairo_t *cr,
 }
 
 /**
- * swfdec_player_render:
+ * swfdec_player_render_with_renderer:
  * @player: a #SwfdecPlayer
  * @cr: #cairo_t to render to
  * @renderer: Renderer to use for rendering
@@ -2990,11 +2998,6 @@ swfdec_player_render_with_renderer (SwfdecPlayer *player, cairo_t *cr,
   cairo_save (cr);
   cairo_rectangle (cr, x, y, width, height);
   cairo_clip (cr);
-  /* paint the background */
-  if (priv->bgcolor) {
-    swfdec_color_set_source (cr, priv->bgcolor);
-    cairo_paint (cr);
-  }
   /* compute the rectangle */
   x -= priv->offset_x;
   y -= priv->offset_y;
@@ -3216,6 +3219,28 @@ swfdec_player_get_audio (SwfdecPlayer *	player)
 }
 
 /**
+* swfdec_player_get_background_color:
+* @player: a #SwfdecPlayer
+*
+* Gets the current suggested background color. The color will be an ARGB-color, 
+* with the MSB being the alpha value. Note that Swfdec will not render the 
+* background color itself, so if you want the background to not be translucent
+* it is your job to clear the background using this color.
+*
+* Returns: the background color as an ARGB value
+*/
+guint
+swfdec_player_get_background_color (SwfdecPlayer *player)
+{
+  guint bgcolor;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF));
+
+  bgcolor = player->priv->bgcolor;
+  return bgcolor ? bgcolor : SWFDEC_COLOR_WHITE;
+}
+
+/**
  * swfdec_player_get_scale_mode:
  * @player: a #SwfdecPlayer
  *
diff --git a/swfdec/swfdec_player.h b/swfdec/swfdec_player.h
index c6656bf..9855a47 100644
--- a/swfdec/swfdec_player.h
+++ b/swfdec/swfdec_player.h
@@ -115,6 +115,8 @@ void		swfdec_player_get_size		(SwfdecPlayer *	player,
 void		swfdec_player_set_size		(SwfdecPlayer *	player,
 						 int		width,
 						 int		height);
+guint		swfdec_player_get_background_color
+						(SwfdecPlayer *		player);
 SwfdecScaleMode	swfdec_player_get_scale_mode	(SwfdecPlayer *		player);
 void		swfdec_player_set_scale_mode	(SwfdecPlayer *		player,
 						 SwfdecScaleMode	mode);
commit adcee2e8f3458d247101ea11b1874594ccea7012
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu May 1 13:44:01 2008 +0200

    improve color creation macros
    
    - make sure colors are cast to SwfdecColor to prevent signedness warnings
    - add SWFDEC_COLOR_OPAQUE(color) to "remove" the alpha component
    - add SWFDEC_COLOR_WHITE to specify a white color

diff --git a/swfdec/swfdec_color.h b/swfdec/swfdec_color.h
index 188e6dd..77109bd 100644
--- a/swfdec/swfdec_color.h
+++ b/swfdec/swfdec_color.h
@@ -44,12 +44,15 @@ struct _SwfdecColorTransform {
 #error "Unknown byte order"
 #endif
 
-#define SWFDEC_COLOR_COMBINE(r,g,b,a)	(((a)<<24) | ((r)<<16) | ((g)<<8) | (b))
+#define SWFDEC_COLOR_COMBINE(r,g,b,a)	((SwfdecColor) (((a)<<24) | ((r)<<16) | ((g)<<8) | (b)))
+#define SWFDEC_COLOR_OPAQUE(color)	((SwfdecColor) ((color) | SWFDEC_COLOR_COMBINE (0, 0, 0, 0xFF)))
 #define SWFDEC_COLOR_A(x)		(((x)>>24)&0xff)
 #define SWFDEC_COLOR_R(x)		(((x)>>16)&0xff)
 #define SWFDEC_COLOR_G(x)		(((x)>>8)&0xff)
 #define SWFDEC_COLOR_B(x)		((x)&0xff)
 
+#define SWFDEC_COLOR_WHITE		SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF)
+
 SwfdecColor swfdec_color_apply_morph (SwfdecColor start, SwfdecColor end, guint ratio);
 void swfdec_color_set_source (cairo_t *cr, SwfdecColor color);
 void swfdec_color_transform_init_identity (SwfdecColorTransform * trans);
commit f65eea09fd5b008a11347e0d5f5498de47c76a1f
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 30 10:51:55 2008 +0200

    always have a valid string in string properties
    
    This gets around having to check for font != NULL everywhere and is less
    crash-prone.

diff --git a/swfdec/swfdec_text_format.c b/swfdec/swfdec_text_format.c
index fb83c86..e3e3d9b 100644
--- a/swfdec/swfdec_text_format.c
+++ b/swfdec/swfdec_text_format.c
@@ -65,14 +65,11 @@ swfdec_text_format_do_mark (SwfdecAsObject *object)
 {
   SwfdecTextFormat *format = SWFDEC_TEXT_FORMAT (object);
 
-  if (format->font != NULL)
-    swfdec_as_string_mark (format->font);
   if (format->tab_stops != NULL)
     swfdec_as_object_mark (SWFDEC_AS_OBJECT (format->tab_stops));
-  if (format->target != NULL)
-    swfdec_as_string_mark (format->target);
-  if (format->url != NULL)
-    swfdec_as_string_mark (format->url);
+  swfdec_as_string_mark (format->font);
+  swfdec_as_string_mark (format->target);
+  swfdec_as_string_mark (format->url);
 
   SWFDEC_AS_OBJECT_CLASS (swfdec_text_format_parent_class)->mark (object);
 }
@@ -86,8 +83,11 @@ swfdec_text_format_class_init (SwfdecTextFormatClass *klass)
 }
 
 static void
-swfdec_text_format_init (SwfdecTextFormat *text_format)
+swfdec_text_format_init (SwfdecTextFormat *format)
 {
+  format->font = SWFDEC_AS_STR_Times_New_Roman;
+  format->target = SWFDEC_AS_STR_EMPTY;
+  format->url = SWFDEC_AS_STR_EMPTY;
 }
 
 static gboolean
@@ -149,12 +149,13 @@ swfdec_text_format_set_string (SwfdecAsObject *object,
 
   if (SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0]) ||
       SWFDEC_AS_VALUE_IS_NULL (&argv[0])) {
-    G_STRUCT_MEMBER (const char *, format, property_offsets[property]) = NULL;
+    /* FIXME: reset to defaults here? */
     swfdec_text_format_mark_unset (format, property);
   } else {
     G_STRUCT_MEMBER (const char *, format, property_offsets[property]) = s;
     swfdec_text_format_mark_set (format, property);
   }
+  /* FIXME: figure out what to do here */
 }
 
 static void
@@ -862,10 +863,7 @@ swfdec_text_format_getTextExtent (SwfdecAsContext *cx, SwfdecAsObject *object,
     pango_shape (text, strlen (text), &analysis, glyph_string);
 
     desc = pango_font_description_new ();
-    if (format->font == NULL)
-      pango_font_description_set_family_static (desc, SWFDEC_AS_STR_Times_New_Roman);
-    else
-      pango_font_description_set_family_static (desc, format->font);
+    pango_font_description_set_family_static (desc, format->font);
     pango_font_description_set_size (desc, format->size * PANGO_SCALE);
     if (format->bold){
       pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
@@ -1125,10 +1123,7 @@ swfdec_text_format_set_defaults (SwfdecTextFormat *format)
 static void
 swfdec_text_format_clear (SwfdecTextFormat *format)
 {
-  format->font = NULL;
-  format->target = NULL;
   format->tab_stops = NULL;
-  format->url = NULL;
   format->values_set = 0;
 
   format->display = SWFDEC_TEXT_DISPLAY_BLOCK;
commit 3608d3177bf921d8e4e277d7fd32f4cc6ea591bc
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 30 09:00:22 2008 +0200

    make some debug messages FIXMEs instead of ERRORs

diff --git a/swfdec/swfdec_movie_asprops.c b/swfdec/swfdec_movie_asprops.c
index cc9b891..eb701c7 100644
--- a/swfdec/swfdec_movie_asprops.c
+++ b/swfdec/swfdec_movie_asprops.c
@@ -324,7 +324,7 @@ mc_rotation_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   if (SWFDEC_AS_OBJECT (movie)->context->version < 5) {
     if (!isfinite (d))
       return;
-    SWFDEC_ERROR ("FIXME: implement correct rounding errors here");
+    SWFDEC_FIXME ("implement correct rounding errors here");
   }
   movie->modified = TRUE;
   if (movie->rotation != d) {
@@ -516,7 +516,7 @@ swfdec_movie_get_asprop_index (SwfdecMovie *movie, const char *name)
       if (swfdec_movieclip_props[i].needs_movie && !SWFDEC_IS_SPRITE_MOVIE (movie))
 	return -1;
       if (swfdec_movieclip_props[i].get == NULL) {
-	SWFDEC_ERROR ("property %s not implemented", name);
+	SWFDEC_FIXME ("property %s not implemented", name);
       }
       return i;
     }


More information about the Swfdec-commits mailing list