From 6cd1f5040fed1385c2990a68d6017a7ca6c37103 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 11 May 2012 22:38:27 +0100 Subject: [PATCH] clip: Apply clip boxes to the clip surface As we convert the unaligned clip boxes to a region, we need to process the intersection of the boxes with the clip surface as a separate step. Fixes tighten-box for the base compositor. Signed-off-by: Chris Wilson --- src/cairo-clip-surface.c | 86 ++++++++++++++++-- .../tighten-bounds.base.argb32.ref.png | Bin 8490 -> 8512 bytes .../tighten-bounds.base.rgb24.ref.png | Bin 7847 -> 7873 bytes 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/cairo-clip-surface.c b/src/cairo-clip-surface.c index 523cd4248..fff972403 100644 --- a/src/cairo-clip-surface.c +++ b/src/cairo-clip-surface.c @@ -91,6 +91,33 @@ _cairo_clip_combine_with_surface (const cairo_clip_t *clip, return status; } +static cairo_status_t +_cairo_path_fixed_add_box (cairo_path_fixed_t *path, + const cairo_box_t *box, + cairo_fixed_t fx, + cairo_fixed_t fy) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, box->p1.x + fx, box->p1.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x + fx, box->p1.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x + fx, box->p2.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p1.x + fx, box->p2.y + fy); + if (unlikely (status)) + return status; + + return _cairo_path_fixed_close_path (path); +} + cairo_surface_t * _cairo_clip_get_surface (const cairo_clip_t *clip, cairo_surface_t *target, @@ -98,16 +125,51 @@ _cairo_clip_get_surface (const cairo_clip_t *clip, { cairo_surface_t *surface; cairo_status_t status; - cairo_clip_t *copy; + cairo_clip_t *copy, *region; cairo_clip_path_t *copy_path, *clip_path; - surface = _cairo_surface_create_similar_solid (target, - CAIRO_CONTENT_ALPHA, - clip->extents.width, - clip->extents.height, - CAIRO_COLOR_WHITE); - if (unlikely (surface->status)) - return surface; + if (clip->num_boxes) { + cairo_path_fixed_t path; + int i; + + surface = _cairo_surface_create_similar_solid (target, + CAIRO_CONTENT_ALPHA, + clip->extents.width, + clip->extents.height, + CAIRO_COLOR_TRANSPARENT); + if (unlikely (surface->status)) + return surface; + + _cairo_path_fixed_init (&path); + status = CAIRO_STATUS_SUCCESS; + for (i = 0; status == CAIRO_STATUS_SUCCESS && i < clip->num_boxes; i++) { + status = _cairo_path_fixed_add_box (&path, &clip->boxes[i], + -_cairo_fixed_from_int (clip->extents.x), + -_cairo_fixed_from_int (clip->extents.y)); + } + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_surface_fill (surface, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + &path, + CAIRO_FILL_RULE_WINDING, + 1., + CAIRO_ANTIALIAS_DEFAULT, + NULL); + _cairo_path_fixed_fini (&path); + if (unlikely (status)) { + cairo_surface_destroy (surface); + return _cairo_surface_create_in_error (status); + } + } else { + surface = _cairo_surface_create_similar_solid (target, + CAIRO_CONTENT_ALPHA, + clip->extents.width, + clip->extents.height, + CAIRO_COLOR_WHITE); + if (unlikely (surface->status)) + return surface; + } copy = _cairo_clip_copy_with_translation (clip, -clip->extents.x, @@ -115,6 +177,10 @@ _cairo_clip_get_surface (const cairo_clip_t *clip, copy_path = copy->path; copy->path = NULL; + region = copy; + if (! _cairo_clip_is_region (copy)) + region = _cairo_clip_copy_region (copy); + status = CAIRO_STATUS_SUCCESS; clip_path = copy_path; while (status == CAIRO_STATUS_SUCCESS && clip_path) { @@ -125,12 +191,14 @@ _cairo_clip_get_surface (const cairo_clip_t *clip, clip_path->fill_rule, clip_path->tolerance, clip_path->antialias, - copy); + region); clip_path = clip_path->prev; } copy->path = copy_path; _cairo_clip_destroy (copy); + if (region != copy) + _cairo_clip_destroy (region); if (unlikely (status)) { cairo_surface_destroy (surface); diff --git a/test/reference/tighten-bounds.base.argb32.ref.png b/test/reference/tighten-bounds.base.argb32.ref.png index 169d9dee3dd3415476ee5d76ec60bbbc45e986ce..dad3a7fc9c2a6f16653162eed105a51395a642c3 100644 GIT binary patch literal 8512 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 literal 8490 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 diff --git a/test/reference/tighten-bounds.base.rgb24.ref.png b/test/reference/tighten-bounds.base.rgb24.ref.png index d984ff734503b5017bf963ec9746a08d7f4d3746..9d3a252625b57a9eef92981dbbc6552ecbd3ed5f 100644 GIT binary patch literal 7873 zcmaiZ2|Sc-+x|Ucn6b~;mzXigk|N5UW$alRy9h%_5)wjajIkwIqGZXMJwytHp@l3N z%DxTRm+~aC`$j$A`@HY_{eJ)dHS?Q$w(Gp^>%8vkIF9qUW3eWB%nW=C001x>=xdt+ z0GNgP-V+9D$U`nY!SC@(s}XXSakaIUdWKsa*%9^UF+Z4+@DS@C_NaooT3g8z6z`jeey z)h<8F{T++`M$6C!uUkPfrZ8YlRwgp~mZd9ZLOU&EjU> zkH?%?Tj)BAo?+DNAcjT@)|xI!xL9M*?uq9n>=w8RXYyrYUS9;L7H#Q}VCztcEk2@~5$cq)P7jO5YhjQNk z)L;jo%NW>#zi$ga)SUf?vf z<%!5qzQ9SJ;aZZhj1f0b&XOs5>qit;_PMHgv$eP5>*0CsSP_Bv{iJkw?;SEk$IOsy6+RvOwJv{KW6lV%Pt zJdK@!&2{}QnMuM7e&CRelyEmmvkS_+b52cRQ_lmVy;ny}W@$0zG%;a{)s>nzQ!;c4 z_xc?cxvOOzg0UVk_p?qQ+f%zdYAy;U#%z@dNL0U19yCi@qlZypAaP889B{uA_FN7gPQ>p&Y zrJ#Z*#ALHJ_6Fh|PzCtFkUfmq$9e;H3$%_`xO@17<{O=ZnVJTag6yOVzKPK`CZT*X zT4?;{AQhOewS2c>@@WQA*`kEnIcw#W9t+HVchn<~Ar1G;dVZ{liD&H2sd-z&;^rMZ za$)8U&sLEXTVWXkyNNtZ-bU>@=Z|6ZkY`x0-5odfC2#pRz!)7Sze|4(Mh*M-&o*9Q z_q~IALg%6^F9ua7Z}ZIU^dr@f;~I|;O0E!Vex%!BpDxIi`j<(Ak&QjV=O

0b5j9ihQR3N4O@ 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 literal 7847 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