summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2007-08-29 23:57:15 +0200
committerBenjamin Otte <otte@gnome.org>2009-12-17 13:03:17 +0100
commit0fbdc100b58502ff59f4981dc529b7d1573835a2 (patch)
tree4c679cce509e579f3da706020de046d1fd34b40b
parent86aac5f2b7dd5b2685b92225a7ba1c03949928a7 (diff)
add blend modes
also up cairo requirement to >= 1.9.4
-rw-r--r--configure.ac9
-rw-r--r--swfdec/swfdec_movie.c41
2 files changed, 36 insertions, 14 deletions
diff --git a/configure.ac b/configure.ac
index 754abb9b..835638b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -212,13 +212,8 @@ if test "$HAVE_LIBOIL" = "no"; then
AC_MSG_ERROR([liboil-0.3 >= $LIBOIL_VER is required to build swfdec])
fi
-CAIRO_VER=1.6.0
-PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VER cairo-png >= $CAIRO_VER, HAVE_CAIRO=yes, HAVE_CAIRO=no)
-AC_SUBST(CAIRO_LIBS)
-AC_SUBST(CAIRO_CFLAGS)
-if test "$HAVE_CAIRO" = "no"; then
- AC_MSG_ERROR([cairo and cairo-png = $CAIRO_VER is required to build swfdec])
-fi
+CAIRO_VER=1.9.4
+PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VER cairo-png >= $CAIRO_VER)
AC_ARG_ENABLE(gstreamer,
AS_HELP_STRING([--enable-gstreamer],
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 735cf781..7602e17e 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -691,16 +691,26 @@ swfdec_movie_get_operator_for_blend_mode (guint blend_mode)
case SWFDEC_BLEND_MODE_ERASE:
return CAIRO_OPERATOR_DEST_OUT;
case SWFDEC_BLEND_MODE_MULTIPLY:
+ return CAIRO_OPERATOR_MULTIPLY;
case SWFDEC_BLEND_MODE_SCREEN:
+ return CAIRO_OPERATOR_SCREEN;
case SWFDEC_BLEND_MODE_LIGHTEN:
+ return CAIRO_OPERATOR_LIGHTEN;
case SWFDEC_BLEND_MODE_DARKEN:
+ return CAIRO_OPERATOR_DARKEN;
case SWFDEC_BLEND_MODE_DIFFERENCE:
- case SWFDEC_BLEND_MODE_SUBTRACT:
+ return CAIRO_OPERATOR_DIFFERENCE;
case SWFDEC_BLEND_MODE_INVERT:
+ /* this should be special cased using (white IN src) DIFFERENCE dest */
+ g_assert_not_reached ();
+ return CAIRO_OPERATOR_OVER;
case SWFDEC_BLEND_MODE_OVERLAY:
+ return CAIRO_OPERATOR_OVERLAY;
case SWFDEC_BLEND_MODE_HARDLIGHT:
- SWFDEC_FIXME ("blend mode %u unimplemented in cairo", blend_mode);
- return CAIRO_OPERATOR_OVER;
+ return CAIRO_OPERATOR_HARD_LIGHT;
+ case SWFDEC_BLEND_MODE_SUBTRACT:
+ SWFDEC_FIXME ("subtract blend mode is not implemented.");
+ return CAIRO_OPERATOR_DIFFERENCE;
default:
SWFDEC_WARNING ("invalid blend mode %u", blend_mode);
return CAIRO_OPERATOR_OVER;
@@ -737,6 +747,25 @@ swfdec_movie_apply_filters (SwfdecMovie *movie, cairo_pattern_t *pattern)
return pattern;
}
+static void
+swfdec_paint_with_blend_mode (cairo_t *cr, guint blend_mode)
+{
+ if (blend_mode == SWFDEC_BLEND_MODE_INVERT) {
+ cairo_push_group (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ cairo_set_operator (cr, CAIRO_OPERATOR_IN);
+ cairo_paint (cr);
+ cairo_pop_group_to_source (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_DIFFERENCE);
+ cairo_paint (cr);
+ } else {
+ cairo_set_operator (cr, swfdec_movie_get_operator_for_blend_mode (blend_mode));
+ cairo_paint (cr);
+ }
+}
+
/**
* swfdec_movie_mask:
* @movie: The movie to act as the mask
@@ -872,14 +901,12 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
}
pattern = swfdec_movie_apply_filters (movie, pattern);
cairo_set_source (cr, pattern);
- cairo_set_operator (cr, swfdec_movie_get_operator_for_blend_mode (movie->blend_mode));
- cairo_paint (cr);
cairo_pattern_destroy (pattern);
+ swfdec_paint_with_blend_mode (cr, movie->blend_mode);
cairo_restore (cr);
} else if (group != SWFDEC_GROUP_NONE) {
cairo_pop_group_to_source (cr);
- cairo_set_operator (cr, swfdec_movie_get_operator_for_blend_mode (movie->blend_mode));
- cairo_paint (cr);
+ swfdec_paint_with_blend_mode (cr, movie->blend_mode);
}
}