From 79b2a79f2d9ba8dbef44d04656fa84d83836ac6c Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Mon, 2 May 2005 11:01:18 +0000 Subject: [PATCH] src/cairo.[ch] src/cairo-gstate.c: Add cairo_mask() and cairo_mask_surface(). test/maks.c tests/Makefile.am tests/mask-ref.png: Add a comprehensive tests for cairo_mask(). Updated --- ChangeLog | 10 ++ doc/public/cairo-sections.txt | 2 + doc/public/tmpl/cairo.sgml | 20 +++ src/cairo-gstate.c | 259 +++++++++++++++++++++++++--------- src/cairo.c | 62 ++++++++ src/cairo.h | 10 ++ src/cairoint.h | 4 + test/Makefile.am | 3 + test/mask-ref.png | Bin 0 -> 58954 bytes test/mask.c | 241 +++++++++++++++++++++++++++++++ 10 files changed, 544 insertions(+), 67 deletions(-) create mode 100644 test/mask-ref.png create mode 100644 test/mask.c diff --git a/ChangeLog b/ChangeLog index 34459d562..86b945a5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-05-02 Owen Taylor + + * src/cairo.[ch] src/cairo-gstate.c: Add cairo_mask() + and cairo_mask_surface(). + + * test/maks.c tests/Makefile.am tests/mask-ref.png: Add a + comprehensive tests for cairo_mask(). + + * docs/public/cairo-sections.txt: Updated + 2005-05-02 Kristian Høgsberg * src/cairo-gstate.c (_cairo_gstate_glyph_path): Also call diff --git a/doc/public/cairo-sections.txt b/doc/public/cairo-sections.txt index 9e329b9c3..14a490b26 100644 --- a/doc/public/cairo-sections.txt +++ b/doc/public/cairo-sections.txt @@ -218,6 +218,8 @@ cairo_rel_curve_to cairo_rectangle cairo_close_path cairo_paint +cairo_mask +cairo_mask_surface cairo_stroke cairo_stroke_preserve cairo_fill diff --git a/doc/public/tmpl/cairo.sgml b/doc/public/tmpl/cairo.sgml index ceac45c08..342c1edaf 100644 --- a/doc/public/tmpl/cairo.sgml +++ b/doc/public/tmpl/cairo.sgml @@ -523,6 +523,26 @@ Drawing contexts. @cr: + + + + + +@cr: +@pattern: + + + + + + + +@cr: +@surface: +@surface_x: +@surface_y: + + diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index 1cc018168..f4bfb5d87 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -745,6 +745,192 @@ _cairo_gstate_paint (cairo_gstate_t *gstate) return CAIRO_STATUS_SUCCESS; } +/* Combines @gstate->clip_surface using the IN operator with + * the given intermediate surface, which corresponds to the + * rectangle of the destination space given by @extents. + */ +static cairo_status_t +_cairo_gstate_combine_clip_surface (cairo_gstate_t *gstate, + cairo_surface_t *intermediate, + cairo_rectangle_t *extents) +{ + cairo_pattern_union_t pattern; + cairo_status_t status; + + _cairo_pattern_init_for_surface (&pattern.surface, + gstate->clip.surface); + + status = _cairo_surface_composite (CAIRO_OPERATOR_IN, + &pattern.base, + NULL, + intermediate, + extents->x - gstate->clip.rect.x, + extents->y - gstate->clip.rect.y, + 0, 0, + 0, 0, + extents->width, extents->height); + + _cairo_pattern_fini (&pattern.base); + + return status; +} + +/* Creates a region from a cairo_rectangle_t */ +static cairo_status_t +_region_new_from_rect (cairo_rectangle_t *rect, + pixman_region16_t **region) +{ + *region = pixman_region_create (); + if (pixman_region_union_rect (*region, *region, + rect->x, rect->y, + rect->width, rect->height) != PIXMAN_REGION_STATUS_SUCCESS) { + pixman_region_destroy (*region); + return CAIRO_STATUS_NO_MEMORY; + } + + return CAIRO_STATUS_SUCCESS; +} + +/* Gets the bounding box of a region as a cairo_rectangle_t */ +static void +_region_rect_extents (pixman_region16_t *region, + cairo_rectangle_t *rect) +{ + pixman_box16_t *region_extents = pixman_region_extents (region); + + rect->x = region_extents->x1; + rect->y = region_extents->y1; + rect->width = region_extents->x2 - region_extents->x1; + rect->height = region_extents->y2 - region_extents->y1; +} + +/* Intersects @region with the clipping bounds (both region + * and surface) of @gstate + */ +static cairo_status_t +_cairo_gstate_intersect_clip (cairo_gstate_t *gstate, + pixman_region16_t *region) +{ + if (gstate->clip.region) + pixman_region_intersect (region, gstate->clip.region, region); + + if (gstate->clip.surface) { + pixman_region16_t *clip_rect; + cairo_status_t status; + + status = _region_new_from_rect (&gstate->clip.rect, &clip_rect); + if (!CAIRO_OK (status)) + return status; + + if (pixman_region_intersect (region, + clip_rect, + region) != PIXMAN_REGION_STATUS_SUCCESS) + status = CAIRO_STATUS_NO_MEMORY; + + pixman_region_destroy (clip_rect); + + if (!CAIRO_OK (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_get_mask_extents (cairo_gstate_t *gstate, + cairo_pattern_t *mask, + cairo_rectangle_t *extents) +{ + cairo_rectangle_t clip_rect; + pixman_region16_t *clip_region; + cairo_status_t status; + + status = _cairo_surface_get_clip_extents (gstate->surface, &clip_rect); + if (!CAIRO_OK (status)) + return status; + + status = _region_new_from_rect (&clip_rect, &clip_region); + if (!CAIRO_OK (status)) + return status; + + status = _cairo_gstate_intersect_clip (gstate, clip_region); + if (!CAIRO_OK (status)) + return status; + + _region_rect_extents (clip_region, extents); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_mask (cairo_gstate_t *gstate, + cairo_pattern_t *mask) +{ + cairo_rectangle_t extents; + cairo_surface_pattern_t intermediate_pattern; + cairo_pattern_t *effective_mask; + cairo_status_t status; + int mask_x, mask_y; + + _get_mask_extents (gstate, mask, &extents); + + if (gstate->clip.surface) { + /* When there is clip surface, we'll need to create a + * temporary surface that combines the clip and mask + */ + cairo_surface_t *intermediate; + + intermediate = cairo_surface_create_similar (gstate->clip.surface, + CAIRO_FORMAT_A8, + extents.width, + extents.height); + if (intermediate == NULL) + return CAIRO_STATUS_NO_MEMORY; + + status = _cairo_surface_composite (CAIRO_OPERATOR_SRC, + mask, NULL, intermediate, + extents.x, extents.y, + 0, 0, + 0, 0, + extents.width, extents.height); + if (!CAIRO_OK (status)) { + cairo_surface_destroy (intermediate); + return status; + } + + status = _cairo_gstate_combine_clip_surface (gstate, intermediate, &extents); + if (!CAIRO_OK (status)) { + cairo_surface_destroy (intermediate); + return status; + } + + _cairo_pattern_init_for_surface (&intermediate_pattern, intermediate); + cairo_surface_destroy (intermediate); + + effective_mask = &intermediate_pattern.base; + mask_x = extents.x; + mask_y = extents.y; + + } else { + effective_mask = mask; + mask_x = mask_y = 0; + } + + status = _cairo_surface_composite (gstate->operator, + gstate->source, + effective_mask, + gstate->surface, + extents.x, extents.y, + extents.x - mask_x, extents.y - mask_y, + extents.x, extents.y, + extents.width, extents.height); + + if (gstate->clip.surface) + _cairo_pattern_fini (&intermediate_pattern.base); + + return status; +} + cairo_status_t _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) { @@ -855,35 +1041,6 @@ _cairo_rectangle_empty (cairo_rectangle_t *rect) return rect->width == 0 || rect->height == 0; } -/* Creates a region from a cairo_rectangle_t */ -static cairo_status_t -_region_new_from_rect (cairo_rectangle_t *rect, - pixman_region16_t **region) -{ - *region = pixman_region_create (); - if (pixman_region_union_rect (*region, *region, - rect->x, rect->y, - rect->width, rect->height) != PIXMAN_REGION_STATUS_SUCCESS) { - pixman_region_destroy (*region); - return CAIRO_STATUS_NO_MEMORY; - } - - return CAIRO_STATUS_SUCCESS; -} - -/* Gets the bounding box of a region as a cairo_rectangle_t */ -static void -_region_rect_extents (pixman_region16_t *region, - cairo_rectangle_t *rect) -{ - pixman_box16_t *region_extents = pixman_region_extents (region); - - rect->x = region_extents->x1; - rect->y = region_extents->y1; - rect->width = region_extents->x2 - region_extents->x1; - rect->height = region_extents->y2 - region_extents->y1; -} - /* Given a region representing a set of trapezoids that will be * drawn, clip the region according to the gstate and compute * the overall extents. @@ -893,30 +1050,11 @@ _clip_and_compute_extents_region (cairo_gstate_t *gstate, pixman_region16_t *trap_region, cairo_rectangle_t *extents) { - if (gstate->clip.region) - pixman_region_intersect (trap_region, - gstate->clip.region, - trap_region); - - if (gstate->clip.surface) { - pixman_region16_t *clip_rect; - cairo_status_t status; + cairo_status_t status; - status = _region_new_from_rect (&gstate->clip.rect, - &clip_rect); - if (!CAIRO_OK (status)) - return status; - - if (pixman_region_intersect (trap_region, - clip_rect, - trap_region) != PIXMAN_REGION_STATUS_SUCCESS) - status = CAIRO_STATUS_NO_MEMORY; - - pixman_region_destroy (clip_rect); - - if (!CAIRO_OK (status)) - return status; - } + status = _cairo_gstate_intersect_clip (gstate, trap_region); + if (!CAIRO_OK (status)) + return status; _region_rect_extents (trap_region, extents); @@ -1058,8 +1196,8 @@ _composite_traps_intermediate_surface (cairo_gstate_t *gstate, cairo_traps_t *traps, cairo_rectangle_t *extents) { - cairo_surface_t *intermediate; cairo_pattern_union_t pattern; + cairo_surface_t *intermediate; cairo_surface_pattern_t intermediate_pattern; cairo_status_t status; @@ -1089,20 +1227,7 @@ _composite_traps_intermediate_surface (cairo_gstate_t *gstate, if (!CAIRO_OK (status)) goto out; - _cairo_pattern_init_for_surface (&pattern.surface, - gstate->clip.surface); - - status = _cairo_surface_composite (CAIRO_OPERATOR_IN, - &pattern.base, - NULL, - intermediate, - extents->x - gstate->clip.rect.x, - extents->y - gstate->clip.rect.y, - 0, 0, - 0, 0, - extents->width, extents->height); - _cairo_pattern_fini (&pattern.base); - + status = _cairo_gstate_combine_clip_surface (gstate, intermediate, extents); if (!CAIRO_OK (status)) goto out; diff --git a/src/cairo.c b/src/cairo.c index 316827f74..4f17fbeac 100644 --- a/src/cairo.c +++ b/src/cairo.c @@ -1494,6 +1494,68 @@ cairo_paint (cairo_t *cr) CAIRO_CHECK_SANITY (cr); } +/** + * cairo_mask: + * @cr: a cairo context + * @pattern: a #cairo_pattern_t + * + * A drawing operator that paints the current source + * using the alpha channel of @pattern as a mask. (Opaque + * areas of @mask are painted with the source, transparent + * areas are not painted.) + */ +void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern) +{ + CAIRO_CHECK_SANITY (cr); + if (cr->status) + return; + + cr->status = _cairo_gstate_mask (cr->gstate, pattern); + + CAIRO_CHECK_SANITY (cr); +} + +/** + * cairo_mask_surface: + * @cr: a cairo context + * @surface: a #cairo_surface_t + * @surface_x: X coordinate at which to place the origin of @surface + * @surface_y: Y coordinate at which to place the origin of @surface + * + * A drawing operator that paints the current source + * using the alpha channel of @surface as a mask. (Opaque + * areas of @surface are painted with the source, transparent + * areas are not painted.) + */ +void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y) +{ + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + + CAIRO_CHECK_SANITY (cr); + if (cr->status) + return; + + pattern = cairo_pattern_create_for_surface (surface); + if (!pattern) { + cr->status = CAIRO_STATUS_NO_MEMORY; + return; + } + + cairo_matrix_init_translate (&matrix, - surface_x, - surface_y); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + /** * cairo_stroke: * @cr: a cairo context diff --git a/src/cairo.h b/src/cairo.h index 58b58d82d..c0a122fdd 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -462,6 +462,16 @@ cairo_close_path (cairo_t *cr); void cairo_paint (cairo_t *cr); +void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern); + +void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y); + void cairo_stroke (cairo_t *cr); diff --git a/src/cairoint.h b/src/cairoint.h index 44618cc71..1a6ff3377 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -1051,6 +1051,10 @@ _cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y); cairo_private cairo_status_t _cairo_gstate_paint (cairo_gstate_t *gstate); +cairo_private cairo_status_t +_cairo_gstate_mask (cairo_gstate_t *gstate, + cairo_pattern_t *mask); + cairo_private cairo_status_t _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path); diff --git a/test/Makefile.am b/test/Makefile.am index f7f123828..ef625e665 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -10,6 +10,7 @@ gradient-alpha \ leaky-polygon \ line-width \ linear-gradient \ +mask \ move-to-show-surface \ paint \ path-data \ @@ -37,6 +38,7 @@ gradient-alpha-ref.png \ leaky-polygon-ref.png \ line-width-ref.png \ linear-gradient-ref.png \ +mask.png \ move-to-show-surface-ref.png \ coverage-ref.png \ clip-twice-ref.png \ @@ -105,6 +107,7 @@ gradient_alpha_LDADD = $(LDADDS) leaky_polygon_LDADD = $(LDADDS) line_width_LDADD = $(LDADDS) linear_gradient_LDADD = $(LDADDS) +mask_LDADD = $(LDADDS) move_to_show_surface_LDADD = $(LDADDS) paint_LDADD = $(LDADDS) path_data_LDADD = $(LDADDS) diff --git a/test/mask-ref.png b/test/mask-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..518e3d42701eb8f899a48c4f36795fb7834949b2 GIT binary patch literal 58954 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 + * Kristian Høgsberg + */ + +#include +#include "cairo-test.h" +#include + +#define WIDTH 64 +#define HEIGHT 64 +#define PAD 10 + +const char png_filename[] = "romedalen.png"; + +static void +set_solid_pattern (cairo_t *cr, int x, int y) +{ + cairo_set_source_rgb (cr, 0, 0, 0.6); +} + +static void +set_translucent_pattern (cairo_t *cr, int x, int y) +{ + cairo_set_source_rgba (cr, 0, 0, 0.6, 0.5); +} + +static void +set_gradient_pattern (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = + cairo_pattern_create_linear (x, y, x + WIDTH, y + HEIGHT); + cairo_pattern_add_color_stop (pattern, 0, 1, 1, 1, 1); + cairo_pattern_add_color_stop (pattern, 1, 0, 0, 0.4, 1); + cairo_set_pattern (cr, pattern); +} + +static void +set_image_pattern (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = cairo_test_create_png_pattern (cr, png_filename); + cairo_set_pattern (cr, pattern); +} + +static void +mask_polygon (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + mask_surface = cairo_surface_create_similar (cairo_get_target_surface (cr), + CAIRO_FORMAT_A8, + WIDTH, HEIGHT); + cr2 = cairo_create (); + cairo_set_target_surface (cr2, mask_surface); + + cairo_save (cr2); + cairo_set_source_rgba (cr2, 0, 0, 0, 0); /* transparent */ + cairo_set_operator (cr2, CAIRO_OPERATOR_SRC); + cairo_paint (cr2); + cairo_restore (cr2); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_new_path (cr2); + cairo_move_to (cr2, 0, 0); + cairo_line_to (cr2, 0, HEIGHT); + cairo_line_to (cr2, WIDTH / 2, 3 * HEIGHT / 4); + cairo_line_to (cr2, WIDTH, HEIGHT); + cairo_line_to (cr2, WIDTH, 0); + cairo_line_to (cr2, WIDTH / 2, HEIGHT / 4); + cairo_close_path (cr2); + cairo_fill (cr2); + + cairo_destroy (cr2); + + cairo_mask_surface (cr, mask_surface, x, y); + + cairo_surface_destroy (mask_surface); +} + +static void +mask_gradient (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_linear (x, y, + x + WIDTH, y + HEIGHT); + + cairo_pattern_add_color_stop_rgba (pattern, + 0, + 1, 1, 1, 1); + cairo_pattern_add_color_stop_rgba (pattern, + 1, + 1, 1, 1, 0); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +static void +clip_none (cairo_t *cr, int x, int y) +{ +} + +static void +clip_rects (cairo_t *cr, int x, int y) +{ + int height = HEIGHT / 3; + + cairo_new_path (cr); + cairo_rectangle (cr, x, y, WIDTH, height); + cairo_rectangle (cr, x, y + 2 * height, WIDTH, height); + cairo_clip (cr); +} + +static void +clip_circle (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_arc (cr, x + WIDTH / 2, y + HEIGHT / 2, + WIDTH / 2, 0, 2 * M_PI); + cairo_clip (cr); + cairo_new_path (cr); +} + +static void (*pattern_funcs[])(cairo_t *cr, int x, int y) = { + set_solid_pattern, + set_translucent_pattern, + set_gradient_pattern, + set_image_pattern, +}; + +static void (*mask_funcs[])(cairo_t *cr, int x, int y) = { + mask_gradient, + mask_polygon, +}; + +static void (*clip_funcs[])(cairo_t *cr, int x, int y) = { + clip_none, + clip_rects, + clip_circle, +}; + +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#define IMAGE_WIDTH (ARRAY_SIZE (pattern_funcs) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_SIZE (mask_funcs) * ARRAY_SIZE (clip_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_t test = { + "mask", + "Tests of cairo_mask", + IMAGE_WIDTH, IMAGE_HEIGHT +}; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *tmp_surface; + cairo_pattern_t *tmp_pattern; + int i, j, k; + cairo_t *cr2; + + /* Some of our drawing is unbounded, so we draw each test to + * a temporary surface and copy over. + */ + tmp_surface = cairo_surface_create_similar (cairo_get_target_surface (cr), + CAIRO_FORMAT_ARGB32, + IMAGE_WIDTH, IMAGE_HEIGHT); + cr2 = cairo_create (); + cairo_set_target_surface (cr2, tmp_surface); + + tmp_pattern = cairo_pattern_create_for_surface (tmp_surface); + cairo_set_source (cr, tmp_pattern); + + for (k = 0; k < ARRAY_SIZE (clip_funcs); k++) { + for (j = 0; j < ARRAY_SIZE (mask_funcs); j++) { + for (i = 0; i < ARRAY_SIZE (pattern_funcs); i++) { + int x = i * (WIDTH + PAD) + PAD; + int y = (ARRAY_SIZE (mask_funcs) * k + j) * (HEIGHT + PAD) + PAD; + + /* Clear area we are going to be drawing onto */ + cairo_save (cr2); + cairo_set_source_rgba (cr2, 0, 0, 0, 0); /* transparent */ + cairo_set_operator (cr2, CAIRO_OPERATOR_SRC); + cairo_rectangle (cr2, x, y, WIDTH, HEIGHT); + cairo_fill (cr2); + cairo_restore (cr2); + + /* draw */ + cairo_save (cr2); + + clip_funcs[k] (cr2, x, y); + pattern_funcs[i] (cr2, x, y); + mask_funcs[j] (cr2, x, y); + + cairo_restore (cr2); + + /* Copy back to the main pixmap */ + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill (cr); + } + } + } + + cairo_destroy (cr2); + cairo_surface_destroy (tmp_surface); + + return CAIRO_TEST_SUCCESS; +} + +int +main (void) +{ + return cairo_test (&test, draw); +}