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
> zcmc&&^;?r`+<!J0j1EV4w=l2>VQ^@q6?I6X7zh$N;s_%IB&SFzAdM&>3L~T&q(MOi
> zM<eNQwA6ch&Ut@%|AF_~^;~<d``+&Sen0VjY++`=M9)hPK@gLXp{^AK!N4mFLc+n<
> z2&)zve9<_Y80bRBe?D3Dg^3Wv(P5;kebFy{EyLd;=`&yFKu^58y%J}$oIOm>LVCjD
> z0g(~W(v6mAb1!(F+$~~sr{Mj&wBmcW<vVYAHQSkdL?l^GM`uaT&_ulw*?C{oE&58H
> zG`|zsKOo`a|I&wCoBm_t?0|n`9eHnJ!{bL?`p`{rWQ#1P4lRaNL>tCh@c;3=V^@QG
> zxEX2U^hYKpCWeQ-cYfOGM1_Tg>15x#e_ue&_thiBk$4&hs)_&NrAtMhZxgY0mX=<7
> zl=;%qQn#bDj0`&r24i7i;p^+`?(UAk;M07Rk&zBjXo30p`4?wBNtJhB*u0sy)bw2(
> ztnv9#ke5eIOKUw4p#dSX63hzs4|gUnmtMPy#Tw@~zjNt4X<xVd`LYACq9Sitn1U43
> zVaYJt*%;8;|NZ;<jA7Bm*ONi}riCMPhYla<QFva1cz!xMI<($caC%cy)8YOO!(rn`
> zS`;2$Qc~hszm;56do<gddA_!&$Y}A{mU-$l^el{)rD1R31rrm~4N_@B!oWA;9f!Yv
> z>8W^LzA<IzcElam;n}cvqa&7QfqWQF`0(Mw(nz7A-G@((N~yss?_mZ|=0w9obqNUx
> zDJg?RVb_J;G}}sduLln})uP0;VY`EagRDYA!AA%F*<l*ur%r7)g-~T?X6n#B5tPO>
> z7QKG`T=QXoscGDxb|xm@YJOqi_ud|zfUa{EbU6DlNe+!hho*1tL`OzOVoL;7z4HdO
> z^Qh?uSx)hq`ubMr=d!7F1<%aR`fM&*CK*fkvUcO)n@JrV9qa4&&^t%8j6#|RbKQv^
> z9v)yq8b7`Y^NCuVqN?iEgZh`Ol%2_7DJdx&4#yy%%bNw&yC`vk<@-?PjIzTvlUzFE
> z6|fbCi>P4;v6!LQu<Jb8@KC34QRvQS@zwGhaf34AkUiC=j+vR6vvUsWWhM6NRj~e!
> z_I9xTPg&4;O9uz7fX&6^WX|lc^|rpglH%gto*t7$;TZ&C@$v5NE)^|vYR-HJ6)g=7
> z&4=3B6FMHGx~o^Oe*O0Cb~KZOxcKVV@=laO4|NDhCkeVUR+`^X^?hPOSy|cG#AGYr
> zaCUrnWh*~FKZZ;3!TtOB4MWAn^4Z(jyV|f!)4O*|VqzHD?HA|fHn+wcCTn~Of2>tj
> zRRwQ-z8oJPk2+goA-%k^(pNqyPD{Ve$Vk(=xilj4pgF}pps2F4k_@ZBu2tL`k)}yS
> zyF@HKNXY|(Hot8=GJf;p>Xj?<4h<8IN}FfHnjNoHy7RPO4;_8$;2CNs;ctO2ymjkV
> z_Lg8sNy*yw+PH|*`||R&)zw$wmeQzmF_g(H$h_R|m$R&ZM-v_f!ZqYacVA!reA95g
> z$+W*K4gEUx>C>k#2D~UKx$EI^vgD$ws_N+I==#O&?QPz;2pd^{JY1u>&VOU-Fm|>&
> zj_>R+Q>DjuH9sXC!`ruIzdKsdBK&l3-I7U)=~rw#7)Jdf1s^~3JHx;bqvF<|Dw?UQ
> z4HHD)U%u$a@&fJBVa-x=)9d)?P{z8T=|o3c+kZdsp6g=so1{=E%1ar^wpAXMX?vL|
> zDQ+JK!*GYlpsuRPAO=s@t>w=Jeks$()ipJTlpe+P2g)ic({WwY*-R(|*U4*B=a{Rd
> zMuvxb6VFIUAh?ret0@%kjXVxjY5dU5Q~fWsgudk0)zv+J@uDxWGC#k4e4LMaH|{J+
> z$sGG649>l>ybRz2e<-7_KAxV2`#C|!=zizU_~4*pfA0+STUZy1)&Z2RBgn&(mY#k=
> z&fFpOeBd^SbP)yL`}YrbXA>$YhFqgkZ52eKOwz~kD$fm%klE_l&II%Hb5ERKH{3he
> z{S_63?3%WgMqx{mf4&)e8n(sexH4KoAekf6&IeZR1!{@74(Ay)IThyTU+;_;03)JC
> z4e;yh>oYUXq<L^F92^`+M@J~Jt&HX6<)$V~*PgAbtE;v)tljWw*b-aT>(}(d`*b28
> zAau5ZbfS#&jZIA-RajiP;<vSY3G1JS9D%!DzpnjJHQvPBypSV8h=+%Vu#*z2KU-k>
> zLVDo||0=zs689NT65}lq00c@(1RKGiSZ=harl#Pqj*U$+>hk#<L@k_O^Y7})O3q<;
> zNs$Uh^Y@~dVU2#S<(tpX-W#$!KtP$tv3zGwii(EXa3jGmCnPW6E1(IErxBJgHFb3y
> znZ$HUL`*EqhWngQ(5^_{!GPBB>hf|9hdx$GwrRRGl1!@ash#-z`7|2+#92_dyStnI
> zQ7FzoFfcGENV8poJ=7Am{qsA6jJc7~J0dZkgC;&B<9oWQkFWxSi}H2)rJXu-lV91@
> z@ZrPrWKOe}ngX1h`e^p_nVA`YQlxnji9{q4*KsWpv@v2BBO|)J9a;q9ammgJ9Z9ov
> zWQ~-qgG2Do3Ds!-Ja`Noirhyqa9Yso@JtocoZ)(M;}=T$)Tw7XXG<02<-s+y)yxDv
> ze0WF@`O8meu&k_Xq|kgMPCO`;4`j5$90M7I0GAtCD%>wHFhM{)8Ml|F;wJ1C!Tv}U
> z1_EAq-pI(P;%RDVcsMnQsGs|!*`TGD?%wJbw4rKVWEyO0gl?+;iKsM2%cAI_wzf8^
> z)j~>KylreO1*aP3L-mDy>i5<P;IC=Bla!5@w7u!7iMX|VlN11KM(EgGClhFjm1W8H
> z29+NV2m`}^o4Qy%Jv~{jMKx>a>gj3Q__?hq;}u}S2Dp}Rx}1RHAB|<@<zW+y*Fm!g
> z3~OuK^YNo!ih;hq6{Cw)PEL;BSf*BRLrF=TGxw8L0^~N3`Kb3WY*SW+%InhGvA+aS
> z#>^4a)%T|1WUQQ=+*Glg4?7#1)Aj4^wfqQz6k(Q^lXGEiP8S_(<mKzjNJlqq$Gn$M
> z;Af<RR7*wEj>d8L6c{Qoir<EMaLE^hd|gjx9G?L?mIpt9l$DbkS=mChM)BBCzk2<8
> zd3ANpj#)LAmD+GBKA!nOa*T@})K%u;>8UvNJMw@V?MyxA#jTzKlg5w%?b~9pU=K9K
> z#l^xZ;$LeR9rf_9U(1q+E*-Jiscr6<{?L<lA9T@=Q=Rni%geV(#O&;BRAMSq6f{<9
> zmz%2FTPBJzHDw}WyX|0Fkn+83=zUI6QBi$;2Cinx1he7t>6K;O9WV<xG?@rCg$qb%
> z@4Sz<H}9#NtnErST3cIP00`Ih@bFMu;O)83xO2CQFNDulXa5yRIcWf!qnf*-Q}BhJ
> zxy>Gh(JWJiv!b$Cltl3QxzlzrV)!~I9ehWJK8e^H51sXx$V%0%P!hrT_^6PvHw^H9
> zVDo|~HkEbiW$@9oo!qx1%zkKLp%nRBL4jnnk#5Yv<;VscIWsJbsu3GM3v@+sNy(DF
> zGT-;_-w8?bYHDi2Z=V^%_YxpN_C$NT-UmR~&Mq!gY2Do|!otBIJS=kt@Isw^eQ`Ji
> zdSO~&F(_{*iaM%Q{u*tM1H=#W8=FCb<{gZkot=y%8|ab7^H<}@f@CaDI$Zk*(N)!!
> zA9{dTTwb2B>)Agl^267$fyqtLkIy}6gb2AeU0nV`KNiMhQe{EjkTSdr19de*U+-IK
> zAHgv}9pb;V@tMtRS#B2i%qBLxGrO1QpH;CLK+#5Rj}H)ze^cX;criRb1}r59LW=s#
> zDME9XuhB>~$2!2b=;;SfNJH)7GrC7`r6Bg+U7sd<Fl}rC6stwM%7My~;ueBgK&nl<
> ziNYOZ_)at!@c@N<3k%Q()9XV#y~vPW+7@eJRVa;3G)y&w5Da_2k_R?~@1=Xz{2ocT
> z^vktO67#mp0qSsjq|zX*|Ie!d)RCgM%(2IS7lX)HPHMvOOtpZ303oKPwDjZ>i3uQI
> zXtBrm*RL}BeA*Nt*y`Gv2plu|nVr9DFCj58aWzoONgINzGkgd-RBIQ%K|@L6;_MGb
> zior4Q5_2auLaFxpxfrVOe;PEOi7t7zYp-stuV-=T)+vcVbAdxo1!1q>yzw71{=I^K
> z7)b|9J;X|v3mN`Ym&Pa>22f*Q0YDugmg1p*ApC#hkW}MCOVLcjUuz5!pq#A8(;`gZ
> zQdyh&`j{y1+JFE8d2~irR@QG!78MNyl@+5H2t9mL&;VdsbH%8=fAe1-EL0u->LSQ7
> zLZ-N|G{ym>93U<dkzD{L{LUbbSMT3!BM?|gL?GDJGUA=NRkB8wK%)DnB=D$2ICG<0
> zqalLWx36FQ=Ra~pJN06&Uzcz_kL)5pssN+0iRphCAKy5cGI5o44&Kz<?6kW+{Vzb2
> zRa7w2)6dx1TUqG<_&E3Q_bKwXsVPSW1{*aRxnrr23<L)!r_}{#ns@>Aj@smm4WX82
> z5Med|h|=xt2hmO!jBRblfobqd$%QD?-q-G{*?D=P+m$5qU%fJXJGODs?FT2TlQDj9
> z(4wp8?jIgjl0<kPx!k(-7~XY)i;GMDB$aS!L_`FjJ!?iWZ*F!xD?1NQcWq^Lb#-}p
> zqBHl2p`jsI4Fbi%q4ys)4*~HeFDskF-Jy#@p)i6Wdb+w6jAB7w*g;CL>Hy+1k$b%K
> zrQD5$4AK|`?CkV38!Ky5?Ez4WfBrQ$H@9BO#K`E2!xeJtACyTzAxv=IxPrR6bZ746
> z^z(r>xkKwG-PYiEAo&sAp-wdTUwCzcXeBAkwQKyHUUfZsK|E!ilbR$Ve`kAJ+hC6<
> zQ|bxFE`kWbprz0(<Mz#)S*ektfI@*3uIp)SX`x{eyns#+cQk`^46Ur#$=I;wvg<vZ
> z(N5Cu{WorOIqy7v{20}0h~PvR8XDrCd44Giv10w`K2gnP)n5QnjximLXx=#E{P(4$
> z@i+$HY=9HU=cem_d_qdn^m$wDwW5oopFUwq<HhM?#Gp>ECT(FkxfmO6EF>l&DXIKr
> zpY8>mb^Yq#Xo;=JTRw}z@^T*_p9q|Ib=?n2vKV*w;@n&@GG$?5;d?F4x|hlopgHho
> zbv+pw8M(Q+G7C>wW9c2;+;%?7y~SX=dVBLYX!>7YdLukvexuKM+Q)Gq+!BWTBdZ9M
> zr%&0t>P|$@&Ch43-KQUh-@9zc`v4IY6Jsr#MBr@L|EZ335-z@0!*2C+Wu<3I4s#r7
> z2a}hVx3abtQCJ<XGGBj`3*4OV`joaI0~m2tK9u75<#6C1)kX*m*3bR5Pi`zsjigOW
> zOQQ)3!Krq7ZTuK0Of~Q>+ZA5*k~Gi!`(W4W|H#3f6h&HE+R4V?mpBFxQMZZD?M0WG
> zH<6g8vEUu@<niW+`K?DwiYCeOA)7%h+w)|qD?+eu<Kw`>%}J_tdg<xuO;1mwthXMu
> zwCGH&>;rF&Eg5ZY4zUrJY59$u0;Xnr-19H25^vnn($bA10dQYnFxVN&&swrF324r?
> zE{(0NtutrNG=1Og6bepN*#KrFB;@YhyL^0neQ8(I%QQjsf=JQuBxyK`3H`mU4VWuQ
> zqkj0)r;3|HqK;yKNP$niNHOI5qv(^8lGbq|*4Ea2iQB|6dn*0;bEP>sEgHA<nCaIE
> zDGotAU)~@^zJC2$&~G#^Q3piTbG5>Y7?|MGloVR>6?=PoQ&ZCd2LFu(Qx+B$zy5=R
> zzegTD<CJa^15%fUY&%k5I<n+j5H<Gwy8ss#tvNRz-<@bbcEo>frpj6K_`t`yE$~MM
> zZt5$zzy8eg|MiECIRp!ky3fUrmpM^=cYJgCZ3L}YcwT<~5R>G63%t~;qM~;|KkcaS
> z@x1^Afe~Y(+koJmJ9qqKfq*TsF_BBsz`!yWW)rj`aHn;mKmh~zE{%bs!~I*PW54GT
> z&8PmcWv3Jr6o8GssFofV*H?LWT=<W%D~dG?C;Z3^EF}_?M(v+6NjIrnsqzp=(lkI$
> zpY!N`DiKiM(8vSKWi*GJwArPv)n2(W+ex4P7}UT2)+os|K&B~Q2d2PuvMOlp8}ZAR
> zE734^cJ>QZZ^fDD*WH1frD5hbe8&LPz)6ROy88NhU}A|x1>4HlpC->iRDi0*!dK6y
> zRES;k3-1nI=wut3n=8u5_%A!9nH8!7pBE7DK_@$_VaW8w89E|MJIl%m=Kx7GdPrA@
> z`kt2;kE-`v*bcA9M71Tb-J_#7fbEu$Fq-Kx(+PoZ>bkhhE)M0sc>X+`xg}9Mj0Ob3
> z^qqn8_zhS<OHa?8{q42n<YXP%=`bR3t3N~i-Odgp{UC#Nq1oYT`9Qc?bL6ErHbeDE
> z;wI~;S2%DAplqN^<n?%4w?hilI^0bBQ$e5~lmfd0ULZOq<`MI-6cDt`0&3JR7klA=
> zo@%^iJMxSY0bznZ24J?@+uOmm|0!lL4PMsJ(4cH=Jbd^N^qw%zS3Y}|D=>Ic8}>WI
> zsz}3kkx*4t1?nns2?^#wK}Tgyt>Mg~5*GNQ=^sA|ZQfjxO#+=Alaq~ES(xx<U1s`0
> z&x3=5=;-Lo;G;j)8c})q;<7T<;C<k^*PBO1tV?WS=32dhL)hEf`}y-HScSMWWS*Xp
> z0X$T_b2~lk<q54+cS1(S+T5J@MVg|pD(!6G&HScY9szg;<t3{kz~ASS9$8(XF@U7O
> zK`F?|*_JtmsGj|BZ@T6Ed*#(b6f4Ef-QR1b?J<Dc=fC~x*IO7sk!|t#l4cfkYG`E(
> z)IkJ*-;?>!@bcwk1QVa%1x5V;=q+q9cWec>_AMzb?JD5c{N`V?oo=qKz0Xg_%nztO
> zN1~d-uhsc^^&~5dSKh6Cu*RF<on(9(7;BJ{alEIa1J2CBr17fN0b94hSq<eH^z`&7
> zf-=X@(63&t@~SEpBofKY91o}?F7EVD5sGq78eaoo2V1fYaK6fOvccyEvq&2-hX4eC
> xjO^^BJ<4FtbI5{_BU5@DEvKZR|DWfW$}!rumbft#1ZupHk)D}usg7gl{{T2sZOQ-u
> 
> 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
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.