Re: PATCH cairo-www: add outside-clipping cookbook example

Bryce Harrington <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On Sat, Jan 16, 2016 at 02:36:06PM +1300, Lawrence D'Oliveiro wrote:
> Thought it might be useful to demonstrate this technique.

Thanks, pushed:

To git+ssh://cairographics.org/git/cairo-www
   32153d8..f4534a3  master -> master


> From 6ffa8c1dd0979bc75b93af20534822a370283d88 Mon Sep 17 00:00:00 2001
> From: Lawrence D'Oliveiro <[email protected]>
> Date: Sat, 16 Jan 2016 01:33:13 +0000
> Subject: [PATCH] add outside-clipping cookbook example
> 
> ---
>  src/cookbook.mdwn                              |   1 +
>  src/cookbook/outside_clipping.mdwn             |  89 +++++++++++++++++++++++++
>  src/cookbook/outside_clipping/outside_clip.png | Bin 0 -> 3988 bytes
>  3 files changed, 90 insertions(+)
>  create mode 100644 src/cookbook/outside_clipping.mdwn
>  create mode 100644 src/cookbook/outside_clipping/outside_clip.png
> 
> diff --git a/src/cookbook.mdwn b/src/cookbook.mdwn
> index 9e5471b..f9cb78e 100644
> --- a/src/cookbook.mdwn
> +++ b/src/cookbook.mdwn
> @@ -6,6 +6,7 @@
>      * [[Rounded_rectangles|roundedrectangles]]
>      * [[Ellipses With Uniform Stroke Width|ellipses]]
>      * [[A_description_of_compositing_operators_in_Cairo|operators]]
> +    * [[Clipping Outside A Region|outside_clipping]]
>  
>  + Matrix Transformations
>      * [[Basic_matrix_transformation_reminder|matrix_transform]]
> diff --git a/src/cookbook/outside_clipping.mdwn b/src/cookbook/outside_clipping.mdwn
> new file mode 100644
> index 0000000..6220b18
> --- /dev/null
> +++ b/src/cookbook/outside_clipping.mdwn
> @@ -0,0 +1,89 @@
> +[[!meta title="Clipping Outside A Region"]]
> +
> +Cairo lets you clip drawing to arbitrary regions defined by paths. The basic technique
> +is:
> +
> +  * construct your path
> +  * use [`cairo_clip()`](http://cairographics.org/manual/cairo-cairo-t.html#cairo-clip)
> +    to intersect the clip region with the interior of your path.
> +
> +Note that the intersection is with the *interior* of your path—that is, the area
> +that would be filled if you did a `cairo_fill()` operation on your path. But supposing
> +you have a path, and you want drawing to be clipped to the *exterior* of that path?
> +
> +The way to reverse the definitions of “interior” and “exterior” is simple: simply add
> +another subpath to your path, surrounding the entire drawing area. If you use
> +`CAIRO_FILL_RULE_WINDING` for your fill rule (the default), then make sure the enclosing
> +subpath is defined in the opposite direction to the inner one. Now the interior of
> +the path becomes the area between the subpaths, rather than inside the inner subpath.
> +
> +Alternatively, you can use `CAIRO_FILL_RULE_EVEN_ODD` for your fill rule, then the
> +subpath directions don’t matter.
> +
> +    const int img_size = 300;
> +    cairo_surface_t * const pix = cairo_image_surface_create
> +      (
> +        /*format =*/ CAIRO_FORMAT_RGB24,
> +        /*width =*/ img_size,
> +        /*height =*/ img_size
> +      );
> +    cairo_t * const cr = cairo_create(pix);
> +    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
> +      /* use overwriting operator to make clear that overwriting is blocked by clipping */
> +    cairo_set_source_rgb(cr, 1, 1, 1); /* background */
> +    cairo_paint(cr);
> +    for (bool outside = false;;)
> +      {
> +      /* Do two drawing passes, once clipped inside the region, then clipped outside. */
> +      /* Because of the clipping, the second pass does not overwrite the first. */
> +        cairo_reset_clip(cr);
> +        cairo_new_path(cr);
> +        cairo_arc /* example inner region--note subpath is defined clockwise */
> +          (
> +            /*cr =*/ cr,
> +            /*xc =*/ img_size / 2.0,
> +            /*yc =*/ img_size / 2.0,
> +            /*radius =*/ img_size / 4.0,
> +            /*angle1 =*/ 0,
> +            /*angle2 =*/ 2 * M_PI
> +          );
> +        if (outside)
> +          {
> +          /* add outer subpath in anticlockwise direction */
> +            cairo_new_sub_path(cr);
> +            cairo_move_to(cr, img_size, 0);
> +            cairo_line_to(cr, 0, 0);
> +            cairo_line_to(cr, 0, img_size);
> +            cairo_line_to(cr, img_size, img_size);
> +            cairo_close_path(cr);
> +          } /*if*/
> +        cairo_clip(cr);
> +        if (outside) /* use different colours to distinguish cases */
> +          {
> +            cairo_set_source_rgb(cr, 1.0, 0.91, 0.83);
> +          }
> +        else
> +          {
> +            cairo_set_source_rgb(cr, 0.1, 0.7, 0.67);
> +          } /*if*/
> +        cairo_rectangle
> +          /* example shape that extends both inside and outside inner clipping region */
> +          (
> +            /*cr =*/ cr,
> +            /*x =*/ 0,
> +            /*y =*/ img_size / 4.0,
> +            /*width =*/ img_size,
> +            /*height =*/ img_size / 2.0
> +          );
> +        cairo_fill(cr);
> +        if (outside)
> +            break;
> +        outside = true;
> +      } /*for*/
> +
> +Sample output:
> +
> +[[!img "outside_clip.png" link="no"]]
> +
> +This technique also extends to more than one inner subpath, defining multiple discontiguous
> +inner regions to be clipped out of the drawing area.
> diff --git a/src/cookbook/outside_clipping/outside_clip.png b/src/cookbook/outside_clipping/outside_clip.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..e9d406caf79903eb68aeffcac3af39747e60a2d2
> GIT binary patch
> literal 3988
> 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
> aY}cb~fjGd&q?0zANl)8I3#aku)qep>n`w>!
> 
> literal 0
> HcmV?d00001
> 
> -- 
> 2.6.0
> 

> -- 
> cairo mailing list
> [email protected]
> http://lists.cairographics.org/mailman/listinfo/cairo

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.