PATCH: cairo-www: add ellipses cookbook example
Lawrence D'Oliveiro <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Organization | Geek Central |
| Message-ID | <[email protected]> |
-- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo
0001-add-ellipses-cookbook-example.patch
(text/x-patch, 18.8 KB)
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 --- 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