diff options
author | Benjamin Otte <otte@gnome.org> | 2007-08-29 23:57:15 +0200 |
---|---|---|
committer | Benjamin Otte <otte@gnome.org> | 2009-12-17 13:03:17 +0100 |
commit | 0fbdc100b58502ff59f4981dc529b7d1573835a2 (patch) | |
tree | 4c679cce509e579f3da706020de046d1fd34b40b | |
parent | 86aac5f2b7dd5b2685b92225a7ba1c03949928a7 (diff) |
add blend modes
also up cairo requirement to >= 1.9.4
-rw-r--r-- | configure.ac | 9 | ||||
-rw-r--r-- | swfdec/swfdec_movie.c | 41 |
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); } } |