From 0fd944d4bfbc2fff9960378eafd18a7d8fb9f296 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 Jul 2009 15:28:10 +0200 Subject: [PATCH] Use new pixman extended blend operators It also adds extended-blend tests. Based on a previous patch by Emmanuel Pacaud --- src/cairo-image-surface.c | 31 ++++++ src/cairo-misc.c | 30 ++++++ src/cairo.h | 53 +++++++++- test/Makefile.am | 4 + test/Makefile.sources | 2 + test/extended-blend-alpha.argb32.ref.png | Bin 0 -> 9777 bytes test/extended-blend-alpha.c | 115 ++++++++++++++++++++++ test/extended-blend-alpha.rgb24.ref.png | Bin 0 -> 5743 bytes test/extended-blend.argb32.ref.png | Bin 0 -> 4071 bytes test/extended-blend.c | 117 +++++++++++++++++++++++ test/extended-blend.rgb24.ref.png | Bin 0 -> 3772 bytes 11 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 test/extended-blend-alpha.argb32.ref.png create mode 100644 test/extended-blend-alpha.c create mode 100644 test/extended-blend-alpha.rgb24.ref.png create mode 100644 test/extended-blend.argb32.ref.png create mode 100644 test/extended-blend.c create mode 100644 test/extended-blend.rgb24.ref.png diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index 6bbf80cf1..d8d57c638 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -936,6 +936,37 @@ _pixman_operator (cairo_operator_t op) return PIXMAN_OP_ADD; case CAIRO_OPERATOR_SATURATE: return PIXMAN_OP_SATURATE; + + case CAIRO_OPERATOR_MULTIPLY: + return PIXMAN_OP_MULTIPLY; + case CAIRO_OPERATOR_SCREEN: + return PIXMAN_OP_SCREEN; + case CAIRO_OPERATOR_OVERLAY: + return PIXMAN_OP_OVERLAY; + case CAIRO_OPERATOR_DARKEN: + return PIXMAN_OP_DARKEN; + case CAIRO_OPERATOR_LIGHTEN: + return PIXMAN_OP_LIGHTEN; + case CAIRO_OPERATOR_COLOR_DODGE: + return PIXMAN_OP_COLOR_DODGE; + case CAIRO_OPERATOR_COLOR_BURN: + return PIXMAN_OP_COLOR_BURN; + case CAIRO_OPERATOR_HARD_LIGHT: + return PIXMAN_OP_HARD_LIGHT; + case CAIRO_OPERATOR_SOFT_LIGHT: + return PIXMAN_OP_SOFT_LIGHT; + case CAIRO_OPERATOR_DIFFERENCE: + return PIXMAN_OP_DIFFERENCE; + case CAIRO_OPERATOR_EXCLUSION: + return PIXMAN_OP_EXCLUSION; + case CAIRO_OPERATOR_HSL_HUE: + return PIXMAN_OP_HSL_HUE; + case CAIRO_OPERATOR_HSL_SATURATION: + return PIXMAN_OP_HSL_SATURATION; + case CAIRO_OPERATOR_HSL_COLOR: + return PIXMAN_OP_HSL_COLOR; + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return PIXMAN_OP_HSL_LUMINOSITY; default: return PIXMAN_OP_OVER; } diff --git a/src/cairo-misc.c b/src/cairo-misc.c index 8d9557e96..56c7d0b5e 100644 --- a/src/cairo-misc.c +++ b/src/cairo-misc.c @@ -334,6 +334,21 @@ _cairo_operator_bounded_by_mask (cairo_operator_t op) case CAIRO_OPERATOR_XOR: case CAIRO_OPERATOR_ADD: case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: return TRUE; case CAIRO_OPERATOR_OUT: case CAIRO_OPERATOR_IN: @@ -372,6 +387,21 @@ _cairo_operator_bounded_by_source (cairo_operator_t op) case CAIRO_OPERATOR_XOR: case CAIRO_OPERATOR_ADD: case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: return TRUE; case CAIRO_OPERATOR_CLEAR: case CAIRO_OPERATOR_SOURCE: diff --git a/src/cairo.h b/src/cairo.h index 8f7e53388..c2f209caa 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -422,6 +422,41 @@ cairo_pop_group_to_source (cairo_t *cr); * @CAIRO_OPERATOR_ADD: source and destination layers are accumulated * @CAIRO_OPERATOR_SATURATE: like over, but assuming source and dest are * disjoint geometries + * @CAIRO_OPERATOR_MULTIPLY: source and destination layers are multiplied. + * This causes the result to be at least as dark as the darker inputs. + * @CAIRO_OPERATOR_SCREEN: source and destination are complemented and + * multiplied. This causes the result to be at least as light as the lighter + * inputs. + * @CAIRO_OPERATOR_OVERLAY: multiplies or screens, depending on the + * lightness of the destination color. + * @CAIRO_OPERATOR_DARKEN: replaces the destination with the source if it + * is darker, otherwise keeps the source. + * @CAIRO_OPERATOR_LIGHTEN: replaces the destination with the source if it + * is lighter, otherwise keeps the source. + * @CAIRO_OPERATOR_COLOR_DODGE: brightens the destination color to reflect + * the source color. + * @CAIRO_OPERATOR_COLOR_BURN: darkens the destination color to reflect + * the source color. + * @CAIRO_OPERATOR_HARD_LIGHT: Multiplies or screens, dependant on source + * color. + * @CAIRO_OPERATOR_SOFT_LIGHT: Darkens or lightens, dependant on source + * color. + * @CAIRO_OPERATOR_DIFFERENCE: Takes the difference of the source and + * destination color. + * @CAIRO_OPERATOR_EXCLUSION: Produces an effect similar to difference, but + * with lower contrast. + * @CAIRO_OPERATOR_HSL_HUE: Creates a color with the hue of the source + * and the saturation and luminosity of the target. + * @CAIRO_OPERATOR_HSL_SATURATION: Creates a color with the saturation + * of the source and the hue and luminosity of the target. Painting with + * this mode onto a gray area prduces no change. + * @CAIRO_OPERATOR_HSL_COLOR: Creates a color with the hue and saturation + * of the source and the luminosity of the target. This preserves the gray + * levels of the target and is useful for coloring monochrome images or + * tinting color images. + * @CAIRO_OPERATOR_HSL_LUMINOSITY: Creates a color with the luminosity of + * the source and the hue and saturation of the target. This produces an + * inverse effect to @CAIRO_OPERATOR_HSL_COLOR. * * #cairo_operator_t is used to set the compositing operator for all cairo * drawing operations. @@ -458,7 +493,23 @@ typedef enum _cairo_operator { CAIRO_OPERATOR_XOR, CAIRO_OPERATOR_ADD, - CAIRO_OPERATOR_SATURATE + CAIRO_OPERATOR_SATURATE, + + CAIRO_OPERATOR_MULTIPLY, + CAIRO_OPERATOR_SCREEN, + CAIRO_OPERATOR_OVERLAY, + CAIRO_OPERATOR_DARKEN, + CAIRO_OPERATOR_LIGHTEN, + CAIRO_OPERATOR_COLOR_DODGE, + CAIRO_OPERATOR_COLOR_BURN, + CAIRO_OPERATOR_HARD_LIGHT, + CAIRO_OPERATOR_SOFT_LIGHT, + CAIRO_OPERATOR_DIFFERENCE, + CAIRO_OPERATOR_EXCLUSION, + CAIRO_OPERATOR_HSL_HUE, + CAIRO_OPERATOR_HSL_SATURATION, + CAIRO_OPERATOR_HSL_COLOR, + CAIRO_OPERATOR_HSL_LUMINOSITY } cairo_operator_t; cairo_public void diff --git a/test/Makefile.am b/test/Makefile.am index 81add8c88..68b9325b6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -308,6 +308,10 @@ REFERENCE_IMAGES = \ device-offset.ref.png \ device-offset.rgb24.ref.png \ device-offset-scale.ref.png \ + extended-blend.argb32.ref.png \ + extended-blend.rgb24.ref.png \ + extended-blend-alpha.argb32.ref.png \ + extended-blend-alpha.rgb24.ref.png \ extend-pad-border.ref.png \ extend-pad.ref.png \ extend-pad.ps.ref.png \ diff --git a/test/Makefile.sources b/test/Makefile.sources index e37b3e811..740982093 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -55,6 +55,8 @@ test_sources = \ extend-reflect-similar.c \ extend-repeat.c \ extend-repeat-similar.c \ + extended-blend.c \ + extended-blend-alpha.c \ fill-alpha.c \ fill-alpha-pattern.c \ fill-and-stroke.c \ diff --git a/test/extended-blend-alpha.argb32.ref.png b/test/extended-blend-alpha.argb32.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecd618706c38cb9c06b0bf76e8b4ad94158cd19 GIT binary patch literal 9777 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 literal 0 HcmV?d00001 diff --git a/test/extended-blend-alpha.c b/test/extended-blend-alpha.c new file mode 100644 index 000000000..e0316f35f --- /dev/null +++ b/test/extended-blend-alpha.c @@ -0,0 +1,115 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2007 Emmanuel Pacaud + * Copyright © 2008 Benjamin Otte + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Owen Taylor + * Kristian Høgsberg + * Emmanuel Pacaud + */ + +#include +#include "cairo-test.h" +#include + +#define STEPS 16 +#define START_OPERATOR CAIRO_OPERATOR_MULTIPLY +#define STOP_OPERATOR CAIRO_OPERATOR_HSL_LUMINOSITY + +static void +create_patterns (cairo_t *bg, cairo_t *fg) +{ + int x; + + for (x = 0; x < STEPS; x++) { + /* draw a yellow background fading in using discrete steps */ + cairo_set_source_rgba (bg, 1, 1, 0, (double) x / (STEPS - 1)); + cairo_rectangle (bg, x, 0, 1, STEPS); + cairo_fill (bg); + + /* draw an orthogonal teal pattern fading in using discrete steps */ + cairo_set_source_rgba (fg, 0, 1, 1, (double) x / (STEPS - 1)); + cairo_rectangle (fg, 0, x, STEPS, 1); + cairo_fill (fg); + } +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_blend (cairo_t *cr, cairo_operator_t op, cairo_surface_t *bg, cairo_surface_t *fg) +{ + /* not using CAIRO_OPERATOR_SOURCE here, it triggers a librsvg bug */ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint (cr); +} + +#define SIZE 5 +#define COUNT 4 +#define FULL_WIDTH ((STEPS + 1) * COUNT - 1) +#define FULL_HEIGHT ((COUNT + STOP_OPERATOR - START_OPERATOR) / COUNT) * (STEPS + 1) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + size_t i = 0; + cairo_operator_t op; + cairo_t *bgcr, *fgcr; + cairo_surface_t *bg, *fg; + + bg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, SIZE * STEPS, SIZE * STEPS); + fg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, SIZE * STEPS, SIZE * STEPS); + bgcr = cairo_create (bg); + fgcr = cairo_create (fg); + cairo_scale (bgcr, SIZE, SIZE); + cairo_scale (fgcr, SIZE, SIZE); + create_patterns (bgcr, fgcr); + cairo_destroy (bgcr); + cairo_destroy (fgcr); + + for (op = START_OPERATOR; op <= STOP_OPERATOR; op++, i++) { + cairo_save (cr); + cairo_translate (cr, + SIZE * (STEPS + 1) * (i % COUNT), + SIZE * (STEPS + 1) * (i / COUNT)); + do_blend (cr, op, bg, fg); + cairo_restore (cr); + } + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extended_blend_alpha, + "Tests extended blend modes with alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw) diff --git a/test/extended-blend-alpha.rgb24.ref.png b/test/extended-blend-alpha.rgb24.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..f62dda9594ebc2ac5e3821ddef2acb62fb04eca8 GIT binary patch literal 5743 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 avLTB*Oi%g#(4eR2jooo4n=)(P8~+D|v~7<7 literal 0 HcmV?d00001 diff --git a/test/extended-blend.c b/test/extended-blend.c new file mode 100644 index 000000000..cd2b06b99 --- /dev/null +++ b/test/extended-blend.c @@ -0,0 +1,117 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2007 Emmanuel Pacaud + * Copyright © 2008 Benjamin Otte + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Owen Taylor + * Kristian Høgsberg + * Emmanuel Pacaud + */ + +#include +#include "cairo-test.h" +#include + +#define STEPS 16 +#define START_OPERATOR CAIRO_OPERATOR_MULTIPLY +#define STOP_OPERATOR CAIRO_OPERATOR_HSL_LUMINOSITY + +static void +create_patterns (cairo_t *bg, cairo_t *fg) +{ + int x; + + for (x = 0; x < STEPS; x++) { + double i = (double) x / (STEPS - 1); + /* draw a yellow background fading in using discrete steps */ + cairo_set_source_rgba (bg, i, i, 0, 1); + cairo_rectangle (bg, x, 0, 1, STEPS); + cairo_fill (bg); + + /* draw an orthogonal teal pattern fading in using discrete steps */ + cairo_set_source_rgba (fg, 0, i, i, 1); + cairo_rectangle (fg, 0, x, STEPS, 1); + cairo_fill (fg); + } +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_blend (cairo_t *cr, cairo_operator_t op, cairo_surface_t *bg, cairo_surface_t *fg) +{ + /* not using CAIRO_OPERATOR_SOURCE here, it triggers a librsvg bug */ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint (cr); +} + +#define SIZE 5 +#define COUNT 4 +#define FULL_WIDTH ((STEPS + 1) * COUNT - 1) +#define FULL_HEIGHT ((COUNT + STOP_OPERATOR - START_OPERATOR) / COUNT) * (STEPS + 1) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + size_t i = 0; + cairo_operator_t op; + cairo_t *bgcr, *fgcr; + cairo_surface_t *bg, *fg; + + bg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, SIZE * STEPS, SIZE * STEPS); + fg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, SIZE * STEPS, SIZE * STEPS); + bgcr = cairo_create (bg); + fgcr = cairo_create (fg); + cairo_scale (bgcr, SIZE, SIZE); + cairo_scale (fgcr, SIZE, SIZE); + create_patterns (bgcr, fgcr); + cairo_destroy (bgcr); + cairo_destroy (fgcr); + + for (op = START_OPERATOR; op <= STOP_OPERATOR; op++, i++) { + cairo_save (cr); + cairo_translate (cr, + SIZE * (STEPS + 1) * (i % COUNT), + SIZE * (STEPS + 1) * (i / COUNT)); + do_blend (cr, op, bg, fg); + cairo_restore (cr); + } + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extended_blend, + "Tests extended blend modes without alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw) + diff --git a/test/extended-blend.rgb24.ref.png b/test/extended-blend.rgb24.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..53c1b226c9b7ba352b7be12151c3128c38093459 GIT binary patch literal 3772 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 I9X_4#Km8+Yg#Z8m literal 0 HcmV?d00001