From f3a1e9a247acd44b57924e75c9241337545ee738 Mon Sep 17 00:00:00 2001 From: Eric Rowell Date: Mon, 31 Dec 2012 19:24:35 -0800 Subject: [PATCH] new spline attr for the Line shape which enables splines --- src/shapes/Line.js | 70 +++++++++++++++++++++++--- tests/assets/unitDataUrls.js | 1 + tests/js/unit/containerTests.js | 6 +-- tests/js/unit/shapes/lineTests.js | 83 ++++++++++++++++++++++++++++++- 4 files changed, 150 insertions(+), 10 deletions(-) diff --git a/src/shapes/Line.js b/src/shapes/Line.js index ec8df566..083984c2 100644 --- a/src/shapes/Line.js +++ b/src/shapes/Line.js @@ -10,6 +10,18 @@ Kinetic.Line = function(config) { this._initLine(config); }; + // function written by Rob Spencer + function getControlPoints(x0, y0, x1, y1, x2, y2, t) { + var d01 = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)); + var d12 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + var fa = t * d01 / (d01 + d12); + var fb = t * d12 / (d01 + d12); + var p1x = x1 - fa * (x2 - x0); + var p1y = y1 - fa * (y2 - y0); + var p2x = x1 + fb * (x2 - x0); + var p2y = y1 + fb * (y2 - y0); + return [p1x, p1y, p2x, p2y]; + } Kinetic.Line.prototype = { _initLine: function(config) { @@ -17,7 +29,8 @@ points: [], lineCap: 'butt', dashArray: [], - detectionType: 'pixel' + detectionType: 'pixel', + spline: 0 }); this.shapeType = "Line"; @@ -27,13 +40,29 @@ this._setDrawFuncs(); }, drawFunc: function(canvas) { - var lastPos = {}, points = this.getPoints(), length = points.length, dashArray = this.getDashArray(), dashLength = dashArray.length, context = canvas.getContext(); + var points = this.getPoints(), length = points.length, dashArray = this.getDashArray(), dashLength = dashArray.length, context = canvas.getContext(), spline = this.getSpline(); context.beginPath(); context.moveTo(points[0].x, points[0].y); - for(var n = 1; n < length; n++) { - var point = points[n]; - context.lineTo(point.x, point.y); + // spline + if(spline !== 0 && length > 2) { + var ap = this.allPoints, len = ap.length; + context.quadraticCurveTo(ap[0].x, ap[0].y, ap[1].x, ap[1].y); + + var n = 2; + while(n < len - 1) { + context.bezierCurveTo(ap[n].x, ap[n++].y, ap[n].x, ap[n++].y, ap[n].x, ap[n++].y); + } + + context.quadraticCurveTo(ap[len - 1].x, ap[len - 1].y, points[length - 1].x, points[length - 1].y); + + } + // no spline + else { + for(var n = 1; n < length; n++) { + var point = points[n]; + context.lineTo(point.x, point.y); + } } canvas.stroke(this); @@ -47,12 +76,41 @@ */ setPoints: function(val) { this.setAttr('points', Kinetic.Type._getPoints(val)); + this._setAllPoints(); + }, + /** + * set spline + * @name setSpline + * @methodOf Kinetic.Line.prototype + * @param {Number} spline + */ + setSpline: function(spline) { + this.setAttr('spline', spline); + this._setAllPoints(); + }, + _setAllPoints: function() { + var points = this.getPoints(), length = points.length, spline = this.getSpline(), allPoints = []; + + for(var n = 1; n < length - 1; n++) { + var p0 = points[n - 1], p1 = points[n], p2 = points[n + 1], cp = getControlPoints(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, spline); + allPoints.push({ + x: cp[0], + y: cp[1] + }); + allPoints.push(p1); + allPoints.push({ + x: cp[2], + y: cp[3] + }); + } + + this.allPoints = allPoints; } }; Kinetic.Global.extend(Kinetic.Line, Kinetic.Shape); // add getters setters - Kinetic.Node.addGetters(Kinetic.Line, ['points']); + Kinetic.Node.addGetters(Kinetic.Line, ['points', 'spline']); /** * get points array diff --git a/tests/assets/unitDataUrls.js b/tests/assets/unitDataUrls.js index ceb2d837..441b667f 100644 --- a/tests/assets/unitDataUrls.js +++ b/tests/assets/unitDataUrls.js @@ -4,6 +4,7 @@ * urls will be slightly different from browser to browser */ var dataUrls = { + 'curvy lines' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkIAAADICAYAAAAEE46XAAAgAElEQVR4Xu2dC5SU1ZXvdyGOxnEimpjEJxBf0cQbUEmiRsFglNybCD6CrntVFCeJzgiCZC0fILQEoqw1Io/MqJnLQ+KsGVEjaGYFHYmNGpOIqFxf10ekjRozSZQ2L3VQevYu6oOi7e463/edU3Wqvt+3VtnYtb/znfPbp7r/vc8++5SECwIQgAAEIAABCBSUQKmg42bYEIAABCAAAQhAQBBCTAIIQAACEIAABApLACFUWNczcAhAAAIQgAAEEELMAQhAAAIQgAAECksAIVRY1zNwCEAAAhCAAAQQQswBCEAAAhCAAAQKSwAhVFjXM3AIQAACEIAABBBCzAEIQAACEIAABApLACFUWNczcAhAAAIQgAAEEELMAQhAAAIQgAAECksAIVRY1zNwCEAAAhCAAAQQQswBCEAAAhCAAAQKSwAhVFjXM3AIQAACEIAABBBCzAEIQAACLU+ga6AOcZDjMEc42G1Um/U17PT9UqdDW5hAoKEEEEINxc/DIQABCNQi0DXgbLnlpM/JI58wyyfl8KH2dZis/fj7ssOg/5K/+lDSwmfkqV13lnd21e/t3FerI6S9x7c3yu6qbj5bq0Pl99tlm17aIIPlZTGtteWyNjplQE/tPKHfTMRRdzGVvKfvl2qJLKc+YgQBFwIIIRdK2EAAAhDwSOA6ufTrO8qmvf4gH971YHn+y9b0H+VvdhskHfvtJm/1f1d22nkveX3nwbLB41Mb01S1uErEU/J1jQyv1alEsRmIl/WVfCXaVIsc7zsTQAg5o8IQAhCAQG0CC2TCRLMaIJ3DNTqzRz/ZvKcKnH3se0fKuh7DJLVbbW2LRBg9IUPKkST7/z6iStUwEqFkX00kmUAimtTa08X76BBC3pHSIAQg0MoEEqHzCfnNqTvJu7utG7r+kJ8e8sZOqz/1px1s3Kc+K3LJL0SGd7QyhfqMLYkmmTCy5TcTR45Ld7bMVhFGYv/WV8kiSlwQ+AABhBCTAgIQgEAVgWTZKonoqOA5eBf5yy7dozl3HSIyaZT+tt29Z3wz7xe5ag1oQxCwyNHjMlTVzRBZKaO3y0/q43kmjEwUWcSofctXkrlD+KfZ2kQINZvH6C8EIJCLwCyZOvDD8ofR/eW9T3xUfn+05uTs8xF5Y8+PyW933U9e6V+r8TWDRK7W1Jb7B9eyFFn5ryKnPFfbDot8BCxaZFEje1neUXXido2WTRiZKLKXylaEUT5PNOfdCKHm9Bu9hgAE+iBQvXxlZp+Ul4b8tfx5p0/J/9+6wyotwDQCKGn79GdEbl+e9knY5yXgQRitUFFEPC+vI5rkfoRQkziKbkIAAtsTSCI7yRKWiR3XqE4allkEUHX7XW1pnoZtCAK2hLZEzk+zjGbdsO39KojK0aK7iBaF8EwcbSKE4vADvYAABHohkOTsWHJysoxVj91XeQVQMhyEUFxTO6MoskGYIFqCKIrLnz56gxDyQZE2IACB3ARsOUuXrz79N/LHg30sZWXt0HotWzj5ZLccoFrPYGmsFqHGvp+IomVybm8FIHvr4J2VaBGRosa60MvTEUJeMNIIBCDgQuBauewY3YF1VLL1fB95bfAB8svddHmr4T+LXtYKP5YEvaRct9nP5StZ+nXZ6x176XZ9e737n/Lxjb+Wvd9SwdiR9FTff/2r8qN7eun5Ewo49XEXXVJVPvqDDVtNpCFV37aS1MkeOnvPrUS1H9S5W7Gls5tlXDnZOuVlUaKbySlKSS0i84b/8ImIBV2BAAQ8EajO3/m4/OfhtiurHstZWbofQgBZP85/XGTxyp57pBWlN78oB/7B3v2d7Pmc/v87u8vGjb+Vj617Qz7yp8PkmddHyuqf6w/olqh9UyWoRlSIJF9Tq44sPk5zj0WJrpfJmhR0StookW3Pn6evZeQTpSHeeFuEUON9QA8g0NQELIfnQ/L2UNuKHiphOQSgUAJo384dui65Z+Bfjn3242+8Kvtu0OrSb3fIoHKkZoIsXJolMhNi/DG12U0oWSTJihM0NKJkxRxXyBi5Wmak2Y6fYLUo0dUUcYxplvXeF4RQc/iJXkIgCgKWx2O7tDRpebAta8Ua5ekLVigB1G9zv1c377B5mv7e1GUSLh8EKgLJBJEtwZk4akgEyZbNMgoiyyWaz7KZj9kQrg2EUDi2tAyBpiVQnctjlZX1rKyPuRQbjHnAnXoe+3f01+jco733skNK0oYA8s61xwZVHCXCaIQa2GtQfZ5sW8YyCyKtM16OEFGbqF7OSvEchFAKWJhCoBUJJLu1dGlrWEzJy75YmwBa8HlN3viCFobJXE6xx94ggHw5KUc7KowGVgRR3YQRgiiHwyK8FSEUoVPoEgRCEbBIz57yu3GJ6GnGpS0XNm/Jbl2Pf2jQH2449q337x726off3um9mkdnuLRbsemsRIB0yYMrNgJVwmiM9s1ewS4TRJfK3LRJ1dYfWzKbTA5RMNekahghlAoXxhBoHgLJzi3bqm5JzLFsU/dJ8Dk55O0/y1+/+0s5YL3uvHrhL7LL0w8e/qvVt52+8lR9ziR99XIkaqZemACaJ12a89GWfit6pidyUy4CKopsG//oiiAKIoosqXqSTgurRZThmqH3LGCXWQZyHm9BCHmESVMQaCQB272l0Z6zbLv6/vKrffOcq9XIcfT07MfkiM7fy0d/r5Ge134jn1ixSXZ8bYrMvW0727byL72JCKDYvBdHf0KLovvlBI0PLcmyw8y23atoL2lxRq5GEEAINYI6z4RATgK2xKUnqH812bLeCktcutX8Pa2j8yeL7rwrO72pf2k/oFGeO6fJ7Nq1dGaoALKEZSJAOWdWMW6viKJxFdE8yNeoLTo0TzXNTJmepUlLqD6N6FAWdPnuQQjl48fdEKgLAUtotiWuVtjBZdEdXc56WyM7z2vxwJ/pctZjH4juuFKdUV6PaFMRZFurfV0sgfki2QTtqCiyJTMTRd6WznSOy3hZLOvTl0Kyg17PIzpU34mDEKovb54GgZoELLdnD3nzW7qDa9TB8vynmnWJyyI8G2Tw7xLBo8tad18ucx6uCcDFIIwAsicv1ddkcoBcnNBaNpUkaxUh5dwyW2bNfY3TklIZc4csmXo80aHcLnBqACHkhAkjCIQj0ArCJ8nh0aWtJ1MtaaXFGlIA9Vf5M601jrRIixX7bQQqy2aX+BJEi1XPTJHrsuwss9whTfovrcc/YQkghMLypXUI9EjAlroGysvnNVvEpzqPJ/eyVpq5gQBKQwtbDwR8CqKcS2WWSK3nl3GFIoAQCkWWdiFQRSDJ8bFt7M2S2Gxb01+Wga8lO7WcE5d9en6mHqmwWQu1iCZd+L2WChEgv0RbtDVfgsgSqc/TlVc7zDXDpZ+B0pQM93GLAwGEkAMkTCCQlkCzCR9b2kpq8ajwuTdz8nJaUL3ZbxFAVmPlBF9NVtpBAHkGWpTmKoLoeh3veXnGPFdLMNpSWYZrsYqhCzLcxy01CCCEmCIQ8ECgmYRPEul5RfZrj0L0VPMPJ4DapZ8mwU7XjTxcEMhBQAWRHfy6VF+DsjZjeUMXyKIst7PFPgs1hFAAajRZeAKW4LyXvH7lQfLCVw+XJ/fSE9mj/KOieueWFSKcKAvnRem8sAKoTQUQh11G6fjm7ZQKIotYtmUdQQ4x9Jg+cyQ7yrKS/+B9Uf7w9jc8WoKAPwJJ5eZhsvYrsW5ptyUuFT8dv5a9V3ndru4P4/YtIYBCkaXdOhCobLm36NCILI+7UzeFWb2hzvS79RFDWYD3cg9CyCNMmmo9Av8kF31Xz+g641B5dvB+8orPgztzw0qWuGzLur7+teF5PWlGNEtPDN8k12shRDsTzOdlS2BEgHwSpa2aBPJEh56QIe+fIPfvgBiqiTmYAUIoGFoabkYCyenstuR1nDy4dyxjsNPUNZn5LUtotiWuhuzg8gFjiwCaoQLofB/NVbWBAPIMlObSEajkDq3Qu1IXY3xGDvvLsfLTXTKIoTt0ieyMdD3FujsBhBBzovAEbMnrQHnxiphq+pjw+X/yP36j29d/3nTRnp5mVDgB1FE+Y2yGlvDlgkCDCVR2lv1EuzE0bVe0CvsbWl7jI2nvU3t2k2WAVn0LQignQG5vPgJJJWdb8vqcPHJgDInOLSd8kmmBAGq+Dwg9zk1ABZHVvpqctqFfyOd/8QX5+efT3qf2espr6TsZ7uMWJYAQYhoUgkD1Lq9YlrwssVlD4ve3RMSn+yxCABXic8UgeyegYsgOBE4dqfypHLvqi/LQqAxsR+ivdHZHZgCHEMoAjVuah8AiGX9TLPk+SdHCqLex53VtWzk/YqK+7ODK3fM2V3U/S2AeYdJUfQhkFUO6tf77WmdorPYyTb6RnVz/SbbVp/ctQig9M+6InECy06vRy16FED7JXEAARf6poHuNIlARQ/NTihr5F/k/F5wtt1gJ6jRiaLUKoRMbNdZmfS5CqFk9R7+3I2CVnQ+R5y5upPix7eya4PxIS0d8us+7cAKoUxfu50mXzNdU6E6mOwSamYCKoc9q/9tTipqNU2X2t78rV6YtQU2+UMrJghBKCQzzeAgku72GyuOHN6rGz4Ny3OvPy8H//nv56JLLZc7D8dAJ3BMEUGDANN9qBDKKocdK0mXRpLS5RkM0MsRxMo6TCCHkCAqzOAg0WvzYkRW65PWUVW6+SG68Ig4qdewFAqiOsHlUqxGo1BqyyFCaa7qKoZdTiiGWyFIQRgilgIVpYwhYkcO95ddTGnW0hS15rZVhq1pyd1cal84o74Jp0yWrwWluq2HLEphHmDQVP4GMCdRDVAzZ5+/SFCMcp1GhZSnsC2uKECqs6+MfuCU9f0aeGlfv7e5W00frefzSTmfXfJ9Z02S2/TVW3AsBVFzfM/IgBFQMaRHEVNXVX1L7I1UMpSnWyC4yR+8hhBxBYVYfAhb9GSwbZh0tPzuunnk/yZKXVnK+OdoT2uvjgm1PCSOArP2l0l8jS9Ok2AKz3v7keVERUDGkx2PIaSk6NVeF0EK1f1xfrjvJtLBjaUqKZxTSFCFUSLfHN2jb9TVEnrisntGfZMnrNdnnHwqV6FzL/QigWoR4HwK5CWQ8jmOEiqHd9OErHTtAVMgBFELIARImYQhYtef95VdzR0j7KfWK/iB++vAlAijMRKdVCPRCoLKT7IkUgHQXmRwp0qXJ0PIlx/vYTl8DFELIcSZh5o9AUvPnJLn3IH+t9t6SLXv9TI5+6CX55FQiPz1wminDZbMeWypygmd/sATmGSjNtR4BFUNWid22yLte4zQq9IAauy6RERVCCLnOLexCEqh39CfJ+XlRDvzuFJl7W8ixNW3b4QTQCs0BmkQOUNPODDpeZwIqhtJEeJLE6QnazZmOXSUq1AcoIkKOswizbASs7o/u/Jpdj4rPyW6vp+QzVyJ++vBXOAHULv00CXq6cPBjto8LdxWUgAqhQSkiPEZJawuJnjbfZaLIpZyFRoVKexQUb81hI4RqIsIgCwFb/jpGHm47Utb5PHjzA11JxI8ue91eyAKHaZyDAEpDC1sI1JWAiqFT9IGpkqB1iewcvWeBY0fHqBhybd+xydYwQwi1hh+jGYXV/tHoz4WhBZAdbfG0fPpmxI+D62fqOUeb5Xq19J0DRATIAT8mEHAlkHKJbJEKoW9r2xv05bKdXrfrl85w7UuR7BBCRfJ2wLEukvE3fVn+Y3zI3V+24+sh+eK/UOTQ0ZGzZKBs0iToUqrCbS6NI4BcKGEDgZQEMuwi213FUJpcIY3QlzjEuJtfEEIpJyrm2xOohwC6V056UUXQQi106BoCLrabQgmgLt2lsoNMJgeo2NOL0YcloGLo/+oTLnB8ip1D9oNKVMjlFt2hVrKijFxVBBBCTIdMBEILINv11S4j7tZKz5MLf8SFq4dCCSCRDo0qtWlsKe0J2K49xw4CEKgQSJk4vVF/iWsSdNftevvpDhA5jLUHSAghh5mDyRYCtgX+IHlhScjjLyz35wkZci3RnxSzDgGUAhamEIifgIqhq7SXrlvjra6QDcrxD5USv/e7TQGAxP+ZaHgPEwGkBRBHDJBO73OGgocZXdymCZJdMjdADhARoIwu4TYI+CBQOX7DNQn6Jf2hfIBGhcpqyOFi9xhCyGGaYLJdBCiUAFonR3aulWE3svMr5YQzAbSlGu0kffksT4AASukKzCEQioCqmn/Qtl0PTLUzyCxp2mV57DrNE7LdZlwVAt7/uodsaxBYJufc8TW5+1TfESCr+7NGhq9/Vg79e467SDlXwgmgzkoOUJoy/yk7jzkEIJCGQCVXyKJCLtcdKoSskKnLhpJ1KoSOcmm0KDYIoaJ42nGcVghxpKy+5jB5ZhfHW5zMbPnrHjl56d/Kom843YDRNgJhBdA8XV6br6nQbKllzkEgMgIqhlyToOVEue/41TLSziBzuMgTqoaEEHKYMkUwuVYuO0YrQd92nDy4t8/xIoBy0EQA5YDHrRBofgIqhIbrKNodR2JJ044J0zJUo0JpTr137EJzmiGEmtNv3nqdJEKPleVeqw5b/o/u/rqdCFBGV83QHCDbsu43B8iWwIgAZXQJt0GgEQRUDOlSlhzh8GxbHrP8wZEOtuNUCC1zsCuECUKoEG7ueZBWC+g0+eE3fOYBmQB6WI6Zwfb3jBNrhpyrd7apYHE5SNH1IQggV1LYQSAyAiqELAnaJfdHtLL/9zQKf7HDEHR7fmmWg10hTBBChXDz9oMMkQeEAMo5kcIIIN1Rq2eMlbQeCTlAOR3E7RBoDIE0SdPfk4tvmSALz3boKYUVqyAhhBxmTKuYhMgD4viLnLMjlAASWSr9Vf5Mk5dz9pDbIQCBBhNwXR77nez52Mfkty7LaAghhFCDZ3WdHx8iD8gE0OMydBxb4DM6EwGUERy3QaB4BNIsj+0uG3ULaM3D6NlCjxAqzgfJlsHGyIrrfJ0KjwDKOXdm6i6Q92WJ5xwg6xQRoJyu4XYIxEogzfKY/ryXlTLaYShsoU8gsTTmMF2a1WSFjH50tKw80kf/LQdICyF+c4rMvc1He4VrwwTQZj22VMTr7jwEUOFmEgMuKAHX5bHrtBj1t8tFqWtdCCGEUK050sTvXyeXfn2UrFrqoyii1QH6kXx1jh6DMa2JkTSu6+EEULv00yM2psv6xg2OJ0MAAvUioELIfgZ/p9bz9I9WOUoerWWm7yOEEEIO06QZTW6VsT/xURPIjsLQZbA1Y+U23xGMZsSavs9hBVCbCiArp88FAQgUhIAKoRE61PtdhuuWJ4QQQgi5zKYmsrEdYXo22H/4iAJZHpAehnriNJnNjqO0cwABlJYY9hCAgCMBFUNOJ8yfoHqpvayb+roQQgghx4nXDGa+DkglDyiHt2fJQNlUrtlzao5WerrVlsCIAHmGSnMQaEYCqoLu037XrBx9la6gzSqvpCGEXPxMsrQLpUhtLAqkB+396EhZt3ueLpIHlIPeFgE0QwXQ+TlaQQB5hkdzEGhFAq55Qnr4qh3CihBynAQIIUdQsZndIBfOOkv+7co8x2OQB5TDq+EEUIf26hKNAd2Vo3fcCgEItCCBNHlCeu4YQshxDiCEHEHFYmbFEY+XBx7Oe0r8g3Lc6w/I8UeTB5TSsyEFkB2yOkNcT49O2XHMIQCBViDgmic0WDZIhwzqY8jkCCVwEEJN9MnwkRBtUaA75PR/vkAWf6uJht74riKAGu8DegABCFicxylPqEbCNEdsVM0lhFCTfLCsNtB4WXxrnqUwS4a+T078XxyLkcLpbeVa9RP1dXWKu1xMOzSviAiQCylsIACBrQRUCN2u/3N6LSQT9cD6heWD63u8EEIIoVpTKK73F8n4m1QEfTNrrywKdLd8bcU5cstpWdso3H3bBNAkHXuuZPRu7BBAhZtMDBgC/gi4JkzXqDB9hxZUPMNfr5q7JSJCkfsv7zEZz8qhb/9YvjKOozEcHR1OAHVqBGie5gD5jiw5DgwzCECgFQioELKDxFbUGkuNnWNXqRCaVauNoryPEIrU0z6Som+Tr7dTGdrRwaEFUJfM14WwTsfeYAYBCECgRwIqhIboG4/XwrNRA9l7yJu9mY1TIbSsVhtFeR8hFKGn8yZFEwVK4VQEUApYmEIAAjEQcN051scWej06qdQew1hi6ANCKAYvVPUhb1L0XXLKY0/K4aexLd7BsTPk3PJyld8coC1LYESAHByACQQgkIWA60n0fewc07zHEhHqCnyEUJZZGOgeS4o+TX74jSw7wywhepmcO2miLFwQqHut06wJINGFqpIM9jgoBJBHmDQFAQj0TiDnFvoNKoI+Cd9tBBBCkcyGPKfG21KYRoJOZFt8DWeGEUD20KXSX4XVNOGQ2kg+T3QDAq1MwHULfS8RIXaMdZscCKEIPi2r5OTnTpZ7Ds7SFasNtEpGDWEprA96CKAsU4t7IACBSAm4bqHv5fBVrYtWWhjp0BrSLYRQQ7Bve6idHH+O/CBTfZ975aQXTpZ7MwmoBg+7Po9HANWHM0+BAATqSiCnECJRmohQXedrnw/LUyhxsYz/Psdk9IJ3pgyXzVqxR0Q/8F4vlsC84qQxCEAgCwEVQpbnWPNcwp6LKnLGWHfmRISyzEIP92QVQSRF9wEfAeRhZtIEBCAQOwHXU+h7KKpIflAPzkUINWDGZxVBr8q+7y2Xsf+bKtHdnBZOALVLP02Cni5rGjBNeCQEIACBHgnkEELkByGEGv+pWiATJk6QhfPT9sR2hv1QTjuUpOgqcgigtNMIewhAoAUI5BBCWjKk1NECCLwOgYiQV5x9N5a1WCJJ0USA6jhNeRQEIBA5AddjNrotjVE/qBe/IoTqNOERQR5Az5KBskmToEtyvofWqptgCcwzUJqDAATCEnA5ZqObELpOo0HfDtur5mwdIVQHvyGCckIOJYC69ODCHWQyOUA5/RP89q7h+ohL9DVCX3o0gLTr64nKV83f4qiA4C7gAdERcBFC1umq88ZYFiMi1Jh5rAeofvFbctMDaY/NYDlM/RVKAIl06E+HNo0t1dx+2phZw1O3Eei6Sv89swaRRBSZQEIYMX0KQSClEHpMJdGRhQCTYZBEhDJAS3PL03LYnw+TZ3ZJc0/hRRACKM10aWHbciTIxE3aKxFGj1eEEUefpCWIffQEUgohdov14VGEUMDpvkJGPzpaVqZS4YUWQW0yQE9tnxsgB4gIUMB5Hq7prtu17dM9tK9JomVBlUSMEEYeoNJEYwmkFEKcNo8Qqv+EzbJN3rbIHybPpooe1X9kAZ5oAkhE/2KRSfqyHBBfFwLIF8mGtNOlP+uDXIkwssiRLaWtD/IUGoVAMAJdE7uk5FSGRXOEFukc/9tgXWmBhokIBXDiLJk68O/lHzekyQsqZJ2gcAKoU6NKk8gBCjC569pkMCHUfRQbK9EiixipKCpRQLOufuZh6Qh0DVL7x1QIOf3RqEJoqM5pE/1cvRBACAWYGo/IsDeGydo9XJsunAgKK4Dm6fLafE2F7nTlj12sBLwtjWUZoImiJNdIv5ZYTstCkXsCEOhap40ecZ+cKCNldZ/t3yMnd46Se5wEU4CONk2TCCHPrrpVxq4eK8u/5NpsoUQQAsh1WmBXJtB1iv5nZSQwbDktEUZEjSJxSvG6sW0X5Slyl344RveJ4Aq55ppr5Yori8cp3YgRQul49Wlt9YIulbnLXZu0A1S/JxcPLsSxGXZil/8cIFsCIwLkOuGa0q5rsXbbdwFNXySqo0Zs2/dFlXZ6IfDBXZRz5VIthHZ9j/bXyBUbr5RrnFcmiowdIeTJ+5YXdI784IX95Vc7uja5UCZcMlEWLnC1b0q7GXKu9rtNBYsW8/J2IYC8oWyGhsqRIRNDYyLvbXUSNlGjyJ3VXN3rsp+jPdY9G675/pP078ExsqI8pDUyXNMjr7avI8h3c/MyQsiNU02rdhn+qk7IfWoaVgz0FPmfnCnLR7raN51dGAGkqyX6509JC+yRA9R0U8JPh7v0h3u5wrS9rM5Q7Fe7dtCW1KymkYkjdqjF7rHo+tdlO2qddohVdX2uzrUp0Q0l0g4hhDw4ZpGMv2m8LP6ma1MtvU0+lAASWSr9Vf5ME5JWXSdaIey2E0af1SFbKYbYL8RR7B6Kpn+29V3Gp+yOiu7SESnvKbQ5Qiin+9MeoWF5QTfKhcdfLnMeyvnouG5HAMXlj8L2psvE0IiqVzMII/MW4qiwc7angZfnsSX/nJASi+2Wte3yHSnvK7Q5Qiin+38so54bJasOdm1GRdDsi+TGaa720dvN1OWJ92WJ5xwgGzYRoOid3wwd3E4YDdEeD2qGXlf6iDhqImf56WqXCXc7X+/SjO3pNrLSXRnvLextCKEcrrdo0GUy50HXJnSr47oxsvIoV/uo7UwAbdacvPR/sdQaFgKoFiHez0Gga6DePKLq1UzCyMZt+UaWlG25RiaUOqhxlGM6RHVrOSF6nr6y1v0hLyijPxFCGcHZbWkSpFsmLyicAGrXHKDzyAHKMSG5NQOBsjDSpYSyOLKIUTMkYHcfp1XGNmFUJZKojp1hMjTolrIAOk9faZfBqvurW8ZKpzZoAE3/WIRQRhemOUusJfKCQgqgfpoEPd3OfOKCQAwEygnYSa5Rsy2nVQO0yJFtLmiviKQOdq3FML+sD2UBbmcrjtNX1ghQMpgl6te0CdWxgIiiHwihjG5Ic4zGYhn//Qtk8bcyPqqxtyGAGsufp0dAYLuoUSKSIuhX5i4kAql6mc1EEjsyMyN1vbHLSkFfoq880Z/qh2lCdSlrPpFrp1veDiGUwcU3yIWzLpQbp7rc2rRLYrNkoLynSdD+PrAJrnYhAuQydbCJmsDWbftJ5KhZdqfVolotjhLBZPWPOLuvFrke3y+LaBM/JqB9L11pNKm0LFO3uGk7AgihDBPiZdn/v1wrSDdd9WgTQJs0Cbrk/VgDBFCGucYtzUJgaxK25Rs1a65RX0wrd1wAAAoKSURBVLCTPCSzaa8YJl8RSlvJlXd9WZ5ZIn58VtSv9g8iyOOPBoRQSphpiic+KsM2pjmFPmVX/JqHE0AdGgE6jxwgv+6itWYgUN66b6KoVcVRdydYNMkiR0kkKfmq32vFitrls78s4mNiZ0TVv0NOTqtQPpmjM/wiRgil4Jn2PLGmiAaFFEAlTYKe0fP5OCmwYwqBFiJQOHHU3XeJOLLvV0eZqv+tbzV611s5wjeo0nkTtElCc70ET3duJjDblEvaozZa6LMTbigIoRRsb5Wxq8fK8i+53LJKRj3/FVl1iIttQ2wQQA3BzkMh8EECW4s+JtEj+8XLtT2B9j6A9PVeT7fZ8pWx7n719v1G+2KpdsCiQORpBfIEQigF2I0yYPMA6XRiNkcuOy7KYzTaymcx5alc2huxDs0rIgKUYj5hCoHeCWzdwm/LLvZLu1nOUcOp/giwDOaPZZ8tOf1Sr1Nfon7MP8lF371IbrjCpZNRRoO2CCA7xdhqV+StW1GNAQHkMimwgUBuAuXlmiQfxYSR/ZvoUW6u0TXQrj1aqhGgm6PrWYt2CCHk6FjXKtJWPPF7cvHgaTI7jpoc4QRQp0aA5mkO0NWOCDGDAASCENiad1SdtDsoyKNoNBQBW/Yy4WN1geL43RFqpBG2ixBycIolSU+V2R0OprJcxv7kTFk+0sU2qE1oAdQl83UhjDXroE6kcQhkJVDexp0sqbG8lhVj+PvsaBQ7ZX4lOUDhYff2BISQA/sfyNm3nS23nOFgKrNl6qCGRoMQQC5uwgYCBSZQzj9KhFKy3NaMZ6w1qw+TA3PvbPzuuGZF6LffCCEHnk/Jp//8aXl6l1qma2T4ayNkzb617IK9P0POLS9X+c0B2rIERgQomNtoGAJxENgaRarORTLBRB5SPgd16O3tlReRn3wsg9yNEKqB9Vq57IuXyZwHXeg37EwxE0BWY6JUTp70dSGAfJGkHQg0PYGtidpJJKl6qznRpO39axEfq5dk4sdOhSfnJ/L5jxCq4aAVMnrtaFl5VC0/WpL0AHmrXy07r++HEUDWxaX6mkwOkFdv0RgEWpxAecnNrqQAYfK1ujhhKzFIBI99rZzR1ooVtFvJZT2PBSFUw8eu54rVdct8SAHUX+XPNOEvmNb/7DNCCDSAwNbIkj27OqrUvZhho6NMJm6SzSDtFVBV1a9LyfcawJBH+iaAEOqDaJraQTfIRdf8ndxwpW8HbdceAigoXhqHAARiJVAuEdBb/bO+3us+oOojPnp4j2WsWGdAyH4hhPqg+2MZ9dwoWXVwLQcEXxabqacZb5a52o8javUl5ftLhQhQSmSYQwACEIBAKxFACPXhTdcjNVbK6EfHyMph3ifGFgE0Q9s9wXPbCCDPQGkOAhCAAASakwBCqBe/LZAJkybIQit0VfOaK5eeNUXm3lrT0NUgnABql36aAzRd1rh2BTsIQAACEIBAKxNACPXiXdciiq/Ifu/tL6/s6GWSIIC8YKQRCEAAAhCAgCsBhFAvpFzzg7wsiyGAXOcrdhCAAAQgAAGvBBBCveB0rSada7fYLBkomzQHqCTne/WqFfJiCcwzUpqDAAQgAIFWJIAQ6sWrXaKHSjhcc+Sy4y6XOQ85mG4zQQClwoUxBCAAAQhAIBQBhFAPZF0TpVNvmw8ngDo0qtSmsaWbQ00U2oUABCAAAQi0IgGEUA9e/Tc5874z5daRtRy+Voa9+TlZ+5FadoIAqokIAwhAAAIQgEAjCCCEeqDeLsNfHS5r9qnlkFvlzNVnya0n9mqHAKqFkPchAAEIQAACDSWAEOoBv+v5YgtlwuSJsnDeB5poK5+hM1Ffk/TVW1n4LI5nCSwLNe6BAAQgAAEI9EIAIdQNzCyZOnCqzO5wmTGzZeqgaTJ72wGl4QRQp+YATSIHyMUr2EAAAhCAAATcCSCEurFyTZTerpBiWAE0T/evzddU6OQkZHfvYgkBCEAAAhCAQJ8EEEIZhVA5Ubpt7QF6e4glMIsAIYD48EIAAhCAAAQCE0AIdQO8SMbfNF4Wf7MW9//5lYNe+vHnX7D8H585QAigWuB5HwIQgAAEIOCRAEKoG8xaW+eXfVakbYTIBp/yR3TZiwiQx2lNUxCAAAQgAAE3AgghRyEUSABJuRAiOUBusxUrCEAAAhCAgGcCCKEaQiiYABJZKv1VBE2TbbvOPDuX5iAAAQhAAAIQ6JsAQqgbn0dk2BvDZO0edx2iRYBGeV8Cs6chgPhUQgACEIAABCIhgBDqQQjdOHrtHouHevcQAsg7UhqEAAQgAAEI5COAEOrG79pDD/zj5We+uGs+rNvdjQDyCJOmIAABCEAAAj4JIIS60fza2B277j5skw/GKzQHaBI5QD5Q0gYEIAABCEAgDAGEUHeutocr39Uu/TQJerqsydcMd0MAAhCAAAQgEJoAQsifEEIAhZ6ttA8BCEAAAhDwTAAh1A3o8WcNePeBT3X+VQrOCKAUsDCFAAQgAAEIxEQAIdTNG6ce+4Xld3755193cBICyAESJhCAAAQgAIGYCSCEevDOmJMO+PWKY365V0+O2/1PO7+z8cPvjCIHKOZpTd8gAAEIQAACbgQQQr1wOu0Lxy14/YCnv/Gzg97c2UyOe363TaW39l/+wL8/ebYbWqwgAAEIQAACEIidAEIodg/RPwhAAAIQgAAEghFACAVDS8MQgAAEIAABCMROACEUu4foHwQgAAEIQAACwQgghIKhpWEIQAACEIAABGIngBCK3UP0DwIQgAAEIACBYAQQQsHQ0jAEIAABCEAAArETQAjF7iH6BwEIQAACEIBAMAIIoWBoaRgCEIAABCAAgdgJIIRi9xD9gwAEIAABCEAgGAGEUDC0NAwBCEAAAhCAQOwEEEKxe4j+QQACEIAABCAQjABCKBhaGoYABCAAAQhAIHYCCKHYPUT/IAABCEAAAhAIRgAhFAwtDUMAAhCAAAQgEDsBhFDsHqJ/EIAABCAAAQgEI4AQCoaWhiEAAQhAAAIQiJ0AQih2D9E/CEAAAhCAAASCEUAIBUNLwxCAAAQgAAEIxE4AIRS7h+gfBCAAAQhAAALBCCCEgqGlYQhAAAIQgAAEYieAEIrdQ/QPAhCAAAQgAIFgBBBCwdDSMAQgAAEIQAACsRNACMXuIfoHAQhAAAIQgEAwAgihYGhpGAIQgAAEIACB2AkghGL3EP2DAAQgAAEIQCAYAYRQMLQ0DAEIQAACEIBA7AQQQrF7iP5BAAIQgAAEIBCMAEIoGFoahgAEIAABCEAgdgIIodg9RP8gAAEIQAACEAhGACEUDC0NQwACEIAABCAQOwGEUOweon8QgAAEIAABCAQjgBAKhpaGIQABCEAAAhCInQBCKHYP0T8IQAACEIAABIIRQAgFQ0vDEIAABCAAAQjETgAhFLuH6B8EIAABCEAAAsEI/DeJhlduutJ1DQAAAABJRU5ErkJggg==', 'cache shape, group, layer, and stage': 'data:image/png;base64,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', 'crop and scale image' : 'data:image/png;base64,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', 'rotate wedge': 'data:image/png;base64,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', diff --git a/tests/js/unit/containerTests.js b/tests/js/unit/containerTests.js index a53d8f01..61f5a8af 100644 --- a/tests/js/unit/containerTests.js +++ b/tests/js/unit/containerTests.js @@ -541,9 +541,9 @@ Test.Modules.CONTAINER = { var textpath = new Kinetic.TextPath({ y: 35, - textStroke: 'black', - textStrokeWidth: 1, - textFill: 'orange', + stroke: 'black', + strokeWidth: 1, + fill: 'orange', fontSize: '18', fontFamily: 'Arial', text: 'The quick brown fox jumped over the lazy dog\'s back', diff --git a/tests/js/unit/shapes/lineTests.js b/tests/js/unit/shapes/lineTests.js index 8e058db4..9d7fa771 100644 --- a/tests/js/unit/shapes/lineTests.js +++ b/tests/js/unit/shapes/lineTests.js @@ -47,6 +47,87 @@ Test.Modules.LINE = { line.setPoints([73, 160, 340, 23]); test(line.getPoints()[0].x === 73, 'first point x should be 73'); }, + 'add curvy lines': function(containerId) { + var stage = new Kinetic.Stage({ + container: containerId, + width: 578, + height: 200 + }); + var layer = new Kinetic.Layer(); + + var line1 = new Kinetic.Line({ + points: [{ + x: 73, + y: 160 + }, { + x: 340, + y: 23 + }, { + x: 500, + y: 109 + }, { + x: 300, + y: 109 + }], + stroke: 'blue', + strokeWidth: 10, + lineCap: 'round', + lineJoin: 'round', + draggable: true, + spline: 1 + }); + + var line2 = new Kinetic.Line({ + points: [{ + x: 73, + y: 160 + }, { + x: 340, + y: 23 + }, { + x: 500, + y: 109 + }], + stroke: 'red', + strokeWidth: 10, + lineCap: 'round', + lineJoin: 'round', + draggable: true, + spline: 1 + }); + + var line3 = new Kinetic.Line({ + points: [{ + x: 73, + y: 160 + }, { + x: 340, + y: 23 + }], + stroke: 'green', + strokeWidth: 10, + lineCap: 'round', + lineJoin: 'round', + draggable: true, + spline: 1 + }); + + layer.add(line1); + layer.add(line2); + layer.add(line3); + stage.add(layer); + + /* + line.transitionTo({ + spline: 3, + duration: 3 + }); + */ + + //console.log(layer.toDataURL()); + warn(layer.toDataURL() === dataUrls['curvy lines'], 'problem with curvy lines'); + + }, 'add dashed line': function(containerId) { var stage = new Kinetic.Stage({ container: containerId, @@ -95,5 +176,5 @@ Test.Modules.LINE = { test(line.getPoints().length === 4, 'line should have 4 points'); - } + } };