diff --git a/demos/kitchensink/assets/104.svg b/demos/kitchensink/assets/104.svg
new file mode 100644
index 00000000..34058b4c
--- /dev/null
+++ b/demos/kitchensink/assets/104.svg
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/demos/kitchensink/assets/105.svg b/demos/kitchensink/assets/105.svg
new file mode 100644
index 00000000..e382ea35
--- /dev/null
+++ b/demos/kitchensink/assets/105.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/demos/kitchensink/assets/106.svg b/demos/kitchensink/assets/106.svg
new file mode 100644
index 00000000..f6ffbc30
--- /dev/null
+++ b/demos/kitchensink/assets/106.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/demos/kitchensink/assets/107.svg b/demos/kitchensink/assets/107.svg
new file mode 100644
index 00000000..0038a007
--- /dev/null
+++ b/demos/kitchensink/assets/107.svg
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/demos/kitchensink/index.html b/demos/kitchensink/index.html
index be4ea8ee..a1b1f89e 100644
--- a/demos/kitchensink/index.html
+++ b/demos/kitchensink/index.html
@@ -80,10 +80,7 @@
-->
-
-
-
-
+
@@ -153,8 +150,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dist/all.js b/dist/all.js
index 4195d130..ebd1f3a3 100644
--- a/dist/all.js
+++ b/dist/all.js
@@ -8434,6 +8434,111 @@ fabric.util.animate = animate;
(function(global) {
+ function drawArc(ctx, x, y, coords) {
+ var rx = coords[0];
+ var ry = coords[1];
+ var rot = coords[2];
+ var large = coords[3];
+ var sweep = coords[4];
+ var ex = coords[5];
+ var ey = coords[6];
+ var segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);
+ for (var i=0; i 1) {
+ pl = Math.sqrt(pl);
+ rx *= pl;
+ ry *= pl;
+ }
+
+ var a00 = cos_th / rx;
+ var a01 = sin_th / rx;
+ var a10 = (-sin_th) / ry;
+ var a11 = (cos_th) / ry;
+ var x0 = a00 * ox + a01 * oy;
+ var y0 = a10 * ox + a11 * oy;
+ var x1 = a00 * x + a01 * y;
+ var y1 = a10 * x + a11 * y;
+
+ var d = (x1-x0) * (x1-x0) + (y1-y0) * (y1-y0);
+ var sfactor_sq = 1 / d - 0.25;
+ if (sfactor_sq < 0) sfactor_sq = 0;
+ var sfactor = Math.sqrt(sfactor_sq);
+ if (sweep == large) sfactor = -sfactor;
+ var xc = 0.5 * (x0 + x1) - sfactor * (y1-y0);
+ var yc = 0.5 * (y0 + y1) + sfactor * (x1-x0);
+
+ var th0 = Math.atan2(y0-yc, x0-xc);
+ var th1 = Math.atan2(y1-yc, x1-xc);
+
+ var th_arc = th1-th0;
+ if (th_arc < 0 && sweep == 1){
+ th_arc += 2*Math.PI;
+ } else if (th_arc > 0 && sweep == 0) {
+ th_arc -= 2 * Math.PI;
+ }
+
+ var segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));
+ var result = [];
+ for (var i=0; i 1) {
+ pl = Math.sqrt(pl);
+ rx *= pl;
+ ry *= pl;
+ }
+
+ var a00 = cos_th / rx;
+ var a01 = sin_th / rx;
+ var a10 = (-sin_th) / ry;
+ var a11 = (cos_th) / ry;
+ var x0 = a00 * ox + a01 * oy;
+ var y0 = a10 * ox + a11 * oy;
+ var x1 = a00 * x + a01 * y;
+ var y1 = a10 * x + a11 * y;
+
+ var d = (x1-x0) * (x1-x0) + (y1-y0) * (y1-y0);
+ var sfactor_sq = 1 / d - 0.25;
+ if (sfactor_sq < 0) sfactor_sq = 0;
+ var sfactor = Math.sqrt(sfactor_sq);
+ if (sweep == large) sfactor = -sfactor;
+ var xc = 0.5 * (x0 + x1) - sfactor * (y1-y0);
+ var yc = 0.5 * (y0 + y1) + sfactor * (x1-x0);
+
+ var th0 = Math.atan2(y0-yc, x0-xc);
+ var th1 = Math.atan2(y1-yc, x1-xc);
+
+ var th_arc = th1-th0;
+ if (th_arc < 0 && sweep == 1){
+ th_arc += 2*Math.PI;
+ } else if (th_arc > 0 && sweep == 0) {
+ th_arc -= 2 * Math.PI;
+ }
+
+ var segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));
+ var result = [];
+ for (var i=0; i