Re: PATCH: cairo-www: add ellipses cookbook example
Bryce Harrington <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
On Wed, Dec 23, 2015 at 04:12:24PM +1300, Lawrence D'Oliveiro wrote: > From ef369fe63ffaf504ca66496047e667e39e17bc2c Mon Sep 17 00:00:00 2001 > From: Lawrence D'Oliveiro <[email protected]> > Date: Wed, 23 Dec 2015 03:11:00 +0000 > Subject: [PATCH] add ellipses cookbook example Thanks, pushed: To git+ssh://cairographics.org/git/cairo-www 3a0314a..32153d8 master -> master > --- > src/cookbook.mdwn | 1 + > src/cookbook/ellipses.mdwn | 114 ++++++++++++++++++++++++++++++++ > src/cookbook/ellipses/ellipse_right.png | Bin 0 -> 5649 bytes > src/cookbook/ellipses/ellipse_wrong.png | Bin 0 -> 5685 bytes > 4 files changed, 115 insertions(+) > create mode 100644 src/cookbook/ellipses.mdwn > create mode 100644 src/cookbook/ellipses/ellipse_right.png > create mode 100644 src/cookbook/ellipses/ellipse_wrong.png > > diff --git a/src/cookbook.mdwn b/src/cookbook.mdwn > index f164bca..9e5471b 100644 > --- a/src/cookbook.mdwn > +++ b/src/cookbook.mdwn > @@ -4,6 +4,7 @@ > > + General Drawing > * [[Rounded_rectangles|roundedrectangles]] > + * [[Ellipses With Uniform Stroke Width|ellipses]] > * [[A_description_of_compositing_operators_in_Cairo|operators]] > > + Matrix Transformations > diff --git a/src/cookbook/ellipses.mdwn b/src/cookbook/ellipses.mdwn > new file mode 100644 > index 0000000..8779e47 > --- /dev/null > +++ b/src/cookbook/ellipses.mdwn > @@ -0,0 +1,114 @@ > +[[!meta title="Ellipses With Uniform Stroke Width"]] > + > +Cairo has built-in calls for drawing arcs of circles. The following discusses how to use them > +to draw ellipses. > + > +##Common Setup > + > +The following examples will be drawing an ellipse within an image area defined as follows: > + > + const int img_width = 256; > + const int img_height = 256; > + cairo_surface_t * const pix = cairo_image_surface_create > + ( > + /*format =*/ CAIRO_FORMAT_RGB24, > + /*width =*/ img_width, > + /*height =*/ img_height > + ); > + cairo_t * const cr = cairo_create(pix); > + > +The ellipse will be drawn as a circle centred within the drawing area. Before the circle > +is drawn, the following scaling is applied: > + > + cairo_translate(cr, img_width / 2.0, img_height / 2.0); > + cairo_scale(cr, 0.5, 1); > + cairo_translate(cr, - img_width / 2.0, - img_height / 2.0); > + > +This shrinks subsequent drawing operations (including path > +construction) horizontally by a factor of 0.5 [about the > +image centre](../transform_about_point), to turn the circle into an > +ellipse. The ellipse itself is then constructed very simply: > + > + cairo_arc > + ( > + /*cr =*/ cr, > + /*xc =*/ img_width / 2.0, > + /*yc =*/ img_height / 2.0, > + /*radius =*/ img_width / 3.0, > + /*angle1 =*/ 0, > + /*angle2 =*/ 2 * M_PI > + ); > + > +The following examples use a thick line width (20 units) to make the problem > +(and its solution) clearer. > + > +##The Wrong Way > + > +The obvious way to turn a circle into an ellipse is to apply non-uniform scaling to it. > +This works, but is prone to an interesting side-effect: > + > + cairo_set_source_rgb(cr, 1, 1, 1); > + cairo_paint(cr); > + cairo_set_source_rgb(cr, 0, 0, 0); > + cairo_translate(cr, img_width / 2.0, img_height / 2.0); > + cairo_scale(cr, 0.5, 1); > + cairo_translate(cr, - img_width / 2.0, - img_height / 2.0); > + cairo_new_path(cr); > + cairo_arc > + ( > + /*cr =*/ cr, > + /*xc =*/ img_width / 2.0, > + /*yc =*/ img_height / 2.0, > + /*radius =*/ img_width / 3.0, > + /*angle1 =*/ 0, > + /*angle2 =*/ 2 * M_PI > + ); > + cairo_set_line_width(cr, 20.0); > + cairo_stroke(cr); > + > +Example output: > + > +[[!img "ellipse_wrong.png" link="no"]] > + > +The problem is that the CTM also affects the `cairo_stroke` call. Thus, where the > +curve is narrow, the stroke gets narrow as well. This is probably not what you want. > + > +##The Right Way > + > +The answer is to apply the non-uniform scaling *only during the path construction*, > +and remove it before calling `cairo_stroke`. Here the CTM is saved before path > +construction, and restored after it: > + > + cairo_set_source_rgb(cr, 1, 1, 1); > + cairo_paint(cr); > + cairo_set_source_rgb(cr, 0, 0, 0); > + { > + cairo_matrix_t save_matrix; > + cairo_get_matrix(cr, &save_matrix); > + cairo_translate(cr, img_width / 2.0, img_height / 2.0); > + cairo_scale(cr, 0.5, 1); > + cairo_translate(cr, - img_width / 2.0, - img_height / 2.0); > + cairo_new_path(cr); > + cairo_arc > + ( > + /*cr =*/ cr, > + /*xc =*/ img_width / 2.0, > + /*yc =*/ img_height / 2.0, > + /*radius =*/ img_width / 3.0, > + /*angle1 =*/ 0, > + /*angle2 =*/ 2 * M_PI > + ); > + cairo_set_matrix(cr, &save_matrix); > + } > + cairo_set_line_width(cr, 20.0); > + cairo_stroke(cr); > + > +Example output: > + > +[[!img "ellipse_right.png" link="no"]] > + > +Much better, don’t you think? > + > +Alternatively you may call `cairo_save` to save the entire graphics state before > +the path construction, and `cairo_restore` afterwards, before the `cairo_stroke` > +call. Cairo’s saved graphics state includes the CTM, but not the current path itself. > diff --git a/src/cookbook/ellipses/ellipse_right.png b/src/cookbook/ellipses/ellipse_right.png > new file mode 100644 > index 0000000000000000000000000000000000000000..e2041bfc7b0481d1a23732b7d03c14d61696b5ae > GIT binary patch > literal 5649 > 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 > > literal 0 > HcmV?d00001 > > diff --git a/src/cookbook/ellipses/ellipse_wrong.png b/src/cookbook/ellipses/ellipse_wrong.png > new file mode 100644 > index 0000000000000000000000000000000000000000..720eaf860886cb5cf4503db733eb25e10fcff02d > GIT binary patch > literal 5685 > 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 > > 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