From 1f2fa5c90c7a270874893919af1af9ae6fd5666b Mon Sep 17 00:00:00 2001 From: Akihiko Kusanagi Date: Wed, 28 Nov 2018 14:53:41 +0800 Subject: [PATCH] Adjust the size of rectRounded/rectRot point to fit pointRadius (#5858) - Calculate the vertices of the shapes so that they are inscribed in the circle that has the radius of `pointRadius` - Remove `translate()` and `rotate()` to fix the regression introduced by #5319 - Refactor `rectRounded` for better performance --- src/helpers/helpers.canvas.js | 166 ++++++++++-------- .../controller.bubble/point-style.png | Bin 6566 -> 11225 bytes test/fixtures/controller.line/point-style.png | Bin 6273 -> 6440 bytes .../fixtures/controller.radar/point-style.png | Bin 6986 -> 7070 bytes .../element.point/point-style-rect-rot.png | Bin 6520 -> 3174 bytes .../point-style-rect-rounded.png | Bin 8262 -> 4469 bytes test/fixtures/element.point/rotation.js | 56 ++++++ test/fixtures/element.point/rotation.png | Bin 0 -> 52523 bytes test/fixtures/helpers.canvas/rounded-rect.js | 39 ++++ test/fixtures/helpers.canvas/rounded-rect.png | Bin 0 -> 13050 bytes test/specs/element.point.tests.js | 14 +- test/specs/helpers.canvas.tests.js | 55 +++++- 12 files changed, 237 insertions(+), 93 deletions(-) create mode 100644 test/fixtures/element.point/rotation.js create mode 100644 test/fixtures/element.point/rotation.png create mode 100644 test/fixtures/helpers.canvas/rounded-rect.js create mode 100644 test/fixtures/helpers.canvas/rounded-rect.png diff --git a/src/helpers/helpers.canvas.js b/src/helpers/helpers.canvas.js index 60fb6e1a2..ea0c6f1ce 100644 --- a/src/helpers/helpers.canvas.js +++ b/src/helpers/helpers.canvas.js @@ -2,6 +2,13 @@ var helpers = require('./helpers.core'); +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + /** * @namespace Chart.helpers.canvas */ @@ -27,20 +34,28 @@ var exports = module.exports = { */ roundedRect: function(ctx, x, y, width, height, radius) { if (radius) { - // NOTE(SB) `epsilon` helps to prevent minor artifacts appearing - // on Chrome when `r` is exactly half the height or the width. - var epsilon = 0.0000001; - var r = Math.min(radius, (height / 2) - epsilon, (width / 2) - epsilon); - - ctx.moveTo(x + r, y); - ctx.lineTo(x + width - r, y); - ctx.arcTo(x + width, y, x + width, y + r, r); - ctx.lineTo(x + width, y + height - r); - ctx.arcTo(x + width, y + height, x + width - r, y + height, r); - ctx.lineTo(x + r, y + height); - ctx.arcTo(x, y + height, x, y + height - r, r); - ctx.lineTo(x, y + r); - ctx.arcTo(x, y, x + r, y, r); + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } ctx.closePath(); ctx.moveTo(x, y); } else { @@ -49,8 +64,8 @@ var exports = module.exports = { }, drawPoint: function(ctx, style, radius, x, y, rotation) { - var type, edgeLength, xOffset, yOffset, height, size; - rotation = rotation || 0; + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; if (style && typeof style === 'object') { type = style.toString(); @@ -64,88 +79,97 @@ var exports = module.exports = { return; } - ctx.save(); - ctx.translate(x, y); - ctx.rotate(rotation * Math.PI / 180); ctx.beginPath(); switch (style) { // Default includes circle default: - ctx.arc(0, 0, radius, 0, Math.PI * 2); + ctx.arc(x, y, radius, 0, DOUBLE_PI); ctx.closePath(); break; case 'triangle': - edgeLength = 3 * radius / Math.sqrt(3); - height = edgeLength * Math.sqrt(3) / 2; - ctx.moveTo(-edgeLength / 2, height / 3); - ctx.lineTo(edgeLength / 2, height / 3); - ctx.lineTo(0, -2 * height / 3); + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); ctx.closePath(); break; - case 'rect': - size = 1 / Math.SQRT2 * radius; - ctx.rect(-size, -size, 2 * size, 2 * size); - break; case 'rectRounded': - var offset = radius / Math.SQRT2; - var leftX = -offset; - var topY = -offset; - var sideSize = Math.SQRT2 * radius; - - // NOTE(SB) the rounded rect implementation changed to use `arcTo` - // instead of `quadraticCurveTo` since it generates better results - // when rect is almost a circle. 0.425 (instead of 0.5) produces - // results visually closer to the previous impl. - this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius * 0.425); + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ case 'rectRot': - size = 1 / Math.SQRT2 * radius; - ctx.moveTo(-size, 0); - ctx.lineTo(0, size); - ctx.lineTo(size, 0); - ctx.lineTo(0, -size); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); ctx.closePath(); break; - case 'cross': - ctx.moveTo(0, radius); - ctx.lineTo(0, -radius); - ctx.moveTo(-radius, 0); - ctx.lineTo(radius, 0); - break; case 'crossRot': - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(-xOffset, -yOffset); - ctx.lineTo(xOffset, yOffset); - ctx.moveTo(-xOffset, yOffset); - ctx.lineTo(xOffset, -yOffset); + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); break; case 'star': - ctx.moveTo(0, radius); - ctx.lineTo(0, -radius); - ctx.moveTo(-radius, 0); - ctx.lineTo(radius, 0); - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(-xOffset, -yOffset); - ctx.lineTo(xOffset, yOffset); - ctx.moveTo(-xOffset, yOffset); - ctx.lineTo(xOffset, -yOffset); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); break; case 'line': - ctx.moveTo(-radius, 0); - ctx.lineTo(radius, 0); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); break; case 'dash': - ctx.moveTo(0, 0); - ctx.lineTo(radius, 0); + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); break; } ctx.fill(); ctx.stroke(); - ctx.restore(); }, clipArea: function(ctx, area) { diff --git a/test/fixtures/controller.bubble/point-style.png b/test/fixtures/controller.bubble/point-style.png index f1d3b8168c07d1e70eda4c04dc50325d25c0b39c..d949141d81d4f46dbb844b9a33e63d0b2f81a3fa 100644 GIT binary patch literal 11225 zc-rlnXIK+k)bA%DKxhIYARyA4G*4(sje0O$~!Y6buR zCLMwRC3ed1>)0N@4?YPaq^vfjw1Y__`7f(uu@4HXcCU%XhzZ!2u@&ZyKt5<0$o zXVXZm9>xACRU-G+rKD>DsIIp}UV}@U?JSuLYA=+B2YEnh&}R&{!94!w1Lf^{>_1+~ z)J<9k?<)-WUZo3O%E~y%YRAoGX2{s7Jpmxx00;`t{RVv*zxEer?-$Jb52&dh7L%oPfaS* z<# zjiK_db2 zbdW+X`E2Mp6E1+zLz>GKPO=Jk2&Q!r=&BlTgQi-BR zP?Rw#KK~aEC`&@&b%+)(3V>2tGy=kMq*T3C%CUayYJoT?a$1+|4uG{v+D#O^OaQ!v z%v+FQ=1J3qw+J$v7fIVq2ni~rBvt9DDSER>$iekbI(y?E6Qvh>4ml?Y+RuE zfQ72`V)PYiS}FE3T;TNb04q{%=J&T9qSAAZIuY|dq$V1!!YP@bx}Qven9)vE#2Kct$!pRu^j^E>qS=P2>HI#&W%n0Nu@ zaAFh*c+1o~vY^(U)`f9#RGqb`hEIQ0xx*hQoTzX`_^<)a1?m*+&&IANLwmgOnxkV_0QDeZ)jjURR=p+ElJzeHNjapR$x>Tljkd(xB{7Q7D?=irW@aD1f3+IFvHi08m*zKm+#Y*Y` z6AEnE({^+M;5>7;(d6JcnRe`Z2D}NI(kJAV7FljgkiF%gv}w% z^P4%R7AJS!TvAEBm8(NFzGzf*x3GS8xyWFB-?9GHJF{u8Nz)8_CjYf$%r6tOhN%tQ zmVj6WmGHxxxebQ)sb7nDNe!nFQa+s_Bw@OEBh49M1SJGj^{p}JR~r#B^X}nv}z4u zI9*$*FtA9q0{mn?32rvFa-P^g-B%>h5B&{$BC@#^NX;vvk*~V^S7_N}F)rR=plUVf zjl%VNby@1ZuRG7MYjGgC_e4iSPNKwwsx3M^`FDe4hLjs8N?YTVV3~t21ofTVs4fWs z=2P^pQGZ$}snLSD0T#1Ay|sn`4*au#I0pTD#sDQIHW)Sy465D@B%K)|ztrvh=F6lY1uCt>()iNCHF9?fwj`o-B>UwdOC zkkL@bPnX`ej=t6@_RHc6=(xYYjJQjl{j}GkEFlGbJPn#{c!|?Rc23vzl&j9n>`Vj> zj8|#NYva`r^s<;;%xXthKz`BXadUhnI!q!1`Ek{9D}WJrFZG@mvZ~eTc};}>rFL4M zsQ*TP?S|G9;y>#1Hpj#!jkVxtNk%H*gbTgzzQ5zxYiSkf^biVQTMOp2f=ppH1EV)i z3=vtHlX@^Ohq}8CA`p0L{Tmwa2vfC?rhM*E?!%~pRHdn(k_fKU`qu^Fn({UfH3e@EB$a1TdEb6eZXcHOPM`b^ zBftzVqK4L^P&4{?9rWka#WdlWoWj4q($zc_@Q_$}gpkx)>hb1qNLv;kY{EjL?*QXc z0{v-yW^qZjdg%HW_PQcL_Vx_Gen})=hG^z)w=RSBOzj(Z(O^-~&`JYf(+d;?q>6j2 zv%cx@y$T%_h;_}cHTT(KQX7HTIYEjx;BtJ zki)m)(AzwbVQml%RI?(23}CE3T+Fr{Ht5imX|Y+%HrFQ31VW8rlq_aWC_r=c6qDMQ zc}I4>y|HyvId;m&rf&EGIMQX3EXFv$_Ib zeqW>`(;M=QXG@V-7I7a(s%5i}1y6dCx-=k%)Tl`cVzxlG1Y48XtWK?`-p4?JWZ#L< z=PL{#{YT%G{2t07gb+(}zOiZO7mYE1uokK2BH1-PJY`uxwg(;(PGMNfDANOlwJ?>y z^u8w#*UV>wa^N||?riPaOdw@&Ze^FsQGYl*QD`Uk%J&&2|tMbzT_nYN;DyP`NWCba93gnUDw4cppR}H%~mI9$=`z|q}rI6 z(A|Oj$j%tvH)Jsx zi3fADSxQP5%M&wn`#Z#3+Z&D(7*qZWc7VUAuF5_qu?8oxTSd>*{ zzas6r9)HWhw*iX>g+d@($&}rC`{@=b8SVWL1c5VOI;e=***hnWv_9Yx$nX!@GYzjsqH|q z3iEKfRoez#)&+)@54{FMc0BG~2A#Yr2v3hyuvYQiW(4#!C!59(>_R8qW~d^@kRLok zN)WD2phUrcP1}16(voCXaw!8~1X;ee3eCgTLrtxLVWmSMTyMC04*SZiI+f;Vwz$tL z`{^UG48s?IrsrNT5_TpvmROdXE$SlE+c)4)RQ+~C0tmWD5-V>bH8n2Z2A*MC+(G&d zww1LKTzD&9IKltZk^|g>@$?``S{;VjUHKloGd>+`iidQ{_Upi=9NcVY4fZ>VJ{|>I zBj2Ya+ycZTNg=+Ejnl1t0zeM}GQhdapcZETeRU;9P?cPQ?YTqy*eUk-{>*N>g6Y7< zmye0%SpP8(G5=4{41-L-`-dr(?!JaoZ4Oqyrbh#{rB#4LWf?6C0W1oTA$zxlzu*~3~-vbht170(T~uJ;Wf4LGz>UG~{w#e7EKsK)(Wd%tz}wUZ;;%SnzIQzHgUGgE}vE z!X)AxsXEDt^l}7=CczVPn%` z6;m|xo)7%0#zwABh_ZtVOJX+Nmoko}L4&J0C<0>2>Z$40R)$hs#$^bpkj~MbTb-#v zhJTv8{-8s;(F(=dApHhtiNnuuW3GfDEvQ|7+tw7kQ~V^h1>J7;AOn6#TS2Dk}>%dtJ( zGyXeciPl9w8bnyB99V%XkouQa3N)zMCn~($XEf^Z0wlHYH9v2i4fTHRD>wnL?nw8) zaNaA{(gp5DU?4IJfs2moeW!eFvJT z`QBT*64+>HFT^r?7r1G;co z-+Y4=sc($w9xZevjB?&QkYV?Cft?JKW0 z$N_Ul1ZNfappTH5UqUcbO8lV~FakU}voPQy@R*eMTt~7h$NuN)K!`bB_lVvO;hSJ} z3%`L57}%~1$lRM%8DQ$%N$DS3B_NAuGSdYC^o`Ni8Nf-yhlrx^)=; zRWdCxKB2R>t=qC^Uo$H~LOBxP_P}n-=WC0Bxv8Kn1BQABEoXOjdPZ#ue~9yGq``9v zwb?vuP8Ak?94bjPSO^tP){~tAfw@6}%>@a_rE2$)!qnO^MC+SY|JwR}G2&wdD2n$f zX|?!0^HV=p1Dfe{2=@K2lc#u;^kLmB9?ikQqgHO zRkx2vF+w(z$;5@ZHz@+B!l}X143y%P7m^&pz(vOSfV$S;Xc`s};wRCj_eO)|&^?l< z5W{Gv#A5H%%-hc}ehf^r!_F5ysI&(+Ch#}u{ooV0w|Id|;WjKV-4;ukyibNEpm#-j z6^$+1M`!Z3d)J%Vna9wP0+>!ha`AG&o}*;TH@kRy!Q!!11+r?>>&@TZ&85X+Q;PWv zDL{#|1(MR9RKsCtA2*Ae1{dqYL|2xNm5(H^UiUP7@7>$%Kuy9>209Qn%x?c~y0mp6 zUUlLh&+Thz3LE|HvS*~mM6t?VI13J$c@i$%s1IUrRp~foBZu>XDWu5`3@3`$&{OBr zsgb&x!`}VjkE6yyDY!d8S_$0x;-Iz9N)tFAq~pW9SPR~t2*Px10>WH)g$w<8fatww z=#i#4Lw+1Ue~!?mHU;;*74LxEgmf+xFWB+7uz>>W^9(=JYb`w|+?~+LY?AR1cWL?{ z{ko+sw3-)~>^7;t1b$34PDd8tiOrG`LOPnynwN>-{5lhO4*7uE*eoyv4xZ&?S(L># zcM>Y?PHpX|`=3Yfw-A@kb6n2lgf3OS8RJn=K4butQ+mii(0Z~6{-4-(78(Jm*PQ0l z!5kSN=-&NXVA~_tjTikQ(yY5y4{vw&(+)2hRk)wHXLJ>dV`{y(}EMgZes=tkG`7DvV5L#Z9bNi`Pe zA5&U_`iVd_pY(E^q;o$T)=ifvF72@lc*whSG`55n7MvY;Ntq;gG`@~(lSPW+PNIvd z!pdeX?VgaZu_c^5tLZm3KB2R_@C!8?Ajboj^UnA0ikog(^DF!px;dIsgoYQo~LZ( zZ+}*oy6#!$a7KnCU|DK&=eUn(nRvKfq!(&Mb8=Q2>yv5)#45QxJ8zz|n%o(1TYFpO zAr@`#UAw3%U%EPFTA>L_CI%Td;2Zz;xWXPwuoZN=E6&>0&-qfSv7553tc*(Y52HawbJl4eNoCdzy$)IcveFn zG0ITQ;o4a~v+b><3@$C(}jTd)c6w7fxF{=-i-fdWuuA0L!&+h*n zdh9xiQWfwu`PvvP?L7A7XF6tZ16wiqZQCL3gJsaJg8YfXz{=5HQ;$L0A*>xjoO}Ub zGYWoTYqmxSP;Jr59MG$++hk>QK|!0$Nx4jpvZ7Tx?&)lZh7@I`WQIwMJK`nat#^){ z-LkU^E}5%0bw<*+dFBw#mrZpz!(5!dxNeVG0XL{eJ+4e3VB`{SOq(iOjJ`arV#nM? zZb8;d&3(>km8$n%{5{pNq`$K8trFjN%jVj2KoiBrHH6L5p6Gr=QCa2Mg~a%dkk_-O zzCT=#hYZE9cHugB=dU0nkxSFFY>`kPIH^ELz}Ls^tk!bFO&e!sa-}9~A6GK~!%Ta3 z-sXIKC10|ur zTMS>`W&#LCxOSp<(9+C#UInLbjo%ufcr_!g`)?L;xo`z4R2wg9-iBc6>a_L+it=F( z-0qb>qWrF4x0uqjdm7Ejzhioo>OYdmci2=2)no!>E}WOOg_d79?>B2*jUfx-`L)zk>DrcQ_oSe5O~~E+&6a?@!``B(UO7Jvr*lr z9R|b}nuZcR9^}>v*miJt$ZwIkcuhm-o|Grn^=R}a-Y5$5n(gU8dE>&YtD6QWF&f3n zA9@dV_2k<6C-keIndV%C`T}bRFC)OAxPv0h`qYmGRfM!LbqI$(ev3fgEIa*3O?$q_ z3{pwjMcaS2cw6^B*c@iAd_pTj`*_1i{%aIwL~g*N?EsVZ`Dh`L z2|)Hy!0Qj$r+;wNiI z;FYQD*IoVO(~>SD(15$wD>kgO=k;syum65ytIdTJwPx4Q_j0j znf5wIzh5~`-WQ)-NNUB zhpaz_1N(6?Ur|j(D@py7ZqKG(r}F4r74bOgDa%x{HI2k0lB7Z21@Tu@tiL6Ec2%)y z$(Kl$P+1l3wagjNH*vwX7by9T%OlVVsjk-Q9O22@&xPWj)nA*qy!aaE=y_Pm7C>8OUc0d%Ul&sX-7nNZE z1df}1)TdH3DD#6HJZl%761l(zGsV5opX6kTY1i8g9s=z`pMsc`90&ZBze?T zc})jsPOGF;Z-k&z0?sif?}XGQVC@A*e%_ z?SMmv>y#_6Uyli>n1PH3cD?=(I&H*-nPB>Gc^?qtJjEVAheFR5`~t!t@M@wev0>ll1)g-nSEK+d@oRS>!}5pN^T1#R z{ZKVHrX|X`%HqRXxQf~OP)OVtVzhmU)kL%|iuvmb4RtYd7s zJOq#T7xAL+3hoYk9-bKoC|g*wN~Zyryt zIlwEJL2e!Us+?PO-~2|Om!+)|iN{-0t?NC$(!uj9%6pHX03ts}(I|NOSjj5nRYL#i zb+z{nZmN84es$_sY6XT@cI#c%Kf+mLWII9tBZ)htr4(_4%FR5kcrBQ<#B=q+;rouEn?>*&;tPuR($4?6J~ zs7C5@WpHjG@4Op&wC4wM6JK>Q8?r13=&FQSW&3`#?`I$E#y+zeU-z40>@kXCc2H>wQ(!WyqO9c0b`utj zYNR>u0OzLi=F-kB)vZVZmP)ENZ21Xidx}=!`nZshef=QZ+~=XtsW79eHe7Cgc#NmR zpQi}9%Z!(zl(40wnyea5)Z8-69J|VE1zWn-e`UAO)pX)~6+189Z&P#F(R|_b*mk8E zNf_Mi!Ws`@a$KnxKpt$Tst|xT*Dd846=32Th1DDTnXV^h32B~J@#yzy4KChn+K<6o zZ1}SR0rUta0jZ`(k)tzt-cC0gW4y#!KJnY0IFAq8xDm9tB-+x*MR!NaBcimH2yZ=+v-MHcVj0WhwKQ7wsJc^3(8!A3=KA74`@^L%I9G%^+P`1+!#hkLL zP+@hL-w8-5*c6Mr`gKQYrURp#4V^^Xd``G;CPbeDyBHW959l#2iQ zv3_qrhWH(8bijsk_sqQn;U47w*|9Qb#N`|9NH?yZr4wXGb9^iwcp*#PMz_;c7y&-6(sjUSeMstC(_*+c(_m}B4wFt>!}F2$c$q#Pg!-2G~y%5N$L z(SxA?y{7#iDE>zs05N1~tkD04@y@3JxRdOn*&i0KVT1$!EZsf+^TgvPHwyTP`X6S7 zyZ?GK`#9zN4?!!Ea9fc(iTppe|GE9YcYChFsQ#(JEV}y*K>8r==&DuTwte!y0Mo(< AjsO4v literal 6566 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 WxFbBiP%Npxt}RS$&y^c{|M4$3RPKQQ diff --git a/test/fixtures/controller.line/point-style.png b/test/fixtures/controller.line/point-style.png index f177fbfe15eea654d31a2e4e94bf21dc0644b431..d8b6ed6b47526a4e54662fda7781dadd67d9e4e4 100644 GIT binary patch literal 6440 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 literal 6273 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 a7fjBi;FB^58RDdaV^br`Yc*Hg|NI{brhfPU diff --git a/test/fixtures/controller.radar/point-style.png b/test/fixtures/controller.radar/point-style.png index 562cb620b054de95898cba7bbc3908b479bfe2da..3f73ff96f91a02142de3504a59531b8f954d59d2 100644 GIT binary patch literal 7070 zc-pObcUY5Kv+qhM7HUMAY>HtkDjN+YUYZur++ zv--vklNzG#v)h&DIvh01Wh93Wd`KAS>kaCjdA;r0DL?%xUp6ue0JGw zYMV*#YDQ8{ngWpB<#mPj0p+UL<5H~wY)~dnE&J+GKRG9_N&wHNKIx|H3L&pWI{kb# z7SK*)V1!|tMH5?TsQ{>{cV;bR1@L?)3gN&iLqqud;`ZYas^Ev^r1SVIQEI$B44iUn z7?Y02V|v}H`$1cf`dKMB&3ht9!Uh|b%QY-_J5$XEZ4N#TBJQ*P;}P1RZ>N|2dr+Jc z%7tZTm}nWOfiD{Xuzjj8%#Z>*Yycpr?80ssdjE~Nju3uRNe7fYY6P(CyC)OcEn|U30s;T1-*g$Oj#p+%_yW&IfMbuL(D7m2v zFhV_jxqmC1#(EZH4UF>>A{0&wunCEqGgT#akWl2IK(kp6W27pz1c9(4H_Zf?u2DPTd7en~0J92N0^6c5I)~B?a*2+)6NovIp6n)Q$0%LphU zqRyjZUeaPPadbJxtSTVhOonmvePNP>zd2n*%HQu-1AnAL`LeOe2T@hHCuPxHxI=x+#&c7Dlocf0>zuVwOV~+Jx%S!x>5bY{QHwIH!SVS(KQC4~%%6 zRTL`fW(t$&4-orLS1SYET`YByD5s`+&@I){8d;P;Usr83*Sm>?ACOy@R*hNYpQ-qP zFXuB@zoU{i0We0w>fVfsV7gYD+Mm@@C8?s>J{iptRfP-3Sx$IAQVyzA?(sxp|KTR&@`R^XoYwS2p(Q#9xGBKvF1>Y?LGc1hRDqUdUmA@KuIA%-8{< zbl${`%Y`1sjC&z?{U0&wq)8h0U8p^&bN(rTAR))n5~<)+SqmZV?c}?4GM{6&cJXUU zFUpt55lWtBJ*4AZzc0mNwYQ&M8ufI6wMt8!HddD9iwe}C6{U{k=pkL2`8FNNUH z?w3R{o+Z#!O*ub^g0GKS9TeVb5$U5jSh-Rq$mVCR0`KQ9ohfYEq_V7oc)x*`Ir}bD zXZ*H8P`!BczmfjO$Fpqo7=qV8q*x-mBf6V)IdX`oD-&HXkn}m(mfcz6->o|z_ojb1 zy=XQzeuk+uh577)w{NiJ&cv3Ax-<8U{51{9aFLu{mjP&S(o!ji5L~8kTt%Cm2P1Wa zGsz|@7wf_u8t$dZe^OTnOni~Kf=2JwXUc$V4Da2(D%frW8Ob#Op3~a~b%t zo6GO-g{7g)3e|;(Om+423&Sr^mpWkX0YI156fZ zK{TkK%c=Z^mjZsN(O&5bi&ph;nvrnT8|{8-r3ipg0~X&;{3*3yG>;5po23Xcs0ux# zQ9xy@hVIS3dvS2u^=DT6LKkeeH@P;zMErX!JblV*)i9?CKYsoLX)0|B^Dh8sKlTYy zB}yWq8U{zz@1sJpt29;R!IYT~x-g)Sihw%B7vEEu+VN8{qM-%b`91~B1g~&b-#vL{#gQAgJlH+44_ zP)o2a!;xL)OMh^P1F!Y8V~aA{qvu7F0ehWh1rF1zSQrct9y>W$Ybj*xiTHD1B`)Cw z*U}w-nDe@llRK6NuN&^VgQ)sTD6Gw!PCAfHju(I?!VfzK7|;$S01&-x-`V&Id0R_`zK#Heqv}WnL7zkw>pLUCSUaj z%yyHZG&=55yHHwk4JXPQzzp8dfo2w3`=H4um@UlHkO4+kH*}C5=P+4gKMMe`Y3GcO z{A*e!YbC4dH|oeMqGkEmyGxreD^suf;zdQ#mvSh>~bN3a8CBQnc={WNMnuTBP*Q)LEs7T`=0c|)- ze)-3FevP@{d^7`PE?*L}2RW-9qyfB+0Y4`#t>#RAun#NOL+~UE&3@bP9N%#kuUHi6 zhb8xi8f)#td|$#XmS-G`5%MY`LbVnPMuJ4?YFBDe$O_pCsJQ+P{+Rs1#BUPuSXQnV zz%m<~`QUtwFrYMpKBCKM+7~_^F_Lh@ogAGQO9K1z4 zf9#&g6Tz>Kg@k@3eEGC==Gd9w!+#gCFtTL?=G@nlvCGb76N^Xtc$*D2Vlq8JFn(UUN1dePH z;8Srzw=45g9G$?$##w3TP-z|G)hT} z#oD5M$mHai#brg%bm6*KCt>VB&zM+er+E7yudHn!o!@l8Q&T@NAIS(WW|%>W{A6I+ zlsb%y+3xo@e6_CcU1zgSJrD^J?n%v_H`#sAG*|n2`x;FbBs|=2baqQ}_Ql#eZ^U!( z(}j7KQHEr5f;UW(dNn~&*rTrwaN3V3VRP)Tf{eywSiU+5r5U7QTqsHS`t;TEVGos6 zdQUlXIP0U;E$NZtK+UQaBRub@AscFif3!FQyHO0g%dnirxZRFBiK5F#ZKS=I-fYrs ziXYi@jxDtTJ7x*w&9X1cFz2qi-QLOwf5bSTlzm6e?#hO6UAJLK z<2s-$)f&BtG=@4B4rDQpg0Bq)R@`vA{a1N;<)|2HZI41HXpGBW@40I1SUe^8Fz8 zebpw}t`mE&ub+#8`?W>iS)!C~+d@vQzjBz+s$>HTk?RYoGkWjIu#}dASvvwLhM8aM zN(1_iDeedV$k{AC0>@XrZ?6R5{qutck%_UbO0*v-)_#r(KsrFhtEJf<8uKF0+>Z-~ zBra2izC0F7H2st&1ju#C&hk#ZT9)`j7perlXkln&pp9ehutHl(x(oYOV8!ydVt@qe5!zdoAldAaYKA;;@km#=`g>A?u6A1i%)17vC2Aj3P&A;;{aWEH{1CbSJ`JCh5SCOqSa?)DD!vr@Fk)S??Z{c(2zUJo?bqwd-V zrL< zd!*)#;DXHPEBPA2l}k(7q!Rz}C5W*@-wSE7{kXZ;AF^j@%A)V=Yrz8#apkI_!J9vy zINGv5Lq~*DNAjS(BK8|YT`qnnJ5Dsm8L0d<6Zk-i5I@_iMY@_iV`{S?Zzw!O+bX^D zM;zXiBiJ{UhK0JAt3gZ+(s&ZYFZDGN^H+BMjKhaP=dxQ255Zl+;V;fZ$|8U0B)B+H z1flAF%9}QQVW$!RlY3ks5X$eV9nu#rDuPM#p8;OA;VKQS!w|G@5Kq)o9pE;r_i%ya z?v@Xc>V?qYKhOZ=JD5Ts&4zht0f&L5?@)IiNluR@e+#Sc7zzHSQ1phJVIyPMgu zt(2ES$LV%EU-GS+b~%BnfPie;ye7amKomqoo6S_^3mt!6O7?~ty!NDbmmr;rz-1F> zH2A~P3P#ecHpBy+dFEQX6v$Rf1}+<8!f$$!YesDXvwEP$PRD6xWwoi_5CGe%4Uck$ zJYsyj$kZtOsF)kBv%6Bn^}kjMz~=EiHqUM+)fB~!g#V0(0P+)cWj?DTFY%|_f(K;c zx7xhSVQnbgbw8kO3^qhv6axtAl$Q1_ea;&m#=dJzb>%LVyGOS^6jQEr7ET8X-nE{K zVc@sJfSP(P-1pe$Cl*Rvb`-Ags`E;^=nw?fmyzm+yny6%r-|x z4b<%6z}QJ%4yKfoCgEid)i4J=$rDe5q!Y@O&n7lz1XxJbG%Zr8R$lcTFV+roV=uMc zHT3ngAH3iSvcH9mcD#UKVg3xtvw!=c<JIA?&@MWUbs zK88s5D2k~8v`3uDTXCX=evu#A{Q_$VMu3e@WV8#*XUDanEC;%}m|3@lA{;6J$>|bb zr2X1T-8&$M$IXrtiP8DORmdK_{XpKBMnCHXBI;%cUjq1&#=|q2nCtimG`p8EtpHMN zGg+y$ypq+`R-$E5)hY~>D*l%n(6SVFu+hEBo(AgyXgdTQh{_&8aWMQH zI+)0e?w50vqV%4lLG>;f2D7mrh0g8UhNyZao*Ryy zY{%AxB>0G^<7*O6wG-$X{sTfo1kYkIP#d_s6f6=2N9Fo!_aj*sR>NV0ICfG-9{lD> zwAP+a;SYbhFNo?eLSU@IDI-!$k=m2i?;`9X;8`(U3?_>gK7J3?Er5B-j(*OF#d0Xt z-KAFJ3jeu!Wp**fNbQI8H_Al{*hx4z;$%I5JHh!9*Ika_z4=xPg(}Gvf(>W7ZWmIU z3@wL^)c1s;*XPHy|LMQk6)o$!OQ2Q05lW)N!u-f4NwB>65-m zovNuGfo@opD2xcjbDw@=0$rD747kp7(p+_xs-Od*A!IT<-b(f7}1J-}nE9i_?*H zYqqQb0IWOuv+b_{NC5HQYH9dy{>rCi0927jZLLpS$zzRRpXEo!Yt3XNS(6-cZf>}` zqs6edeAj`~UiNAo^1(k1ZkD~MR(QYTT~u9^yAS^AE~}qkuURAUpgO%X%JW|O=}2q$ zp~0M#ZRx3>+&m=1S`-zYS@}~Mz8u-OVdc99BTqSOx`B}wTfm6xYM+ZSpIh5JG0L7> zF=X%(Mj1R61o(TUW~AOB%vMrf=@~Yv)r9k+_<n@2|7PnSfcN=3RqoKFB?^!!V$z}?;EAt0!{j~4Hsr|TfE0dgL{`y%SRWHb3i(#q(}u&)6a_KjHr z-N#j;mDYj+Spe*A>k7+O0c|S)aMC)lYsRK~nq_cjFCn)9<6A=jQFzsC^=h!C^j$Ho z?WAgIgt|Rkjt2-r<)7Lz8w-MWV@w zP+1?b2yll2LJEqYh2KA@lL066Xn6-yuz?3lB1{mt(f~7k!|H_%pxUl=?pU-EcyzdR zP#r$@@T#o?O@)T(`B6h?(nKZYKy?HOfwK+}oY80@zYv_643h+NcV~rwLKZI8VtuvEw}Qgl zzEEte?phGrEJhwT6hiI+XilHg&-sSPTNeac`uEp^p{WLfZC zpO(K*5sL5ZX_f+q3>A;;BdtVwRVNQgApC3t;v!c6&F6n#g)ucdP-rCr!=66HjR~_Y z*g|N#J*@^@?s;z^Fi{*06sH4;3ARl@p(;Wvh(RI&7hkW7>R%%X45~S|@byJLGZm>6 zH1kWiQ!3@j;BRBg`1z=xfwBfK3m<2Uq8eGLD%sN0@!lRjWPr<|Z$|RSIw5Q$BnA`7 zLV(R3)HKSI;Go4?ycu~p3V}mRY+l$Tif2Kcn9N`e@XfXH!CaJZK%^MB<9l$Ne=G#0Gm9#RX$)R5w zlEK-(z3dgv(XC#|MRD?e0CeI_eSOskN?Ah|!1&i$a3LRB)5cw}sYy$d^ZhRx*CS(l zaG7sIHNcjiGS2zjK!@p_XkqG{l;a#T>l1k$@!u zewjA5O6YZk`TD5d0;R7!&h2}d4rQ#GxP~9z`-bIcPrsZ*GKU7JF+^D!{mzQBKv7SK zq5w{PVxp{MuD4IP4v9G$&w{~uo6)Zz!AZiKRftWTLSM!ULK0c=qb69OEQdL3JAJ;v zAZRr7={fWaBhL~_ELhqx@0L&G&#NI0%7o=JdbytPb}wF*oNULX%Au%2KPDj zc)?BXRNUn=oJaV2Z4^6%+{A$K@mOtrc`&(`t;@PEs^Xep<#~^9!;DTI-b|1iVwU$b z96T@~2Q7;?D~XKRrXSMKW8%y?O*{mP*9(fS=B1GYQNmH%#tLt2;V}u&w3hP?9~YEF zv>ZMZw~ponz+LOnjfBAWGjnc8%-jrL(oF$?hwZK?PW3?{pH+6b&!AHZ;LdRh@ZJ_} zSTvI0mDI2C=sEz;hyr~ikD#8wE=KZV7ZzovPyl?_BHo}dxHGZIw)BsG!(L9TL-GnN z5=7VV^^J`}t9-~0PeG?p*j+TX@E|JVNu#BU2?A_Gal$n@^BBR1swOAAlr8_s5r8fF zSW}cJ21gbhwrwn`6*d{H23E8Qc@)P^Qm}Hd%oSnaBn1jTT#96_i;yJEB_nxMnQ)n9 zf~xeX@L#yot2(h{$>^5XgVJ){Xclbclpe&Gli7?3GIBRk&-3CV4Rq7k0 zXiYzXLIP(3$-@Q*kvjZ;|Lp{nra7U8$UF4J@d5^aYkq@HWd;2X; zSVJ|nNJr>|ebv|qTZP^0T8t9UqJuIh5L}@fZ{|V zF=4jlVHL0%Jw{@VPmUtMo%RRFnmy?Q7tv1#I4*fhY55mh8BwiM!A2+1xj(iQLSlZU zpdgusSEJsfRK136z07Qfq9unh%V7%~ydxG0mXgsO->QcrPq*d-bKh`c)zh2RMHg)M zXq&GAg@L@RE5hlKiz8E7b&4yWvx57+r!&|IhA8(e^>v{8{p-iUzMBbe)}tGFS~kQ87X)Rn*^pmnfoS~{i=R`2H++YoqQCOe93j3aWZ!GDdWg9 zlfS{P??7rO?t!IDk6eS%L3N4S|2EDoD0{h)=Zs!IQb(G{BXBJl0-hBtXmxR8<0BUb zXjt!<0nqJNW1KGPw6W0@=AYr2%O9ct^5BR(Sa*jxKK|qhd5S#re7V*fiTP#n0~`y~ zDrt=c1vBmoml#is(uai^50WA7ZHMtCy=F@R)gyryD{oJia}c2cE~&l0b}I zHG!pz-Xl^1g?Wi})vd36yproan3;?UYAzwh9EnsF0%I-aohs@Q?E*;_7u2p(LuaJh5C;|N6wiM5ynFGRYb?ZijTn2) zG(_od9lfFn1H-;qPJN~M)%f!Ue#-d6g;?6E3}4H=w%g(?w4;XLHl+0=mhIuT!LnO|A zC7CJcUzxwT5WOwq#>AqT_ij*6j}>hs++=DnUbOB8z~$G1jTM5v;unf-3XN5lwMi7U z*<${9xk55pK<4J8whW2TESf0}0IQ=4neuPUI|B7@d7TW{+BkQ0+4PTK+Wp`pk@lEe zIaQSqJf%TJ&^800O=lDc!Y>Nj)R~?;M6|SwmM(K1n#np|^bzRur!~(MNN7XRZ!ae- zXI}YQGjfyuF*(3&QLF3IC{Y}paTnfC7i|_TR*a}6n+uOrWdz&9fqLieQDGnq)lvBx z?1lFQr|MUnnXD6g@Yomp_M%ld2J5o|q3dz<@fYcC0Qe1Xvd6zA*J&&h8@Db{Xh@9r z`*<&vlK6|I+;NdA$;pnMJEhiZ@3k`qhvc*_m(Y=gLS+?(>)o{*hkBC5(y$_ zZfiTq$1_$`2Md7m!^Dgg?Sz^8Jf&`|#U9$THVu_yXeCD4>KA;X`i1Tx>D` z##yo#z9~AE-HgTt&D{Jx$|Lwx22G8Bi8$1iYO^?<_C&uxG=gBG>+0hFM7J;mmzx1I z6p7*cg@V+b2)|dH?o%`GGIaU-SB8m#9Vn%>WqfG9w#so>AYL=Mt@#zxqvVQ)hYPoe z*$In;zOsZ!Zx&Hi=9DSIPh5BZ00t+LEtlJuh$7zPTZyJ4qr8Z%l{8wjnyva~f>H}% zNVGSL%D*7a7Fuc-JGHmJ+IN!wkUXdYLnxr0-l$Qn&dv>fYep|ovJhGM-vh~7X!W)c z^h#M|TUc%iWg@Y4{&k<}8crVG8x9cm^v_64&kXvzk%on+$$F>z!fai<6Ap8dI#P6I zmaBKMt-{?$XcT6;(|?v*=O7<$CJUNBcGZ819{Rd->E1haY(<-_0a2B(V41}As~UU! zf<_fZ#>@9%Xi8BnMb0b9JyQf4QXQCEG*cYPc=|*T zXciICN{&BWI&aXH0Sw~Y62aWYh!3HG%>9VLcIl`$T=_SHimW_uzW*N4xXY-HRl7UNSoEUN0c&Ky# z5JY_9)EL+l+spT$?tA)++Eyvt^W}AjuRHIS+>5Hdx68^@#c?~h-9NXg&gTb?hiX`veHa1uFkItz&)6|*-3+H$eYfkD@(PPB6`-?Wo z=4h=i3lGvxE))e3wF*xCLiD9li0k{LBLZ}Uz$R0bQ4@AvNwl>vEzL#+A>P@Jy`Z129rR9kCsXi%C|!|}cm39H|a=4O=^%rKyNiVO6+r?!ica?7XM_{(O9 zPld$x+J3O%x1O-l+5#3-(xuX@ID^W9tZeDI{OR@n<-{&mYAD|far;9!9G})pz}{ed zOMLgT1N@iQg=b5N8hL8und>hcq9uWH)`Ou@^%BuYK%OuZ2aW~2E^yz=TdmPRmm*-B@2Qk^V)z^b=N4FOAYJl6jclKNBF^FV^zSQie z3+66!(e+QWz=a%mNWMf9L);gB0xcS#^-WJ`cm`BsY`fL03~uj>kRgm@;*TevV2v4< z2mWE7tLMgF>O1`;1l`6R)s1B(8w!^so2(ytt#%P0#3kJ(&AA@$$xgCDK3|QIFOY!wJ4dpr`s-Q3`f1J#wir@K_ zqrQ-zkl`IIo6kNBz*g_t&7yd+mK13Ev#1}UFIp-PbeT+f;PN8jrl^su zAOZZ$-jg7Dtk^^yg)LaLDKU*=1P=q?k%t@n84LNORtv75hxk#6!0%_VZH#~2g9NzQ zEL9n=qRKo8IK#blD@$HpJDd*Rowl=U%Wn7%3++3RH5OTBOLtCHvm7dCD)|iW>`?x% zyH~zsYjU3B&1xgq2xZLNIz$RKbeDRAnJ=dSn-=LleM6u4$LvV<*^q+?(+dR?Dx`v( zN^Yt7>^M6-Zx( zovSFZNi=xeECv(eO^zLde(wt(R!e5TdO80LC}Tzrxr`2}Hc@={vt+vI>R{)=r{v?uZ) znv9|`qE}quv(%*28IYyV>X-OKy7~{vS48P}v*%fR zJ5H~(j@*gAq>rIaABf}ctXgn~n(Am7-wiHn$3 z+sFP8Rhl|AvU)uEI%4+A&<93w(Ambmaa8WBr73ghqB30`JE3KmnYFo0PPnJ`tn=1r zQO5X;8uL861jhO8DHsyY)|eBvCKBq9%C1BIfhD3><#YA&3*ZgTs zP`~ClSVQ;W?PtV?++gl6M|dsKQ4QaECb#J zv|rCXefm-`JP63#DOYgy@^8PcD!vu{e_VyTYIdOdkI>&EF|M{@lg~#t5s2xO4ix8G zPlF6t&Qh|Y=Ob%=LOI`{WZTnceflPlnDe&2NJ6w7J=P&Z0(|oj!h>^JVLqf0{5gaG z=fyO&YliBKQSR>j>cFMayXVk%G^P%nK`AZ`R|1c$%ER;LD(XjcpO}{da6&sg%xA_O zQ&*8eadxBb0WMeTA4gVUCs^fpN{0Inz;I7(eg!8A4aNQdApYrye?Xa@^jx=T04d(J z{aLvyx!k&^=7Cp)p|8?X^gZ@Fh^B{px==0 z$D2~UnJHYhZ?DC7cCIBzC7MCLcJvYyhgKHLV|ZJBs2#NIKg9U=u1YNvT*udwR@Qvg z>5uhtzAOdoT}D+2x|*D&lzulPFTbZ)5}dv5<+-X3+TlZtwgND?_8;GN{7-=1#%f-2 ztMhZOX{_432jGym*=ZE^%f>SI+OQiGIfsn({~AetzX#-PQ7M_PmjM1c{wPBWMU_lK zynZH&oUaWlccHtA*1H!oU7Mtw{=RTF5$XJ|ZxrWLOirGH4Lt2Z@+$Cdr+;Y@Fz|>u z1)4%U-TD1hd7d#>K-2O6k2gswWt_2c{lT?`i9?7#Ht1NaG1#o4AcjR`UOa5K-A~8x zFP+@WG!Z79MyrokiTcDBlwM_Zk}+t+e>s`#JzMt@E}nH{?){OY|8RT6^z7U%{vxyM z-)FV#zb5*BALP=ym$kvAE#^3EDgPHmt@4GIA4tfZ|M(>FBMgt)IoXyU_Ph3PxdDrf diff --git a/test/fixtures/element.point/point-style-rect-rot.png b/test/fixtures/element.point/point-style-rect-rot.png index 09c0adac3d3e32580845000e7188e63fb60b7c95..a7c128855892682594576c778eeafaf043fd7f36 100644 GIT binary patch literal 3174 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 Bf^q-= literal 6520 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 diff --git a/test/fixtures/element.point/rotation.js b/test/fixtures/element.point/rotation.js new file mode 100644 index 000000000..b713f5d6b --- /dev/null +++ b/test/fixtures/element.point/rotation.js @@ -0,0 +1,56 @@ +var gradient; + +var datasets = ['circle', 'cross', 'crossRot', 'dash', 'line', 'rect', 'rectRounded', 'rectRot', 'star', 'triangle'].map(function(style, y) { + return { + pointStyle: style, + data: Array.apply(null, Array(17)).map(function(v, x) { + return {x: x, y: 10 - y}; + }) + }; +}); + +var angles = Array.apply(null, Array(17)).map(function(v, i) { + return -180 + i * 22.5; +}); + +module.exports = { + config: { + type: 'bubble', + data: { + datasets: datasets + }, + options: { + responsive: false, + legend: false, + title: false, + elements: { + point: { + rotation: angles, + radius: 10, + backgroundColor: function(context) { + if (!gradient) { + gradient = context.chart.ctx.createLinearGradient(0, 0, 512, 256); + gradient.addColorStop(0, '#ff0000'); + gradient.addColorStop(1, '#0000ff'); + } + return gradient; + }, + borderColor: '#cccccc' + } + }, + layout: { + padding: 20 + }, + scales: { + xAxes: [{display: false}], + yAxes: [{display: false}] + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/element.point/rotation.png b/test/fixtures/element.point/rotation.png new file mode 100644 index 0000000000000000000000000000000000000000..579c712ecf621a087cf574b48e2c14be27a28aa7 GIT binary patch literal 52523 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 L94%`sd{h1f{XBx& literal 0 Hc-jL100001 diff --git a/test/fixtures/helpers.canvas/rounded-rect.js b/test/fixtures/helpers.canvas/rounded-rect.js new file mode 100644 index 000000000..cbdedacc3 --- /dev/null +++ b/test/fixtures/helpers.canvas/rounded-rect.js @@ -0,0 +1,39 @@ +var roundedRect = Chart.helpers.canvas.roundedRect; + +module.exports = { + config: { + type: 'line', + plugins: [{ + afterDraw: function(chart) { + var ctx = chart.ctx; + ctx.strokeStyle = '#0000ff'; + ctx.lineWidth = 4; + ctx.fillStyle = '#00ff00'; + ctx.beginPath(); + roundedRect(ctx, 10, 10, 50, 50, 25); + roundedRect(ctx, 70, 10, 100, 50, 25); + roundedRect(ctx, 10, 70, 50, 100, 25); + roundedRect(ctx, 70, 70, 100, 100, 25); + roundedRect(ctx, 180, 10, 50, 50, 100); + roundedRect(ctx, 240, 10, 100, 50, 100); + roundedRect(ctx, 180, 70, 50, 100, 100); + roundedRect(ctx, 240, 70, 100, 100, 100); + roundedRect(ctx, 350, 10, 50, 50, 0); + ctx.fill(); + ctx.stroke(); + } + }], + options: { + scales: { + xAxes: [{display: false}], + yAxes: [{display: false}] + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/helpers.canvas/rounded-rect.png b/test/fixtures/helpers.canvas/rounded-rect.png new file mode 100644 index 0000000000000000000000000000000000000000..8973c9d30a0c84bdf158aa1881638536f8798e7d GIT binary patch literal 13050 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 literal 0 Hc-jL100001 diff --git a/test/specs/element.point.tests.js b/test/specs/element.point.tests.js index 0f3a03e31..887250acd 100644 --- a/test/specs/element.point.tests.js +++ b/test/specs/element.point.tests.js @@ -124,21 +124,12 @@ describe('Chart.elements.Point', function() { }, { name: 'setFillStyle', args: ['rgba(0,0,0,0.1)'] - }, { - name: 'save', - args: [] - }, { - name: 'translate', - args: [10, 15] - }, { - name: 'rotate', - args: [0] }, { name: 'beginPath', args: [] }, { name: 'arc', - args: [0, 0, 2, 0, 2 * Math.PI] + args: [10, 15, 2, 0, 2 * Math.PI] }, { name: 'closePath', args: [], @@ -148,9 +139,6 @@ describe('Chart.elements.Point', function() { }, { name: 'stroke', args: [] - }, { - name: 'restore', - args: [] }]); }); diff --git a/test/specs/helpers.canvas.tests.js b/test/specs/helpers.canvas.tests.js index 1a342c1cb..ee42a414e 100644 --- a/test/specs/helpers.canvas.tests.js +++ b/test/specs/helpers.canvas.tests.js @@ -1,6 +1,8 @@ 'use strict'; describe('Chart.helpers.canvas', function() { + describe('auto', jasmine.fixture.specs('helpers.canvas')); + var helpers = Chart.helpers; describe('clear', function() { @@ -28,15 +30,50 @@ describe('Chart.helpers.canvas', function() { helpers.canvas.roundedRect(context, 10, 20, 30, 40, 5); expect(context.getCalls()).toEqual([ - {name: 'moveTo', args: [15, 20]}, - {name: 'lineTo', args: [35, 20]}, - {name: 'arcTo', args: [40, 20, 40, 25, 5]}, - {name: 'lineTo', args: [40, 55]}, - {name: 'arcTo', args: [40, 60, 35, 60, 5]}, - {name: 'lineTo', args: [15, 60]}, - {name: 'arcTo', args: [10, 60, 10, 55, 5]}, - {name: 'lineTo', args: [10, 25]}, - {name: 'arcTo', args: [10, 20, 15, 20, 5]}, + {name: 'moveTo', args: [10, 25]}, + {name: 'arc', args: [15, 25, 5, -Math.PI, -Math.PI / 2]}, + {name: 'arc', args: [35, 25, 5, -Math.PI / 2, 0]}, + {name: 'arc', args: [35, 55, 5, 0, Math.PI / 2]}, + {name: 'arc', args: [15, 55, 5, Math.PI / 2, Math.PI]}, + {name: 'closePath', args: []}, + {name: 'moveTo', args: [10, 20]} + ]); + }); + it('should optimize path if radius is exactly half of height', function() { + var context = window.createMockContext(); + + helpers.canvas.roundedRect(context, 10, 20, 40, 30, 15); + + expect(context.getCalls()).toEqual([ + {name: 'moveTo', args: [10, 35]}, + {name: 'moveTo', args: [25, 20]}, + {name: 'arc', args: [35, 35, 15, -Math.PI / 2, Math.PI / 2]}, + {name: 'arc', args: [25, 35, 15, Math.PI / 2, Math.PI * 3 / 2]}, + {name: 'closePath', args: []}, + {name: 'moveTo', args: [10, 20]} + ]); + }); + it('should optimize path if radius is exactly half of width', function() { + var context = window.createMockContext(); + + helpers.canvas.roundedRect(context, 10, 20, 30, 40, 15); + + expect(context.getCalls()).toEqual([ + {name: 'moveTo', args: [10, 35]}, + {name: 'arc', args: [25, 35, 15, -Math.PI, 0]}, + {name: 'arc', args: [25, 45, 15, 0, Math.PI]}, + {name: 'closePath', args: []}, + {name: 'moveTo', args: [10, 20]} + ]); + }); + it('should optimize path if radius is exactly half of width and height', function() { + var context = window.createMockContext(); + + helpers.canvas.roundedRect(context, 10, 20, 30, 30, 15); + + expect(context.getCalls()).toEqual([ + {name: 'moveTo', args: [10, 35]}, + {name: 'arc', args: [25, 35, 15, -Math.PI, Math.PI]}, {name: 'closePath', args: []}, {name: 'moveTo', args: [10, 20]} ]); -- 2.47.3